![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Состояние чужого процесса
tiam © (2003-06-26 08:12:00)
Добрый день.
Есть некоторое приложение в котором выполняется длительный скл-запрос. Нужно из другого приложения получить состояние первого приложения. Т.е. узнать, закончил выполняться запрос или нет.
Каким образом, есть ли готовые апишные функции?
Спасибо
Digitman (2003-06-27 16:23:00) [1]
думаю, ты занялся не тем.
если ты подразумеваешь конкретную СУБД и конкретный ее клиентский драйвер, через который приложение осуществляет доступ к БД, то достаточно перехватить соотв.API-вызовы этого драйвера со стороны кл.приложения. Это и будет 100%-м фактом того, что "чужое" приложение делает или не делает в дан.момент времени то, что тебя интересует.
это, конечно, не менее сложный способ, но абсолютно точно решает поставленную задачу.
tiam (2003-06-27 16:01:00) [2]
Понятно с курсором, спасибо.
Digitman (2003-06-27 15:55:00) [3]
> "в лоб" не выполнится?
выполнится.
но вернет хэндл тек.курсора того приложения, в одном из код.потоков процесса которого эта ф-ция будет вызвана
> состояние курсора, его вид
а что ты под сим подразумеваешь ? уж не индекс ли курсора, как он выглядит в списке TScreen.Cursors[] ?
так ведь индекс этот не имеет никакого отношения к Win32API !
а система знать ничего не знает ни о каких "песочных часах", ее задача - загрузить по требованию конкретного приложения образ курсора из некоего ресурса, назначить ему хэндл и отрисовать в нужный момент времени в нужном месте. А что там она рисует, "часы" или "трусы" - системе совершенно индифферентно : каждое приложение знает об этом и заботится о вызове в нужный момент времени ф-ции SetCursor(хэндл_загруженного_ресурса_курсора) само, назначая при необходимости какие-то там внутр.индексы этому курсору..
tiam (2003-06-27 15:21:00) [4]
то есть она "в лоб" не выполнится?
Мне нужно лишь состояние курсора, его вид.
Digitman (2003-06-27 15:14:00) [5]
функция-то есть - GetCursor()
если ты умудришься выполнить ее тем или иным образом в ВАП "чужого" процесса, то получишь хэндл текущего курсора ...
а вот что ты с ним дальше будешь делать - ума не приложу)
tiam (2003-06-27 14:34:00) [6]
Какая же функция поможет мне узнать состояние курсора в чужом приложении?
Digitman (2003-06-27 13:47:00) [7]
в общем случае - нет.
только в частных случаях.
tiam (2003-06-27 12:45:00) [8]
Допустим, курсор все же организован.
А processmessages используется после каждого шага цикла (очень часто).
Можно ли в таком сдучае проверить состояние (песочные часы или нет)
Digitman (2003-06-27 12:03:00) [9]
> Если в приложении используется Processmessages, то оно обработает
> SendMessageTimeout.
"используется" вовсе не значит, что в дан.момент времени выполняется.
Кр.того, имеет значение конкретный код.поток, который "обучен" или "не обучен" обрабатывать сообщения окнам, им созданным.
Если код.поток в дан.момент обрабатывает сообщения, то это значит, что ничем другим он в дан.момент не занимается, кроме как обработкой сообщений)
> Можно ли узнать состояние курсора в другом приложении?
а что это тебе даст ? курсор там может быть вообще не организован и/или не визуализирован
tiam (2003-06-27 11:23:00) [10]
Если в приложении используется Processmessages, то оно обработает SendMessageTimeout.
Можно ли узнать состояние курсора в другом приложении?
Digitman (2003-06-26 13:57:00) [11]
if SendMessageTimeout(H, WM_USER, 0, 0,SMTO_ABORTIFHUNG,время_в_миллисекундах,m)<>0 then showmessage(".....");
tiam (2003-06-26 13:52:00) [12]
Спасибо, уже понял сам, надо таймаут указывать ненулевой.
tiam (2003-06-26 13:31:00) [13]но какое сообщение лучше посылать для проверки?
Правильно ли написать так:
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(".....");
Сообщение показывается только если окно, которому посылаем, отвечает, если же не отвечает, то эта функция не отрабатывает.
Т.е. дальнейший код не выполняется.
Что не так?
Digitman (2003-06-26 12:52:00) [14]
> Приложение не ответит ни на какое сообщение?
> Т.е. функция вернет 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 12:24:00) [15]
Приложение не ответит ни на какое сообщение?
Т.е. функция вернет false?
Посылаю, например, wm_acivate
Digitman (2003-06-26 12:11:00) [16]
> почитать про возможные результаты
это зависит от посылаемого сообщения и обрабатывается ли таковые целевым окном вообще
> Что запишется в эту переменную в случае занятости
ничего.
а зачем это нужно ? ты ведь определил факт занятости, и этого согласно условиям достаточно , значит, задача твоя решена)
tiam (2003-06-26 11:57:00) [17]
А где почитать про возможные результаты.
Что запишется в эту переменную в случае занятости?
Digitman (2003-06-26 11:32:00) [18]
адрес переменной типа DWORD, в которую, в случае обработанного вовремя сообщения, будет записан результат обработки (это то же самое, что возвращает SendMessage)
tiam (2003-06-26 11:10:00) [19]
Digitman, пожалуйста, подскажите.
tiam (2003-06-26 10:58:00) [20]
Про функцию SendMessageTimeout написано следующее, что если 5-й параметр: UINT fuFlags
я поставлю флаг SMTO_ABORTIFHUNG, то функция не ждет ответа приложения в течение тайм аута, высталяемого в 6-м параметре.
а есть еще 7-й параметр, результат - lpdwResult, который возвращает value for synchronous call.
Что туда нужно передавать, если не секрет?