如何获取进程的主线程ID(以其ID名称)?

Sme*_*nni 6 c c++ windows multithreading

你能帮我找到ID过程给定的主(唯一)线程ID吗?

任务上下文:正在运行的进程(目前)没有窗口,只有(某些)线程.

通缉:WM_QUIT仅在主线上发布.

不需要:在非主线程上使用TerminateProcess或发布WM_QUIT.

Geo*_*etu 5

#ifndef MAKEULONGLONG
#define MAKEULONGLONG(ldw, hdw) ((ULONGLONG(hdw) << 32) | ((ldw) & 0xFFFFFFFF))
#endif

#ifndef MAXULONGLONG
#define MAXULONGLONG ((ULONGLONG)~((ULONGLONG)0))
#endif

bool CloseProcessMainThread(DWORD dwProcID)
{
  DWORD dwMainThreadID = 0;
  ULONGLONG ullMinCreateTime = MAXULONGLONG;

  HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  if (hThreadSnap != INVALID_HANDLE_VALUE) {
    THREADENTRY32 th32;
    th32.dwSize = sizeof(THREADENTRY32);
    BOOL bOK = TRUE;
    for (bOK = Thread32First(hThreadSnap, &th32); bOK;
         bOK = Thread32Next(hThreadSnap, &th32)) {
      if (th32.th32OwnerProcessID == dwProcID) {
        HANDLE hThread = OpenThread(THREAD_QUERY_INFORMATION,
                                    TRUE, th32.th32ThreadID);
        if (hThread) {
          FILETIME afTimes[4] = {0};
          if (GetThreadTimes(hThread,
                             &afTimes[0], &afTimes[1], &afTimes[2], &afTimes[3])) {
            ULONGLONG ullTest = MAKEULONGLONG(afTimes[0].dwLowDateTime,
                                              afTimes[0].dwHighDateTime);
            if (ullTest && ullTest < ullMinCreateTime) {
              ullMinCreateTime = ullTest;
              dwMainThreadID = th32.th32ThreadID; // let it be main... :)
            }
          }
          CloseHandle(hThread);
        }
      }
    }
#ifndef UNDER_CE
    CloseHandle(hThreadSnap);
#else
    CloseToolhelp32Snapshot(hThreadSnap);
#endif
  }

  if (dwMainThreadID) {
    PostThreadMessage(dwMainThreadID, WM_QUIT, 0, 0); // close your eyes...
  }

  return (0 != dwMainThreadID);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果它包含有关代码的作用及其工作原理的一些解释,那么这个答案会更好.特别是,在该进程有多个线程的情况下,如何确定特定进程的"主"线程是什么?它看起来像你在线程的创建时间.这不一定是可靠的启发式方法; 重要的是要指出人们可以仔细考虑这种方法的优缺点.包含*only*代码的答案不是答案. (9认同)

Nib*_*aba 5

获取主线程的线程id的一种更简单和更可靠的方法是让主线程将其自己的线程id记录::GetCurrentThreadId()到共享的全局变量中,可能在WinMain中或在"主线程"的最开头的某处:

MainThreadId_G = ::GetCurrentThreadId();
Run Code Online (Sandbox Code Playgroud)

然后在你的其他线程中,你可以调用: ::PostThreadMessage(MainThreadId_G, WM_QUIT, returncode, 0);