Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.04;
Скачать: CL | DM;

Вниз

Как открыть хендл к чужому потоку?   Найти похожие ветки 

 
Asteroid ©   (2005-07-18 13:32) [0]

У меня есть одна прога, которая жрет слишком много процессорного времени. Мне нужно ограничить ей подачу процессорного времени. Соответственно пытаюсь остановить все потоки нужного мне процесса...но загвоздка в том, что для SuspendThread нужен хэндл потока. Как его получить?
Может быть есть другие способы усыпить все потоки чужого процесса?


 
alpet ©   (2005-07-18 14:18) [1]

Советую попробывать урезать приоритет для начала Диспетчером Задач (taskmgr.exe). Если не получится добиться желанного, копай в сторону уменьшения приоритета потоков (я бы такую программу выкинул). Для того чтобы получить все и сразу (в смысле дескрипторых потоков) можно использовать API отладки (DebugActiveProcess к примеру), или (в случае Win2k+) использовать ToolHelp функции и соответственно OpenProcess / OpenThread.


 
Asteroid ©   (2005-07-18 14:50) [2]

Вот насчет OpenThread поподробнее :)
А все..."Не пользуйтесь Win32 SDK от Delphi, она устарела". В MSDN все есть. Буду возиться...(ToolHelp-ом пользовался, куда ж без него)

Менять приоритет - не выход. Нужно именно снизить потребление CPU.


 
Ms-Rem (real)   (2005-07-18 15:16) [3]

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


Если нужна работа под win NT4, то можно сделать через NativeAPI функцию ZwOpenThread, но тогда не будет работать под 9х.

Если нужно остановить чужой процесс, то вот работающий код:

{
Остановка всех нитей процесса.
Если останавливается текущий процесс, то вызывающая нить не останавливается.
}
Function StopProcess(ProcessId: dword): boolean;
var
Snap: dword;
CurrTh: dword;
ThrHandle: dword;
Thread:TThreadEntry32;
begin
 Result := false;
 CurrTh := GetCurrentThreadId;
 Snap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
 if Snap <> INVALID_HANDLE_VALUE then
    begin
    Thread.dwSize := SizeOf(TThreadEntry32);
    if Thread32First(Snap, Thread) then
    repeat
    if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID = ProcessId) then
       begin
       ThrHandle := OpenThread(THREAD_SUSPEND_RESUME, false, Thread.th32ThreadID);
       if ThrHandle = 0 then Exit;
       SuspendThread(ThrHandle);
       CloseHandle(ThrHandle);
       end;
    until not Thread32Next(Snap, Thread);
    CloseHandle(Snap);
    Result := true;
    end;
end;

{ Запуск процесса остановленного StopProcess }
Function RunProcess(ProcessId: dword): boolean;
var
Snap: dword;
CurrTh: dword;
ThrHandle: dword;
Thread:TThreadEntry32;
begin
 Result := false;
 CurrTh := GetCurrentThreadId;
 Snap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
 if Snap <> INVALID_HANDLE_VALUE then
    begin
    Thread.dwSize := SizeOf(TThreadEntry32);
    if Thread32First(Snap, Thread) then
    repeat
    if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID = ProcessId) then
       begin
       ThrHandle := OpenThread(THREAD_SUSPEND_RESUME, false, Thread.th32ThreadID);
       if ThrHandle = 0 then Exit;
       ResumeThread(ThrHandle);
       CloseHandle(ThrHandle);
       end;
    until not Thread32Next(Snap, Thread);
    CloseHandle(Snap);
    Result := true;
    end;
end;


 
Asteroid ©   (2005-07-18 15:22) [4]

Все работает, спасибо.

> Ms-Rem (real)   (18.07.05 15:16) [3]
Да, примерно так и сделал. Еще пришлось посмотреть, чему равен THREAD_SUSPEND_RESUME (оказалось $0002).


 
Digitman ©   (2005-07-18 16:17) [5]


> нужно ограничить
> Соответственно пытаюсь остановить


как сочетается "ограничить" и "остановить" ?
почему "соответственно" ?
кто и где документировал это "соответственно" ?


 
Asteroid ©   (2005-07-19 21:57) [6]

> Digitman ©   (18.07.05 16:17) [5]
Т.е. я много раз в секунду ставлю thread-ы на паузу и снимаю с паузы. Вот и ограничивается ;)


 
alpet ©   (2005-07-20 00:01) [7]

Asteroid ©   (19.07.05 21:57) [6]
Слишком много смысла не имеет - кванты выделяемые потокам и так небольшие - более 55 в секунду их вроде и не бывает. Полезно также определить единственный, рабочий поток и приостанавливать его (если он не занимается UI - можно и большие промежутки времени)  - для этого есть функция определения времени работы потока (у самых работящих, оно как правило наибольшее).



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

Текущий архив: 2005.09.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.038 c
14-1123756444
АМБ
2005-08-11 14:34
2005.09.04
Автоматическое раскрытие пунктов подменю


14-1123743417
Makhanev A.S.
2005-08-11 10:56
2005.09.04
Code Insight и тормоза


4-1121182970
Volumer
2005-07-12 19:42
2005.09.04
Повторный запуск


14-1123259592
Джо
2005-08-05 20:33
2005.09.04
Какую еду предпочитают программисты?


14-1122809211
Piter
2005-07-31 15:26
2005.09.04
Книга дракона