我希望从我的应用程序中获取包含所有线程(主要的GUI线程除外)的列表,以便对它们执行某些操作。 (设置优先级,终止,暂停等) 怎么做?
答案 0 :(得分:12)
另一个选项是使用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.
答案 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)
如果它们是你的线程,那么我将创建一个应用程序全局线程管理器来在创建时注册自己。然后,您可以使用线程管理器正常地正确监视,暂停和关闭线程。