Что нового

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

Strog

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

dwerf

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

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

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
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,878
Репутация
1,194
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,878
Репутация
1,194
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
 
Верх