Что нового

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

kaster

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

ZanMax

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

Yashied

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

:smile:

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

kaster

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