|
|
|
Как узнать что процесс находится в состоянии ожидания?
|
|||
|---|---|---|---|
|
#18+
Из своего приложения запускаю внешнюю задачу. Внешняя задача, по окончании своей работы, не завершается автоматически, а остается в состоянии ожидания действий пользователя. Необходимо определить, с использованием функций WinAPI, что процесс находится в состоянии ожидания и, следовательно, его работу можно завершать. Может кто подскажет как это узнать, через CPU usage/time или еще какие-нибудь косвенные методы... Буду рад любому совету. PS. Знаю, ProcessID, Handle Главного окна приложения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 15:13 |
|
||
|
Как узнать что процесс находится в состоянии ожидания?
|
|||
|---|---|---|---|
|
#18+
Прочитайте все про WaitForInputIdle(). Не совсем точно, но может подойдет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 15:17 |
|
||
|
Как узнать что процесс находится в состоянии ожидания?
|
|||
|---|---|---|---|
|
#18+
Первое что пришло в голову: - Процесс должен где-то внешне выложить свой ID; - Он же должен пустить сред и выложит его ID тоже; - Когда процесс "встанет в состояние ожидания"(так и не понял, что это там) убить этот сред. а тепер зачем такие трудности: - Потом снаружи сделать снимок с номером этого процесса. - И пробежаться по его средам, если среда с нужным номером нет - процесс стоит. Завтра может ещё что придумаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 16:31 |
|
||
|
Как узнать что процесс находится в состоянии ожидания?
|
|||
|---|---|---|---|
|
#18+
Немного поясню... необходимо из своего приложения произвести печать документа (RTF, DOC) Для печати используется WordViewer97, вот только он не может печатать документ с использованием командной строки, как это делал WordViewer95 (ключ /p), а WV95 глючит на таблицах с объединением ячеек Печать данных документов с использованием Ole.Automation не подходит так как Word слишком долго грузится Создаю процесс с запуском WViewer97 myfile.doc, жду пока он загрузится, затем посылаю ему комбинации нажатия клавиш Ctrl+P Enter с использованием keybd_event(), кстати, послать сообщения о нажатии клавиш с использованием SendMessage() не удалось, WV97 на них не реагирует, какому hWnd слать эти сообщения, так и не понял, как не ковырял Spy WordViewer печатает и мне надо его закрыть, по окончании печати... в связи с тем что документы бывают разного объема и печать может длиться неопределенное время, делать просто sleep(n) неоптимально. Необходимо опеределить, что печать документа завершена и можно безболезненно закрыть WordViewer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 17:44 |
|
||
|
Как узнать что процесс находится в состоянии ожидания?
|
|||
|---|---|---|---|
|
#18+
Предлагаю подойти с другого конца - смотреть задания на принтере, если их нет - то и убивать процесс. Вот примерчик из МСДН автор BOOL ListJobsForPrinter( LPTSTR szPrinterName ) { HANDLE hPrinter; DWORD dwNeeded, dwReturned, i; JOB_INFO_1 *pJobInfo; // You need a printer handle, open the printer if( ! OpenPrinter( szPrinterName, &hPrinter, NULL ) ) return FALSE; // First you call EnumJobs() to find out how much memory you need if( ! EnumJobs( hPrinter, 0, 0xFFFFFFFF, 1, NULL, 0, &dwNeeded, &dwReturned ) ) { // It should have failed, but if it failed for any reason other // than "not enough memory", you should bail out if( GetLastError() != ERROR_INSUFFICIENT_BUFFER ) { ClosePrinter( hPrinter ); return FALSE; } } // Allocate enough memory for the JOB_INFO_1 structures plus // the extra data - dwNeeded from the previous call tells you // the total size needed if( (pJobInfo = (JOB_INFO_1 *)malloc( dwNeeded )) == NULL ) { ClosePrinter( hPrinter ); return FALSE; } // Call EnumJobs() again and let it fill out our structures if( ! EnumJobs( hPrinter, 0, 0xFFFFFFFF, 1, (LPBYTE)pJobInfo, dwNeeded, &dwNeeded, &dwReturned ) ) { ClosePrinter( hPrinter ); free( pJobInfo ); return FALSE; } // You're done with the printer handle, close it ClosePrinter( hPrinter ); // dwReturned tells how many jobs there are // Here, you'll simply display the number of jobs found printf( "%d jobs\n", dwReturned ); // It's easy to loop through the jobs and access each one for(i=0;i<dwReturned;i++) { // pJobInfo is a JOB_INFO_1 struct for that job // so here you could do whatever you want for each job printf( "[%d] [%s]\n", pJobInfo.JobId, pJobInfo.pDocument ); } // Clean up free( pJobInfo ); return TRUE; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2004, 18:13 |
|
||
|
Как узнать что процесс находится в состоянии ожидания?
|
|||
|---|---|---|---|
|
#18+
Добалю от себя. Список джобов принтера лучше ещё проверять на овнера: JOB_INFO_1.pUserName дабы не ждать чужих заданий и на состояние JOB_INFO_1.Status == JOB_STATUS_PRINTING дабы не ждать своё :) А SendMessage возможно просто игнорируется самим WordViewеr'ом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2004, 10:35 |
|
||
|
Как узнать что процесс находится в состоянии ожидания?
|
|||
|---|---|---|---|
|
#18+
на всякий случай WaitForSingleObject http://forum.codenet.ru/showthread.php?threadid=8601 Но в твоем случае это вряд-ли поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2004, 19:12 |
|
||
|
Как узнать что процесс находится в состоянии ожидания?
|
|||
|---|---|---|---|
|
#18+
Блин, чтоб вам пусто. У меня случилась точь такая же задача Тоже принтер. Тока не процесс, а поток. Так я делаю проверку на наличие определённого окна в потоке. Если окна нет, можно убивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 11:22 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=457&tid=2035387]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 377ms |

| 0 / 0 |
