Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];

Вниз

Приостановить текущий проценсс из моей проги.   Найти похожие ветки 

 
NickolayLi   (2002-10-17 01:15) [0]

Привет всем!

как можно реализовать субж. мне нужно отловить, какой процесс в текщуй момент активен, кроме моей проги, и останвить его на время, а потом опять продолжить выполнение.

Спасибо.


 
Suntechnic   (2002-10-17 03:45) [1]

Приостановить можно поток, но никак не процесс. А у процесса может быть тысячи потоков... Ты хочешь остановить их все?


 
nickolayLI   (2002-10-17 07:10) [2]

да если можно, но если есть основной, наверняка ведь есть

спсибо


 
Suntechnic   (2002-10-17 08:10) [3]

>nickolayLI (17.10.02 07:10)
Основной поток то есть только...
Я действительно не могу понять зачем это надо... Нет оно конечно можно с помощью ToolHelp ф-ций найти все потоки принадлежащие заданному процессу, а затем для каждого из них вызвать SuspendThread, а потом тоже самое проделать вызвав ResumeThread, но зачем?


 
nickolayLI   (2002-10-17 08:13) [4]

это для меня в образовательных целях исключительно, хоть пример какой-нить есть, если есть, киньте в меня плиз.


 
Suntechnic   (2002-10-17 08:40) [5]

Пример чего? Готовой программки? Вряд ли кто-то такой глупостью занимался, даже исключительно в образовательных целях :)
Пример работы с ToolHelp ф-циями?
Посмотрите в хелпе CreateToolhelp32Snapshot, Thread32First, Thread32Next, OpenThread, ResumeThread, SuspendThread.
Если что непонятно по работе ф-ций, спрашивай.


 
Nomad.kz   (2002-10-17 11:10) [6]

Вообще-то, я уже кидал этот код, но он у меня был под рукой в данный момент, так что ловите:


Приостановка и возобновление процессов В Windows понятия "приостановка" и "возобновление" неприменимы к процессам, так как они не участвуют в распределении процессорного времени. Однако меня не рая спрашивали, как одним махом приостановить все потоки определенного процесса. Это можно сделать из другого процесса, причем он должен быть отладчиком и, в ча стности, вызывать функции вроде WaitForDebugEvent и ContinueDebugEvent.

Других способов приостановки всех потоков процесса в Windows нет: програм ма, выполняющая такую операцию, может "потерять" новые потоки. Система должна как-то приостанавливать в этот период не только все существующие, но и вновь со здаваемые потоки. Microsoft предпочла встроить эту функциональность в системный механизм отладки.

Вам, конечно, не удастся написать идеальную функцию SuspendProcess, но вполне по силам добиться ec удовлетворительной работы во многих ситуациях. Вот мой ва риант функции SuspendProcess.

VOID SuspendProcess(DWORD dwProcessID, BOOL tSuspend)
{

// получаем список потоков в системе
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessID),

if (hSnapshot != INVALID_HANDLE_VALUE) {

// просматриваем список потоков
THREADENTRY32 te = { sizeof(te) };

BOOL fOk = Thread32First(hSnapshot, &te);

for (, fOk, fOk = Thread32Next(hSnapshot, &te))
{

// относится ли данный поток к нужному процессу
if (te.th320wnerProcessID == dwProcessID)
{

// пытаемся получить описатель потока по его идентификатору
HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te th32ThreadID);

if (hThread != NULL)
{

// приоcтанавливаем или возобновляем поток
if (fSuspend)
SuspendTh read(hThread);
else
ResumeThread(hThread);

}

CloseHandle(hThread);

}
}

CloseHandle(hSnapsnot);
}
}

Для перечисления списка потоков я использую ToolHelp функции (они рассмат ривались в главе 4). Определив потоки нужною процесса, я вызываю OpenThread.

HANDLE OpenThread( DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwThreadID);

Это новая функция, которая появилась в Windows 2000 Она находит объект ядра "поток" по идентификатору, указанному в dwTbreadJD, увеличивает его счетчик поль зователей на 1 и возвращает описатель объекта Получив описатель, я могу передать его в SuspendThread (или ResumeThread) OpenThread имеется только в Windows 2000, поэтому моя функция SuspendProcess не будет работать ни в Windows 95/98, ни в Windows NT 4 0

Вероятно, Вы уже догадались, почему SuspendProcess будет срабатывать не во всех случаях: при перечислении могут создавайся новые и уничтожаться существующие потоки. После вызова CreateToolhelp32Snapshot в процессе может появиться новый поток, который моя функция уже не увидит, а значит, и не приостановит Впослед ствии, когда я попытаюсь возобновить потоки, вновь вызвав SuspendProcess, она во

зобновит поток, который собственно и не приостанавливался. Но может быть еще хуже- при перечислении текущий поток уничтожается и создастся новый с тем же идентификатором. Тогда моя функция приостановит неизвестно какой поток (и даже непонятно в каком процессе).

Конечно, все эти ситуации крайне маловероятны, и, если Вы точно представляе те, что делает интересующий Вас процесс, никаких проблем не будет. В общем, ис пользуйте мою функцию на свой страх и риск.



 
Nomad.kz   (2002-10-17 11:11) [7]

вдогонку спрашивали не меня, Джеффри Рихтера, книга: "Создание Эффективных Win32 приложений"


 
NickolayLI   (2002-10-17 11:48) [8]

Пасиба огромное...


 
Игорь Шевченко   (2002-10-17 12:27) [9]

Как остановить текущий процесс из моей проги - очень просто.
Текущим процессом и будет та самая программа, остановит она сама себя



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.008 c
3-61445
Asderg
2002-11-29 11:02
2002.12.19
можно ли сделать в одном запросе update двух таблиц?


3-61472
Valeron
2002-11-29 16:44
2002.12.19
Ошибка с параметром в TQuery


4-61871
bytebutcher
2002-11-06 16:53
2002.12.19
Можно ли задать для уже существующего окна другой DC?


1-61602
Bishop
2002-12-08 23:56
2002.12.19
Быстрая очистка StringGrid


3-61439
bedniy_student
2002-11-29 09:46
2002.12.19
SQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский