我想从我的应用程序中获得所有线程(除了主线程,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;
另一种选择是使用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.
您可以使用WMI访问这些信息。
WIN32_Process可以给你关于在Machine上执行的进程的所有信息。 对于每个进程,你可以给ThreadsCount,Handle,…
另一个类,WIN32_Thread可以给你有关在机器上运行的所有线程的详细信息。 这个类有一个名为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_Thread来使用Handle of进程。
对于我的英语不好,请原谅。
问候。
如果他们是你的线程,那么我将创建一个应用程序全局线程管理器来创建时注册自己。 然后,您可以使用线程管理器正常监视,暂停和关闭线程。