Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.141.47.163] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Всем привет=)
Как узнать, висит ли консольное окно или нет. Допустим для GUI это так: function IsHungAppWindow(Handle: THandle): Boolean; type TIsHungAppWindow = function(Handle: THandle): Boolean; stdcall; var IsHungAppWindow: TIsHungAppWindow; begin Result := False; IsHungAppWindow := GetProcAddress(GetModuleHandle('user32.dll'), 'IsHungAppWindow'); if Assigned(IsHungAppWindow) then Result := IsHungAppWindow(Handle); end; как быть с консольным окном? |
Сообщ.
#2
,
|
|
|
Ты понимаешь, что это эвристика?
|
Сообщ.
#3
,
|
|
|
А как это делает Windows?
|
Сообщ.
#4
,
|
|
|
Например получение Дескриптора окна консоли так...
procedure TForm1.Button1Click(Sender: TObject); var info : TOSVersionInfo; ClassName : string; Title : string; begin {Проверяем - Win95 или NT.} info.dwOSVersionInfoSize := sizeof(info); GetVersionEx(info); if (info.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin ClassName := 'ConsoleWindowClass'; Title := 'Command Prompt'; end else begin ClassName := 'tty'; Title := 'MS-DOS Prompt'; end; ShowMessage(IntToStr(FindWindow(PChar(ClassName), PChar(Title)))); end; Потом можно попробовать вашим методом. Не проверял но задел есть... |
Сообщ.
#5
,
|
|
|
Ну допустим дискриптор окна я получаю при помощи createprocess и AttachConsole.
Как cделать проверку на работоспособность запущенной консольной программы? Для GUI окон я привёл код, и он работает с GUI окнами, с консолями всеравно пишет что программа работает, хатя на самом деле это не так. |
Сообщ.
#6
,
|
|
|
Ahell
А консольная программа написанна самим. Или она совсем "сторонняя"? если самим то создать флаг который должен обновляться через определенный период. Кодом проверять все ли в порядке. Наподобие как в TASKах языка программирования ADA. Добавлено Попробуйте вызвать функцию наподобие GetWindowRect()/SetWindowRect()? Или подобные оконные функции.. И что она возращает? Конечно способ деревянный. Но мне кажеться что должен сработать. |
Сообщ.
#7
,
|
|
|
Самого очень интересует этот вопрос, однако для произвольной программы решения не нашел. К тому же прога может повиснуть, а может и запрашивать ввод, например. Возможно, во втором случае как-то поможет получение total time процесса?
|
Сообщ.
#8
,
|
|
|
А можно прояснить суть вопроса? Что значит "программа висит"?
|
Сообщ.
#9
,
|
|
|
Видимо, что зациклилась. Однако для консольного приложения, как мне кажется, разницы между while true do и ReadLn(s) никакой.
|
Сообщ.
#10
,
|
|
|
Цитата Fr0sT @ Видимо, что зациклилась. Однако для консольного приложения, как мне кажется, разницы между while true do и ReadLn(s) никакой. Разница исключительно в том, что вместо TRUE вызывается функция, которая вычисляет значение логического выражения. Причем, последнее - TRUE. Только одна из входящих в выражение величин может быть изменена посредством аппаратного прерывания. Не думаю, чтобы эту ситуацию можно каким-либо образом отличить от "истинного" зацикливания. Разве что послать что-нибудь на стандартное устройство ввода. Т.е. пока не нажмешь клавишу, все равно не поймешь, программа висит или ожидает ввода. |
Сообщ.
#11
,
|
|
|
А допустим программно ввести сообщение в консольное окно, и прочитать то, что введено. Если не получилось значит процесс висит. Такое возможно?
|
Сообщ.
#12
,
|
|
|
Я тебе советую по переулкам ходить оглядываясь.
|
Сообщ.
#13
,
|
|
|
Ahell, не обязательно, процесс может что-то усиленно переваривать.
|
Сообщ.
#14
,
|
|
|
Цитата Ahell @ А допустим программно ввести сообщение в консольное окно, и прочитать то, что введено. Если не получилось значит процесс висит. Такое возможно? А какой в этом смысл? Для конкретного приложения заранее известно, будет ли оно ожидать ввода и, как правило, что именно нужно вводить. Если нужно обеспечить прохождение этого приложения, то ввод можно осуществить заранее. Для _любого_ же приложения подобные манипуляции представляются бессмысленными. Не лучше ли сформулировать конкретную задачу? Вполне может оказаться, что она имеет другое гораздо более логичное решение. |
Сообщ.
#15
,
|
|
|
Цитата Ahell @ А как это делает Windows? Замечу что в Windows понятие звучит не как "приложение зависло", а как "не отвечает", т.е. окна (пользовательский интерфейс) не отвечает на сообщения которые ему посылают (обычно это какой-нить WM_CLICK, т.е. действия пользователя), в msdn это рекомендуют делать при помощи функции SendMessageTimeout и сообщения WM_NULL. В GUI приложениях окна создаются программистом и имеют свой WndProc и если оно не отвечает значит программист где-то накасячил. В консольном приложении обычно есть всего одно окно - консоль и у него свой системный WndProc который всегда отвечает на сообщения, независимо от того в каком состоянии находится само приложение. |