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

Я хочу получить список со всеми потоками (кроме основного, потока GUI) из моего приложения, чтобы сделать некоторое действие (действия) с ними. (приоритет набора, уничтожьте, пауза и т.д.), Как сделать это?

8
задан vcldeveloper 15 March 2010 в 10:06
поделиться

5 ответов

можно использовать мой класс TProcessInfo :

var
  CurrentProcess : TProcessItem;
  Thread : TThreadItem;
begin
  CurrentProcess := ProcessInfo1.RunningProcesses.FindByID(GetCurrentProcessId);
  for Thread in CurrentProcess.Threads do
    Memo1.Lines.Add(Thread.ToString);
end;
5
ответ дан 5 December 2019 в 07:58
поделиться
​​

Вы также можете взглянуть на http://blog.delphi-jedi.net/2008/03/19/how-tov-get-thete-threads-of-of- A-Process /

3
ответ дан 5 December 2019 в 07:58
поделиться

Вы можете получить доступ к этой информации, используя WMI .
Win32_Process может дать вам всю информацию о процессе, выполняющем на машине. Для каждого процесса вы можете дать нитью спинку, ручку, ...

Другой класс, Win32_Thread может дать вам обнаружить информацию обо всех потоках, работающих на машине. Этот класс Hace Hace является свойство под названием 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_Thrad, используя ручку процесса.

Ожого. Если для моего плохого английского.

С уважением.

1
ответ дан 5 December 2019 в 07:58
поделиться

Другой вариант использует 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.
12
ответ дан 5 December 2019 в 07:58
поделиться

Если это ваши потоки, я бы создал глобальный диспетчер потоков приложения, в котором они будут регистрироваться при создании. Затем вы можете правильно отслеживать, приостанавливать и корректно завершать потоки с помощью диспетчера потоков.

0
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: