Что нового

[Процессы] Избавиться от мерцания главного окна при выполнении скрипта

freed21

Новичок
Сообщения
39
Репутация
1
Снова всем привет.. Вот моё маленькое детище, задача которого поиск заданного слова в информации WhoIs по заданному диапазону ip адресов.
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiRichEdit.au3>
#Include <Encoding.au3>


#Region ### START Koda GUI section ### Form=
$MainForm = GUICreate("Word in WhoIs", 395, 340, 340, 147)
$Group1 = GUICtrlCreateGroup("", 8, 8, 377, 321)
$Label1 = GUICtrlCreateLabel("Введите границы диапазона IP-адресов", 16, 24, 206, 17)
$IPMin = _GUICtrlIpAddress_Create($MainForm, 16, 48, 154, 21)
_GUICtrlIpAddress_Set($IPMin, "0.0.0.0")
$IPMax = _GUICtrlIpAddress_Create($MainForm, 224, 48, 154, 21)
_GUICtrlIpAddress_Set($IPMax, "0.0.0.0")
$Label2 = GUICtrlCreateLabel("<->", 191, 48, 19, 17)
$Label3 = GUICtrlCreateLabel("Введите слово, которое будем искать", 16, 80, 198, 17)
$InputWord = GUICtrlCreateInput("Слово", 16, 104, 281, 21)
$ButtonFind = GUICtrlCreateButton("Искать!", 304, 104, 75, 25, $WS_GROUP)
$ProgressFind = GUICtrlCreateProgress(18, 168, 358, 17)
$Label4 = GUICtrlCreateLabel("Информация о поиске", 136, 136, 118, 17)
$InfoFind = _GUICtrlRichEdit_Create($MainForm ,"", 16, 200, 361, 113, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL,$ES_READONLY))
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Global $gWord, $dif, $ipMass

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $ButtonFind
			$hWord = GUICtrlRead($InputWord)
			$ipMass=int2mass()
			_read_cmd()
	EndSwitch
WEnd

Func int2mass()
	_GUICtrlRichEdit_AppendText($InfoFind, 'Создание списка ip адресов...'&@CR)
	$start = _GUICtrlIpAddress_Get($IPMin)
	$end = _GUICtrlIpAddress_Get($IPMax)
	$long_start=ip2int($start)
	$long_end=ip2int($end)
	$dif=$long_end-$long_start
	Dim $ipMass[$dif+1]
	$percent = 100/$dif
	For $i = 0 To  $dif
		$ipMass[$i]=int2ip($long_start+$i)
		GUICtrlSetData($ProgressFind, $percent*$i)
	Next
	_GUICtrlRichEdit_SetCharAttributes($InfoFind, "+bo")
	_GUICtrlRichEdit_AppendText($InfoFind, 'Список из '&$dif&' адресов создан!'&@CR)
	return $ipMass
EndFunc

Func ip2int($realIp)
	Local $ipoct = StringSplit($realIp,'.',2)
	Local $oct1 = $ipoct[0]
	Local $oct2 = $ipoct[1]
	Local $oct3 = $ipoct[2]
	Local $oct4 = $ipoct[3]
	Return $oct1*16777216+$oct2*65536+$oct3*256+$oct4
EndFunc

Func int2ip($intIp)
	Local $oct1n = Int($intIp/16777216)
	Local $oct2n = Int(($intIp-$oct1n*16777216)/65536)
	Local $oct3n = Int(($intIp-$oct1n*16777216-$oct2n*65536)/256)
	Local $oct4n = Int($intIp-$oct1n*16777216-$oct2n*65536-$oct3n*256)
	Return $oct1n & '.' & $oct2n & '.' & $oct3n & '.' & $oct4n
EndFunc


Func _read_cmd()
	$percent = 100/$dif
	GUICtrlSetData($ProgressFind, 0)
	_GUICtrlRichEdit_AppendText($InfoFind, 'Поиск слова '&$hWord&' в информации об ip адресах...'&@CR)
	$command = "whosip -r "
	$sBuffer = ''
	For $i = 0 To  $dif
		$iPID = Run(StringReplace($command&$ipMass[$i], '"', '""'), @ScriptDir, $GUI_NOFOCUS, 2)
		;WinWaitActive('cmd.exe', '', 1)
		If Not $iPID Then Exit -33
		While 1
			$sBuffer = StdoutRead($iPID)
			If @error Then
				ExitLoop
			EndIf
			If $sBuffer Then
				_GUICtrlRichEdit_AppendText($InfoFind, $ipMass[$i])
				if StringRegExp($sBuffer, '\W'&$hWord&'\W') then
					_GUICtrlRichEdit_SetCharAttributes($InfoFind, "+bo")
					_GUICtrlRichEdit_AppendText($InfoFind,'  -- YES'&@CR)
				else
					_GUICtrlRichEdit_AppendText($InfoFind,'  -- NO'&@CR)
				Endif
				GUICtrlSetData($ProgressFind, $percent*$i)
			EndIf
		WEnd
		ProcessClose($iPid)
	Next
EndFunc


Но вот незадача.. постоянный вызов командной строки для операции Whois заставляет постоянно переключаться с главного окна на консоль и с консоли на главное окно обратно, что приводит к мерцанию главного окна и невозможности поставить скрипт на выполнение и работать в другой программе. Помогите мне справиться с этим недугом, друзья, с меня плюсы :smile:

PS: для того чтобы выполнялась сторонняя команда Whosip нужно файлик http://www.nirsoft.net/utils/whosip.zip закинуть в папку system32.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432

beliy

Продвинутый
Сообщения
372
Репутация
72
также попробуйте

Код:
GUICtrlSetData($ProgressFind, $percent*$i)


Заменить на (не тестил, но возможно поможет с мерцаниями):


Код:
$iSec = 0
; ...
If @SEC <> $iSec Then
         $iSec = @SEC
         GUICtrlSetData($ProgressFind, $percent*$i)
EndIf
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
За теги извиняюсь.. Код вставляю в сообщения не часто, поэтому ошибся с тегами. Насчет GUI_NOFOCUS, это я просто пробовал все варианты, забыл обратно изменить, так там всегда было HIDE, но все равно мерцание оставалось. :(


Добавлено:
Сообщение автоматически объединено:

beliy, мерцания все равно остаются.. :( Да и не совсем понял что за переменная такая $iSec и за что она отвечает.
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Мерцания бывают, когда данные в окне обновляются очень часто. Для того что б избежать этого используют либо sleep либо то что я предложил.

Попробуйте вместо:
Код:
If $sBuffer Then
            _GUICtrlRichEdit_AppendText($InfoFind, $ipMass[$i])
            if StringRegExp($sBuffer, '\W'&$hWord&'\W') then
               _GUICtrlRichEdit_SetCharAttributes($InfoFind, "+bo")
               _GUICtrlRichEdit_AppendText($InfoFind,'  -- YES'&@CR)
            else
               _GUICtrlRichEdit_AppendText($InfoFind,'  -- NO'&@CR)
            Endif
            GUICtrlSetData($ProgressFind, $percent*$i)
         EndIf

поставить:
Код:
If $sBuffer Then
            If @SEC <> $iSec Then
              $iSec = @SEC
              _GUICtrlRichEdit_AppendText($InfoFind, $ipMass[$i])
              if StringRegExp($sBuffer, '\W'&$hWord&'\W') then
                _GUICtrlRichEdit_SetCharAttributes($InfoFind, "+bo")
                _GUICtrlRichEdit_AppendText($InfoFind,'  -- YES'&@CR)
             else
                _GUICtrlRichEdit_AppendText($InfoFind,'  -- NO'&@CR)
             Endif
             GUICtrlSetData($ProgressFind, $percent*$i)
           EndIf
         EndIf
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
Beliy, вы попробуйте запустить мой скрипт :smile: там дело не в постоянном обновлении какого то элемента, а в том что скрипт постоянно вызывает командную строку, поэтому фокус идет сначала на нее, потом на главное окно скрипта. И так много раз (в зависимости от заданного диапазона ip). Из за этого создается эффект мерцания (вовсе не такой как при непрерывном обновлении,например, элемента edit) :smile:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Так?
Код:
$hGUI = GUICreate('тест',300,300,0,0)
GUISetState()

_API_LockSetForegroundWindow(1)
For $i = 1 To 5
	Run('calc.exe')
	Sleep(1000)
Next
_API_LockSetForegroundWindow(2)

Sleep(5000)


Func _API_LockSetForegroundWindow($nLockCode)
;~ 	1 Lock Foreground Window Focus, 2 Unlock Foreground Window Focus
	Local $aRet = DllCall("user32.dll", "bool", "LockSetForegroundWindow", "uint", $nLockCode)
	If @error Or $aRet[0] Then Return SetError(1, 0, 0)
	Return $aRet[0]
EndFunc   ;==>__IELockSetForegroundWindow
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
freed21,

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.






InnI, beliy, inververs,
Господа! Если Вы будете отвечать в темах, где очевидно нарушены правила, то попадете под наблюдение для начала, а дальше ... :mad:
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
Извиняюсь за неправильные теги, вроде поправил. inververs, очень хорошая подсказка :smile: Попробовал как работает твой код, очень похоже на решение того, что меня мучает, щас буду более тщательно в нем разбираться, но по любому за помощь огромный и жирный плюсъ тебе :ok:
 
Верх