2016-07-27 1 views
0

모든 스레드에서 실행되는이 코드가 있습니다. 시스템에서 실행중인 모든 스레드를 반복하지 않고도 내 자신의 프로세스에서만 스레드를 얻고 싶습니다.동일한 프로세스에서 스레드를 나열하는 방법은 무엇입니까?

var 
    SnapProcHandle: THandle; 
    NextProc  : Boolean; 
    TThreadEntry : TThreadEntry32; 
begin 
    SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); 
    Result := (SnapProcHandle <> INVALID_HANDLE_VALUE); 
    if Result then 
    try 
    TThreadEntry.dwSize := SizeOf(TThreadEntry); 
    NextProc := Thread32First(SnapProcHandle, TThreadEntry); 
    while NextProc do 
    begin 
     if TThreadEntry.th32OwnerProcessID = PID then 
     begin 
     Memo1.Lines.Add('Thread ID  '+IntToStr(TThreadEntry.th32ThreadID)); 
     Memo1.Lines.Add('base priority '+inttostr(TThreadEntry.tpBasePri)); 
     Memo1.Lines.Add('delta priority '+inttostr(TThreadEntry.tpBasePri)); 
     end; 
     NextProc := Thread32Next(SnapProcHandle, TThreadEntry); 
    end; 
    finally 
    CloseHandle(SnapProcHandle); 
    end; 
end; 
+0

영어는 괜찮지 만 코드를 읽을 수 없습니다. 질문을 편집하고 코드 형식을 편집하는 데 도움을 받으십시오. 이 일을하는 데 시간을 보내십시오. 20 대 후에는 포기하지 마세요. –

+0

dupes : http://stackoverflow.com/q/2055642/800214 및 http://stackoverflow.com/questions/3809708/running-threads-count – whosrdaddy

+0

질문을 이해하는 것이 어렵고 코드와 관련된 내용을 이해하는 것도 어렵습니다. . 코드가 기대하는 바는 무엇입니까? 그것은 무엇을 하는가. –

답변

0

WMI (Windows MIcrosoft Instrumentation)로이 작업을 수행 할 수 있습니다. Here there are an article은 하나의 프로세스에서 실행중인 모든 스레드를 검색하는 방법을 설명합니다. 이 기사는 스페인어로되어 있지만 자동 번역을 사용하여 코드를보고 샘플을 다운로드 할 수 있습니다.

WMI를 사용하면 Win32_Process class 클래스를 사용하여 프로세스의 모든 정보를 얻을 수 있습니다. 이 클래스의 정보를 얻으려면 콘솔에서 다음과 같이 실행 해보십시오. 이름 = "bds.exe는"이름, 설명, ProcessId를을 GET

WMIC 프로세스, THREADCOUNT, 당신은 프로세스의 정보를 얻을 수있는이와

enter image description here

을 처리합니다.

"프로세스와 연관된 스레드를 검색하는 방법"의 두 번째 단계. Win32_Thread class으로이 작업을 수행 할 수 있습니다.

이 같은 쿼리를 실행하는 경우 : WIN32_THREAD FROM

SELECT *를 WHERE ProcessHandle = 10740

당신은 프로세스 10740의 모든 스레드를 얻을 수 (첫 번째 쿼리의 ProcessId를 참조).

감사합니다.

+0

좋은 대안은 lib를 좋아해서 대답을 받아들입니다. – Mutha

+0

@Mutha - 이것은 SQL에서 모든 스레드를 추출하는 것을 피하지 않습니다. 단, 루프하는 WMI 코드는 아닙니다. –

2

당신은 이미 코드가 이미 정확히하고 있기 때문에, 특정 프로세스에 대한 스레드를 필터링하는 방법을 알고 :

if TThreadEntry.th32OwnerProcessID = PID then 

당신이 필요로하는 모든 호출 프로세스에 대한 PID입니다. 해당 값을 얻으려면 GetCurrentProcessId()을 사용하십시오.

TH32CS_SNAPTHREAD을 사용할 때 CreateToolhelp32Snapshot() 스냅 샷을 특정 프로세스로 제한 할 수 없다면 스냅 샷은 시스템의 모든 스레드를 포함하므로 루프를 반복하면서 해당 PID에서 필터링해야합니다.

+0

루프를 막지 못했습니까? – Mutha

+0

루프로 인해 어떤 문제가 발생합니까? –

+1

대답이 설명하는대로 루프를 피할 수 없습니다. –

관련 문제