Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Состояние чужого процесса


Страницы:   1 2

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.
Что туда нужно передавать, если не секрет?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо