Как я могу получить список со всеми потоками, созданными моим приложением
Я хочу получить список со всеми потоками(кроме основного потока GUI) из моего приложения, чтобы сделать некоторые действия с ними. (установить приоритет, убить, пауза и т. д.) Как это сделать?
5 ответов
вы можете использовать my TProcessInfo класс:
var
CurrentProcess : TProcessItem;
Thread : TThreadItem;
begin
CurrentProcess := ProcessInfo1.RunningProcesses.FindByID(GetCurrentProcessId);
for Thread in CurrentProcess.Threads do
Memo1.Lines.Add(Thread.ToString);
end;
другой вариант-использовать Метод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.
вы также можете посмотреть на http://blog.delphi-jedi.net/2008/03/19/how-to-get-the-threads-of-a-process/
вы можете получить доступ к этой информации, используя WMI.
WIN32_Process может предоставить вам всю информацию о процессе, выполняемом на машине. Для каждого процесса вы можете дать ThreadsCount, Handle,...
другой класс, WIN32_Thread может дать вам подробную информацию обо всех потоках, запущенных на машине. Этот класс имеет свойство ProcessId для поиска особых потоков для 1 процесса (класс WIN32_Process).
для проверки вы можете выполнить это в окне командной строки:
// 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_Thread, используя дескриптор процесса.
извините.меня за плохой английский.
С уважением.
Если они ваши потоки, то я бы создал приложение global Thread Manager для регистрации себя при создании. Затем вы можете правильно контролировать, приостанавливать и выключать потоки с помощью Диспетчера потоков.