Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1123827117
Ш-К
2005-08-12 10:11
2005.09.04
Как привести Integer к множеству?


1-1123696512
Yegorchic
2005-08-10 21:55
2005.09.04
Как перевести из "цвета" в "текст"?


3-1122446270
Aks13
2005-07-27 10:37
2005.09.04
Delphi7 + Oracle9


1-1123742247
M@rlin
2005-08-11 10:37
2005.09.04
ЛИЦЕНЗИЯ НА ДЕЛФИ


14-1123397917
БарЛог
2005-08-07 10:58
2005.09.04
Девушка и компьютер





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