Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как открыть хендл к чужому потоку? [D7, WinXP]


Asteroid ©   (2005-07-18 13:32:00) 

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


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

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


Asteroid   (2005-07-19 21:57:00) [2]

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


Digitman   (2005-07-18 16:17:00) [3]


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


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


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

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

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


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

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 14:50:00) [6]

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

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


alpet   (2005-07-18 14:18:00) [7]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо