Как я могу получить список со всеми потоками, созданными моим приложением

Я хочу получить список со всеми потоками(кроме основного потока 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 для регистрации себя при создании. Затем вы можете правильно контролировать, приостанавливать и выключать потоки с помощью Диспетчера потоков.