如何获取包含我的应用程序创建的所有线程的列表

时间:2010-01-13 09:36:04

标签: windows delphi multithreading process

我希望从我的应用程序中获取包含所有线程(主要的GUI线程除外)的列表,以便对它们执行某些操作。 (设置优先级,终止,暂停等) 怎么做?

5 个答案:

答案 0 :(得分:12)

另一个选项是使用CreateToolhelp32SnapshotThread32FirstThread32Next函数。

请参阅这个非常简单的示例(在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.

答案 1 :(得分:4)

您可以使用我的TProcessInfo课程:

var
  CurrentProcess : TProcessItem;
  Thread : TThreadItem;
begin
  CurrentProcess := ProcessInfo1.RunningProcesses.FindByID(GetCurrentProcessId);
  for Thread in CurrentProcess.Threads do
    Memo1.Lines.Add(Thread.ToString);
end;

答案 2 :(得分:3)

答案 3 :(得分:1)

您可以使用 WMI 访问此信息 WIN32_Process可以为您提供有关在Machine上执行的进程的所有信息。对于每个流程,您可以提供ThreadsCount,Handle,...

另一个类WIN32_Thread可以为您提供有关在Machine上运行的所有线程的详细信息。这个类具有一个名为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**)

使用Handle of process可以与WIN32_Thread类似。

我的英语不好的借口。

问候。

答案 4 :(得分:0)

如果它们是你的线程,那么我将创建一个应用程序全局线程管理器来在创建时注册自己。然后,您可以使用线程管理器正常地正确监视,暂停和关闭线程。