Я хочу получить список со всеми потоками (кроме основного, потока GUI) из моего приложения, чтобы сделать некоторое действие (действия) с ними. (приоритет набора, уничтожьте, пауза и т.д.), Как сделать это?
можно использовать мой класс TProcessInfo :
var
CurrentProcess : TProcessItem;
Thread : TThreadItem;
begin
CurrentProcess := ProcessInfo1.RunningProcesses.FindByID(GetCurrentProcessId);
for Thread in CurrentProcess.Threads do
Memo1.Lines.Add(Thread.ToString);
end;
Вы также можете взглянуть на http://blog.delphi-jedi.net/2008/03/19/how-tov-get-thete-threads-of-of- A-Process /
Вы можете получить доступ к этой информации, используя WMI .
Win32_Process может дать вам всю информацию о процессе, выполняющем на машине. Для каждого процесса вы можете дать нитью спинку, ручку, ...
Другой класс, Win32_Thread может дать вам обнаружить информацию обо всех потоках, работающих на машине. Этот класс Hace Hace является свойство под названием ProcessiD для поиска пососных потоков для 1 процесса (класс Win32_Process).
Для тестирования его можно выполнить это в окне CommandLine:
// all processes
WMIC PROCESS
// information about Delphi32
WMIC PROCESS WHERE Name="delphi32.exe"
// some information about Delphi32
WMIC PROCESS WHERE Name="delphi32.exe" GET Name,descrption,threadcount,Handle
(NOTE: The handle for delphi32.exe in my machine is **3680**)
Похоже, что вы можете сделать с Win32_Thrad, используя ручку процесса.
Ожого. Если для моего плохого английского.
С уважением.
Другой вариант использует CreateToolHelp32Snapshot , Thread32First и Thread32Next функции.
См. Этот очень простой пример (проверено в Delphi 7 и Windows 7).
program ListthreadsofProcess;
{$APPTYPE CONSOLE}
uses
PsAPI,
TlHelp32,
Windows,
SysUtils;
function GetTthreadsList(PID:Cardinal): Boolean;
var
SnapProcHandle: THandle;
NextProc : Boolean;
TThreadEntry : TThreadEntry32;
begin
SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); //Takes a snapshot of the all threads
Result := (SnapProcHandle <> INVALID_HANDLE_VALUE);
if Result then
try
TThreadEntry.dwSize := SizeOf(TThreadEntry);
NextProc := Thread32First(SnapProcHandle, TThreadEntry);//get the first Thread
while NextProc do
begin
if TThreadEntry.th32OwnerProcessID = PID then //Check the owner Pid against the PID requested
begin
Writeln('Thread ID '+inttohex(TThreadEntry.th32ThreadID,8));
Writeln('base priority '+inttostr(TThreadEntry.tpBasePri));
Writeln('');
end;
NextProc := Thread32Next(SnapProcHandle, TThreadEntry);//get the Next Thread
end;
finally
CloseHandle(SnapProcHandle);//Close the Handle
end;
end;
begin
{ TODO -oUser -cConsole Main : Insert code here }
GettthreadsList(GetCurrentProcessId); //get the PID of the current application
//GettthreadsList(5928);
Readln;
end.
Если это ваши потоки, я бы создал глобальный диспетчер потоков приложения, в котором они будут регистрироваться при создании. Затем вы можете правильно отслеживать, приостанавливать и корректно завершать потоки с помощью диспетчера потоков.