Chinaunix首页 | 论坛 | 博客
  • 博客访问: 338632
  • 博文数量: 88
  • 博客积分: 1695
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-06 15:48
个人简介

喜欢美食, 旅行..

文章分类

全部博文(88)

文章存档

2014年(2)

2013年(12)

2012年(14)

2010年(8)

2009年(52)

我的朋友

分类: Windows平台

2013-08-06 16:01:23

有时, 我们需要找出主线程. 下面示例代码给出windows下的一种方法:
原因很简单, 枚举当前进程的所有线程, 最早创建的那个必定是主线程.

  1.         m_threadId = 0;
  2.         FILETIME timeRunE = {0};
  3.         const DWORD idProcess = GetCurrentProcessId();
  4.         HANDLE hThreadSnap= ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, idProcess);//获取快照句柄
  5.         if(hThreadSnap == INVALID_HANDLE_VALUE)//如果获取失败返回
  6.             return;
  7.         THREADENTRY32 pe32 = { sizeof(pe32) };//快照结构并给予大小
  8.         if(::Thread32First(hThreadSnap, &pe32))
  9.         {
  10.             do
  11.             {
  12.                 if ( pe32.th32OwnerProcessID == idProcess )//如果进程ID等于你想寻找的进程ID则返回主线程ID
  13.                 {
  14.                     HANDLE handle = OpenThread(THREAD_SUSPEND_RESUME, FALSE,pe32.th32ThreadID);

  15.                     FILETIME createtime,time2,time3,time4;
  16.                     ::GetThreadTimes(handle,&createtime,&time2,&time3,&time4);
  17.                     SYSTEMTIME realtime;
  18.                     ::FileTimeToSystemTime(&createtime,&realtime);
  19.                     if ( createtime.dwHighDateTime < timeRunE.dwHighDateTime
  20.                         || (timeRunE.dwHighDateTime == 0 && timeRunE.dwLowDateTime == 0) )
  21.                     {
  22.                         m_threadId = pe32.th32ThreadID ;
  23.                         timeRunE = createtime;
  24.                     } else
  25.                     if ( createtime.dwHighDateTime == timeRunE.dwHighDateTime &&
  26.                         createtime.dwLowDateTime < timeRunE.dwLowDateTime )
  27.                     {
  28.                         m_threadId = pe32.th32ThreadID ;
  29.                         timeRunE = createtime;
  30.                     }
  31.                 }
  32.             }while(::Thread32Next(hThreadSnap, &pe32));
  33.         }//否则循环判断尾
  34.         ::CloseHandle(hThreadSnap);

阅读(5092) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~