下面的一个例子是我在csdn上看到的,作者的目的是:
“我”写了一个全局线程函数,那么如何用AfxBeginThread调用,我在视图的OnInitialUpdate中这样AfxBeginThread(CChCtrlThreadProc, GetSafeHwnd());启动可以吗,我想让这个线程每100毫秒运行一次。我刚接触多线程,底子太薄,看书总是
迷迷糊糊的,对这个例子我不能吃透,大虾们帮我解释一下,行吗?CEvent m_hExitEvent(FALSE,TRUE);void StartThread()
{
  m_hExitEvent.ReSetEvent();
//书上讲他是将一个事件设置成无信号状态,请问他的含义是不是下面的执行语句独占
//进程资源,而其他的线程不能访问,还是是别的含义?
  m_hThread= AfxBeginThread(CChCtrlThreadProc, GetSafeHwnd());
//这是开始一个线程吧,假如在这一步后,在创建多个线程,那他们的执行顺序是不是
//是随机的,可以控制吗?
}void EndThread()
{
 m_hExitEvent.SetEvent();
//SetEvent将一个事件设置成有信号状态,是不是当前线程释放进程资源,其他线程可以
访问
 WaitForSingleObject(m_hThread,INFINITE); 
//此语句在这里起什么作用?
}DWORD CChCtrlThreadProc(...)
{
   while( WaitForSingleObject(m_hExitEvent,100)==WAIT_TIMEOUT )
//此句是不是当线程拥有进程的资源超过0。1s后,执行下面的数据
   {
     //do something ...
   }   return 0;
}吐血请各位大虾指导!

解决方案 »

  1.   

    void StartThread()
    {
      m_hExitEvent.ReSetEvent(); // 设置成未发生事件. 
      m_hThread= AfxBeginThread(CChCtrlThreadProc, GetSafeHwnd());
      // 启动那个CChCtrlThreadProc线程
    }void EndThread()
    {
     m_hExitEvent.SetEvent();
     //设置事件发生
     WaitForSingleObject(m_hThread,INFINITE); 
     //一直等待线程结束.
    }DWORD CChCtrlThreadProc(...)
    {
       while( WaitForSingleObject(m_hExitEvent,100)==WAIT_TIMEOUT )
    //查看是不是m_hExitEvent那个事件已经发生了? 等待100ms,如果100ms内未发生则返回WAIT_TIMEOUT,这时进行下面的语句do something...,否则结束线程.
       {
         //do something ...
       }   return 0;
    }
    -------------------------------------------------------------
     m_hExitEvent 是在外部控制线程的一个信号,如果触发它,即可让线程检测到,而退出.结束线程的生命.各线程是操作系统控制的按时间片轮转的程序块.按操作系统内部的表轮转,不是随机的,在宏观上看好象是各线程函数是同时执行的. 
      

  2.   

    Event多数是用来控制线程同步的。也就是资源的占有何访问。有相当多的时候,它回被用来控制线程的运行。Event有signal和nonsignal的状态。一般的同步函数在nonsignal的状态下会使该函数所在线程进入睡眠状态。而一旦Event成为signal的时候,同步函数会立即返回,线程成为可调度状态。上面的例子就是利用了waitforsingleobject函数的等待超时完成循环的。
    当函数StartThread()的时候:
    一开始,先将一个exitevent置为nonsignal的状态,然后启动线程。这之后,一个心的独立线程开始运行,就是对应函数CChCtrlThreadProc的那部分代码。主线程调用的函数在完成线程的创建后退出。同时新线程开始运行。这时候它会遇到WaitForSingleObject这个函数,函数等待exitevent成为signal的状态,但是没有其他的线程会去改变这个exitevent。所以函数超时返回WAIT_TIMEOUT,使得循环条件成立,完成需要的代码。这样不断的循环。一直到这个exitevent的状态成为signal时才会退出循环。主线程一旦开始调用函数EndThread()情况就要开始改变了。这个函数就会将exitevent置signal状态。然后等待那个创建线程的句柄,等待句柄无效后函数就可以退出了。在新建立的线程中,循环一直进行着,但是一旦exitevent的状态成为signal时,waitforsingleobject函数就不会返回超时,循环也就结束了。之后这个线程会随线程函数的返回而退出。系统自动将线程句柄置无效。这样导致等待线程句柄的等待函数返回。标志着原先创建的线程结束。然后EndThread返回。主线程完成其他任务。不知道我这样说是不是对你有启发。