Форум: "WinAPI";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];
ВнизСостояние чужого процесса Найти похожие ветки
← →
tiam (2003-06-26 08:12) [0]Добрый день.
Есть некоторое приложение в котором выполняется длительный скл-запрос. Нужно из другого приложения получить состояние первого приложения. Т.е. узнать, закончил выполняться запрос или нет.
Каким образом, есть ли готовые апишные функции?
Спасибо
← →
Digitman (2003-06-26 08:57) [1]никаким образом, если контролируемое приложение не разрабатывалось с учетом возможности извещать о своем состоянии иные(контролирующие) приложения
← →
tiam (2003-06-26 09:12) [2]А ведь диспетчер задач Windows в таком случае показывает, что приложение "Не отвечает". Неужели никак нельзя получить эту информацию от самой системы?
А получить хотя бы состояние курсора мышки в чужом приложении?
← →
Игорь Шевченко (2003-06-26 09:25) [3]Диспетчер задач показывает, что приложение "не отвечает" если приложение в течении 5 секунд не выбрало сообщение из очереди.
← →
tiam (2003-06-26 09:28) [4]т.е. это можно отследить в другом приложении?
← →
Digitman (2003-06-26 09:29) [5]
> диспетчер задач Windows в таком случае показывает, что приложение
> "Не отвечает".
разумеется ! если используются синхронные вызовы БД-драйвера, то в момент их исполнения win-сообщения не обрабатываются.
> Неужели никак нельзя получить эту информацию от самой системы?
>
какую информацию-то ? о прогрессе выполнения сиквел-запроса к СУБД ? а откуда системе известно о том, что приложение обращается к какой-то СУБД, не являющейся частью ее стандарта ?
← →
tiam (2003-06-26 09:40) [6]Но можно же проверить, что сообщения не обрабатываются?
← →
Digitman (2003-06-26 10:01) [7]можно, конечно) ... см., к примеру, SendMessageTimeout()
но разве это факт того, что в этот момент выполняется именно сиквел-запрос ?
← →
sapsi (2003-06-26 10:08) [8]предположим, что приложение больше ничего и не делает....
мне надо знать просто, что оно закончило выполнять этот запрос, освободилось.
← →
sapsi (2003-06-26 10:09) [9]Tiam, как я понимаю, об этом и спрашивает
← →
Digitman (2003-06-26 10:22) [10]ну так и воспользуйся тем самым SendMessageTimeout() !)
на то и вызов этот предназначен)... единственное, что ограничивает его использование - д.б. известен хэндл целевого окна
консольному процессу, не создавшему ни единого окна в ходе работы, разумеется, адресовать оконное сообщение не получится
← →
tiam (2003-06-26 10:50) [11]Спасибо
← →
tiam (2003-06-26 10:58) [12]Про функцию SendMessageTimeout написано следующее, что если 5-й параметр: UINT fuFlags
я поставлю флаг SMTO_ABORTIFHUNG, то функция не ждет ответа приложения в течение тайм аута, высталяемого в 6-м параметре.
а есть еще 7-й параметр, результат - lpdwResult, который возвращает value for synchronous call.
Что туда нужно передавать, если не секрет?
← →
tiam (2003-06-26 11:10) [13]Digitman, пожалуйста, подскажите.
← →
Digitman (2003-06-26 11:32) [14]адрес переменной типа DWORD, в которую, в случае обработанного вовремя сообщения, будет записан результат обработки (это то же самое, что возвращает SendMessage)
← →
tiam (2003-06-26 11:57) [15]А где почитать про возможные результаты.
Что запишется в эту переменную в случае занятости?
← →
Digitman (2003-06-26 12:11) [16]
> почитать про возможные результаты
это зависит от посылаемого сообщения и обрабатывается ли таковые целевым окном вообще
> Что запишется в эту переменную в случае занятости
ничего.
а зачем это нужно ? ты ведь определил факт занятости, и этого согласно условиям достаточно , значит, задача твоя решена)
← →
tiam (2003-06-26 12:24) [17]Приложение не ответит ни на какое сообщение?
Т.е. функция вернет false?
Посылаю, например, wm_acivate
← →
Digitman (2003-06-26 12:52) [18]
> Приложение не ответит ни на какое сообщение?
> Т.е. функция вернет false?
ну почему же сразу "ни на какое" ?)... не ответит только тот кодовый поток который создал окно (которому ты посылаешь сообщение) и в момент посылки тобой сообщения вместо выборки этого сообщения занят совсем иным, например, исполнением тела какой-нибудь блокирующей ф-ции.
ясно же написано :
Return Values
If the function succeeds, the return value is TRUE.
If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
← →
tiam (2003-06-26 13:31) [19]но какое сообщение лучше посылать для проверки?
Правильно ли написать так:
var
H : HWND;
( nil, "mainform") но какое сообщение лучше посылать для проверки?
Правильно ли написать так:
var
H : HWND;
m: dword;
H := FindWindow (nil, "mainform");
if SendMessageTimeout(H, WM_activate, 0, 0,SMTO_ABORTIFHUNG,0,m)<>0 then showmessage(".....");
Сообщение показывается только если окно, которому посылаем, отвечает, если же не отвечает, то эта функция не отрабатывает.
Т.е. дальнейший код не выполняется.
Что не так?
← →
tiam (2003-06-26 13:52) [20]Спасибо, уже понял сам, надо таймаут указывать ненулевой.
← →
Digitman (2003-06-26 13:57) [21]if SendMessageTimeout(H, WM_USER, 0, 0,SMTO_ABORTIFHUNG,время_в_миллисекундах,m)<>0 then showmessage(".....");
← →
tiam (2003-06-27 11:23) [22]Если в приложении используется Processmessages, то оно обработает SendMessageTimeout.
Можно ли узнать состояние курсора в другом приложении?
← →
Digitman (2003-06-27 12:03) [23]
> Если в приложении используется Processmessages, то оно обработает
> SendMessageTimeout.
"используется" вовсе не значит, что в дан.момент времени выполняется.
Кр.того, имеет значение конкретный код.поток, который "обучен" или "не обучен" обрабатывать сообщения окнам, им созданным.
Если код.поток в дан.момент обрабатывает сообщения, то это значит, что ничем другим он в дан.момент не занимается, кроме как обработкой сообщений)
> Можно ли узнать состояние курсора в другом приложении?
а что это тебе даст ? курсор там может быть вообще не организован и/или не визуализирован
← →
tiam (2003-06-27 12:45) [24]Допустим, курсор все же организован.
А processmessages используется после каждого шага цикла (очень часто).
Можно ли в таком сдучае проверить состояние (песочные часы или нет)
← →
Digitman (2003-06-27 13:47) [25]в общем случае - нет.
только в частных случаях.
← →
tiam (2003-06-27 14:34) [26]Какая же функция поможет мне узнать состояние курсора в чужом приложении?
← →
Digitman (2003-06-27 15:14) [27]функция-то есть - GetCursor()
если ты умудришься выполнить ее тем или иным образом в ВАП "чужого" процесса, то получишь хэндл текущего курсора ...
а вот что ты с ним дальше будешь делать - ума не приложу)
← →
tiam (2003-06-27 15:21) [28]то есть она "в лоб" не выполнится?
Мне нужно лишь состояние курсора, его вид.
← →
Digitman (2003-06-27 15:55) [29]
> "в лоб" не выполнится?
выполнится.
но вернет хэндл тек.курсора того приложения, в одном из код.потоков процесса которого эта ф-ция будет вызвана
> состояние курсора, его вид
а что ты под сим подразумеваешь ? уж не индекс ли курсора, как он выглядит в списке TScreen.Cursors[] ?
так ведь индекс этот не имеет никакого отношения к Win32API !
а система знать ничего не знает ни о каких "песочных часах", ее задача - загрузить по требованию конкретного приложения образ курсора из некоего ресурса, назначить ему хэндл и отрисовать в нужный момент времени в нужном месте. А что там она рисует, "часы" или "трусы" - системе совершенно индифферентно : каждое приложение знает об этом и заботится о вызове в нужный момент времени ф-ции SetCursor(хэндл_загруженного_ресурса_курсора) само, назначая при необходимости какие-то там внутр.индексы этому курсору..
← →
tiam (2003-06-27 16:01) [30]Понятно с курсором, спасибо.
← →
Digitman (2003-06-27 16:23) [31]думаю, ты занялся не тем.
если ты подразумеваешь конкретную СУБД и конкретный ее клиентский драйвер, через который приложение осуществляет доступ к БД, то достаточно перехватить соотв.API-вызовы этого драйвера со стороны кл.приложения. Это и будет 100%-м фактом того, что "чужое" приложение делает или не делает в дан.момент времени то, что тебя интересует.
это, конечно, не менее сложный способ, но абсолютно точно решает поставленную задачу.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.007 c