Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-92072
Sword
2003-08-01 17:34
2003.08.28
Печать DBTree


8-92127
maker
2002-11-25 18:55
2003.08.28
!Wave файлы!....


1-92109
Song
2003-08-15 11:48
2003.08.28
TVS_CHECKBOXES. Как определить что ветвь с галочкой?


8-92132
ChikaVladimir
2003-04-27 10:33
2003.08.28
Анимация в Dll


3-92082
Andrey_1
2003-08-01 10:19
2003.08.28
как программно переключить DBEdit от 1го ист. данных к другому





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский