Форум: "WinAPI";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];
ВнизКак открыть хендл к чужому потоку? Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c