Что нового

Передача параметров для зависшего окна

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Суть:
Скрипт запускает некую программу а.ехе, в которой есть элементы типа кнопки, поля и прочее. Скрипт начинает посылать команды элементам этого окна - нажатие кнопок, заполнение полей, и т.д.
Одним из полей является путь до большого текстового файла, после которого а.ехе начинает его обрабатывать. Т.к. файл очень большой, это занимает некоторое время в течении которого прога перестает реагировать на другие команды. Можно было ставить слип, но дело в том, что время "зависания" проги зависит от размера передаваемого текстового файла, которые может быть произвольным.
Как иначе можно отследить, когда прога закончит обрабатывать файл и будет готов принимать команды от скрипта, помимо слипа?
Спасибо
 

ZanMax

Тестер
Сообщения
120
Репутация
5
Проверять размер файла и выставлять жадержку.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Ту много вариантов. Самый простой - опрашивать состояние кокого-нибудь элемента (например той же кнопки). Ведь во время обработки файла она скорее всего становится серая (ну или не кнопки, а Inputbox'а). Когда кнопка снова станет доступна, то вот оно, время пришло.

:smile:

Смотри в справке функцию ControlEnable() для этого.
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
В том-то и дело, окно уже не отвечает ни на какие запросы.
Единственное, процесс обработки грузит камень примерно на 20-30%.
Думал мониторить загрузку камня конкретным процессом, но не нашел как :(
 

amel27

Продвинутый
Сообщения
146
Репутация
55
kaster сказал(а):
В том-то и дело, окно уже не отвечает ни на какие запросы.

Вы уверены?.. Вот пример для WinWord - диспетчер показывает висяк, но оконная процедура отвечает, т.к. приложение многопотоковое:

Код:
$hWnd = ControlGetHandle("[CLASS:OpusApp]", "", "[CLASS:_WwG]")
While 1
	ConsoleWrite(_ProcessIsHang($hWnd) &@CRLF)
	Sleep(500)
WEnd

Func _ProcessIsHang($hWnd, $iSleep = 1000)
	Local $aResult = DllCall("user32.dll", "int", "SendMessageTimeout", _
		"hwnd", $hWnd, "int", 0, "ptr", 0, "ptr", 0, "uint", 3, "uint", $iSleep, "ptr", 0)
	Return ($aResult==0)
EndFunc


Статья на MSDN: How To Detect If an Application Has Stopped Responding

P.S. кста еще вариант - проверять занят ли файл, т.е. пытаться открыть его на запись

P.P.S. Еще один способ - использовать WinGet*, ControlGet* ф-ции на предмет возвращаемых значений
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Да. Уверен. Програмка самописня на VC.
Узнаю что прога висит по тому, что после переключения между окнами графика не перерисовывается. А в зоголовке окна появляются заветные Not Responding.
Но прога в это время честно обрабатывает файл...
Вобщем, я решил не заморачиваться, т.к. мало времени, да и лишний раз кликнуть на минимизировать окно не проблема.
Всем спасибо за участие :ok:
PS: кстати, почему окно тем не менее реагирует на нажатия на системные кнопки? :smile:
 
Верх