2010-01-13 11 views

Respuesta

4

Usted puede usar mi clase TProcessInfo:

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

Necesita una biblioteca personalizada para eso, llamada ** Información del proceso ** – TPAKTOPA

+0

El enlace está roto, el dominio ya no existe. Hay una [copia archivada] (http://web.archive.org/web/20121010001118/http://vcldeveloper.com/products/products-components/process-info) de la página de 2012, pero el código descarga Está perdido. –

1

Puede acceder a esta información a través de WMI .
El WIN32_Process puede darle toda la información sobre la ejecución del proceso en la máquina. Para cada proceso puede dar ThreadsCount, Handle, ...

Otra clase, WIN32_Thread puede darle información detallada sobre todos los hilos que se ejecutan en la máquina. Esta clase tiene una propiedad llamada ProcessId para buscar hilos específicos para 1 proceso (clase WIN32_Process).

Para que la prueba se puede ejecutar esta en la ventana Línea de comandos:

// 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**) 

similares se puede hacer con WIN32_Thread usando el mango del proceso.

Excuse.me for my bad english.

Atentamente.

+0

Ejemplo muy simple y útil, ¡gracias! – TPAKTOPA

12

Otra opción es utilizar las funciones CreateToolhelp32Snapshot, Thread32First y Thread32Next.

Vea este ejemplo muy simple (Probado en Delphi 7 y 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. 
+0

No olvide que TThreadEntry.dwSize está ** configurado ** por Thread32First y Thread32Next, por lo que ** debe ** comprobarlo antes de acceder a otros campos. Las diferentes versiones de Windows devuelven diferentes cantidades válidas de datos. –

0

Si son sus hilos, entonces crearía una aplicación global Thread Manager para registrarse al momento de la creación. A continuación, puede supervisar, detener y detener adecuadamente los hilos de forma correcta con su Thread Manager.

Cuestiones relacionadas