Что нового

[Автоматизация] GUI , Жуткие тормоза с Рic и ListView

Strog

Новичок
Сообщения
22
Репутация
0
Здравствуйте жители форума,
Моя задача состоит на этом этапе как можно ускорить программу, а именно есть проблемы
с элементом Picture и ListView.
Все алгоритмы работают в приемлемых рамках скорости, а вот отображение картинок (массив 6*6) с каждым разом затрудняется и тормозит , я так понимаю накладываются слои друг на друга .Можно как нибудь перед отображением новых картинок удалять предыдущие, а то у меня не получается.А быстрей будет рисовать функцией Graphic или по скорости одинакого?
А вот с ListView нужно очистить все содержащие значения, а то накапливается по 200 строк очень не удобно.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
В справке:
Функции для рисования: _GDIPlus_*
Функции для ListView: _GUICtrlListView_* (возможно _GUICtrlListView_DeleteAllItems)

Без кода больше ничего сказать не могу.
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Strog
Очищаю ListView так:

Код:
Func _Clear()
	$Count=_GUICtrlListView_GetItemCount($hListView)
	If $Count<>0 Then
		For $i = $Count-1 to 0 Step -1
			_GUICtrlListView_DeleteItem($hListView, $i)
		Next
	EndIf
EndFunc


dwerf
_GUICtrlListView_DeleteAllItems у меня при тестах не работала

Strog
Для удаления элементов, так:

Код:
For $i = 1 to $aPic[0][0]
	GUICtrlDelete($aPic[$i][0])
Next


Обычно создаю идентификаторы в массив, если они идентичны, в первой колонке идентификатор, во второй имя в следующих координаты, цвет, состояние и т.д.

Присмотрелся более внимательно, у тебя картинки под номерами, и как я понимаю они просто меняют положение видимо. В таком случае правильнее будет перемещать элементы используя GUICtrlSetPos с ключевыми словами Default.
 
Автор
S

Strog

Новичок
Сообщения
22
Репутация
0
dwerf
_GUICtrlListView_DeleteAllItems
спасибо работает

AZJIO
Присмотрелся более внимательно, у тебя картинки под номерами, и как я понимаю они просто меняют положение видимо. В таком случае правильнее будет перемещать элементы используя GUICtrlSetPos с ключевыми словами Default.
Нет номера статичны, а вот цвета меняются .
Обычно создаю идентификаторы в массив, если они идентичны, в первой колонке идентификатор, во второй имя в следующих координаты, цвет, состояние и т.д.
А с массивом идею понял ,а как сделать нет вот функция которая на основе массива создаёт массив картинок
Код:
Func _ColorMassivPrint()
	If  $a_Pole[$i][$j] == 0 Then
Else
	If  $a_Pole[$i][$j] == 1 Then
  GUICtrlCreatePic("0001.jpg",20+$j*43,25+$i*43, 41,41)
Else 
	If  $a_Pole[$i][$j] == 2 Then
	GUICtrlCreatePic("0002.jpg",20+$j*43,25+$i*43, 41,41)
Else
	If  $a_Pole[$i][$j] == 3 Then
	GUICtrlCreatePic("0003.jpg",20+$j*43,25+$i*43, 41,41)
Else
	If  $a_Pole[$i][$j] == 4 Then
    GUICtrlCreatePic("0004.jpg",20+$j*43,25+$i*43, 41,41)
Else
	If  $a_Pole[$i][$j] == 5 Then
    GUICtrlCreatePic("0005.jpg",20+$j*43,25+$i*43, 41,41)
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Strog
dwerf
Цитата
_GUICtrlListView_DeleteAllItems
спасибо работает
У меня было два ListView, поэтому возможно не работало, а ещё так делал:
Код:
#include <ListViewConstants.au3>
GUICtrlSendMsg($hListView, $LVM_DELETEALLITEMS, 0, 0)


А с массивом идею понял ,а как сделать нет вот функция которая на основе массива создаёт массив картинок
Во первых думаю лучше так сделать:

Код:
Func _ColorMassivPrint()
	Switch $a_Pole[$i][$j]
		Case 1
			GUICtrlCreatePic("0001.jpg", 20 + $j * 43, 25 + $i * 43, 41, 41)
		Case 2
			GUICtrlCreatePic("0002.jpg", 20 + $j * 43, 25 + $i * 43, 41, 41)
		Case 3
			GUICtrlCreatePic("0003.jpg", 20 + $j * 43, 25 + $i * 43, 41, 41)
		Case 4
			GUICtrlCreatePic("0004.jpg", 20 + $j * 43, 25 + $i * 43, 41, 41)
		Case 5
			GUICtrlCreatePic("0005.jpg", 20 + $j * 43, 25 + $i * 43, 41, 41)
		; Case Else
			; MsgBox(0, 'Message', 'Пример для Else, но у нас то нет действий на этот случай, значит убираем это')
	EndSwitch
EndFunc   ;==>_ColorMassivPrint


На счёт как сделать, не пойму что непонятно?
Создаём массив нужной размерности, например

Код:
GUICreate('My Program', 250, 260)

Global $aPic[37][5]
$aPic[0][0]=36
For $i = 1 to $aPic[0][0]
	Switch $i
		Case 1 To 6
			$j=0
		Case 7 To 12
			$j=1
		Case 13 To 18
			$j=2
		Case 13 To 18
			$j=3
		Case 19 To 24
			$j=4
		Case 25 To 30
			$j=5
		Case 31 To 36
			$j=6
	EndSwitch
	$aPic[$i][0]=GUICtrlCreatePic("000"&$i&".jpg", 20 + $j * 43, 25 + $i * 43, 41, 41)
Next
GUISetState ()
While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case -3
			 Exit
	EndSwitch
WEnd


мне сейчас нет времени делать качествунный полный пример, но заполнил первую колонку под индексом 0 идентификаторам, другие заполняйте как требуется для алгоритма. Индексы соответсвуют номерам, но можно добавить колонку номеров-позиций, в которой будет соответствие положения. Возможно удобней будет сделать массив 6x6 для сохранения положения, это уже от алгоритма зависит.
 
Автор
S

Strog

Новичок
Сообщения
22
Репутация
0
AZJIO
Во первых думаю лучше так сделать:
Как это сделал (заодно костыли убрал), сразу порог "тормозов" увеличился в 2,5 раза! А с удалением буду возиться.
Всем спасибо задача решена.
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Strog
Вот более рабочий пример, показывающий как меняются местами две картинки. Имена от 0001.jpg до 0036.jpg.

Код:
Global $aPic[37][5]
$aPic[0][0]=36

GUICreate('My Program', 300, 330)
$hStart=GUICtrlCreateButton('Start', 10, 10, 120, 22)
For $i = 1 to $aPic[0][0]
	Switch $i
		Case 1 To 6
			$x=20 + 0 * 43
			$y=$i * 43+25
		Case 7 To 12
			$x=20 + 1 * 43
			$y=$i * 43-6 * 43+25 ; эти вычисления сразу подсчитать
		Case 13 To 18
			$x=20 + 2 * 43
			$y=$i * 43-12 * 43+25
		Case 19 To 24
			$x=20 + 3 * 43
			$y=$i * 43-18 * 43+25
		Case 25 To 30
			$x=20 + 4 * 43
			$y=$i * 43-24 * 43+25
		Case 31 To 36
			$x=20 + 5 * 43
			$y=$i * 43-30 * 43+25
	EndSwitch
	$aPic[$i][0]=GUICtrlCreatePic(StringFormat("%04s", $i)&".jpg", $x, $y, 41, 41)
	$aPic[$i][1]=$x
	$aPic[$i][2]=$y
Next
GUISetState ()
While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case $hStart
			$L=Random(1, 36, 1)
			$K=Random(1, 36, 1)
			If $L<>$K Then
				GUICtrlSetPos($aPic[$L][0], $aPic[$K][1], $aPic[$K][2])
				GUICtrlSetPos($aPic[$K][0], $aPic[$L][1], $aPic[$L][2])
				$tmp=$aPic[$L][0]
				$aPic[$L][0]=$aPic[$K][0]
				$aPic[$K][0]=$tmp
				GUICtrlSetData($hStart, $L&' <-> '&$K)
			Else
				GUICtrlSetData($hStart, $L&' = '&$K)
			EndIf
		Case -3
			 Exit
	EndSwitch
WEnd
 
Верх