我有两个线程threadA,threadB
threadA()
{
  .....
  doSomething1();
  .....
}
threadB()
{
  ....
  doSomething2();
  ....
}
我希望doSomething1()和doSomething2()能交替执行,即doSomething1执行完了,通知threadB执行doSomething2,doSomething2执行完了通知threadA执行doSomething1
我想用cevent做同步,可是不太会用,请指教,请添加代码
需要CSingleLock么,我不明白它是做什么的

解决方案 »

  1.   

    CCriticalSection dataLock;
    threadA()
    {
    m_dataLock.Lock();
      doSomething1();
    m_dataLock.Unlock();
    }
    threadB()
    {
    m_dataLock.Lock();
      doSomething2();
    m_dataLock.Unlock();
    }...
      

  2.   

    可查看我的帖子
    http://www.csdn.net/Expert/Forum.asp?roomid=1&typenum=2
      

  3.   

    HANDLE g_hEvent[2];
    g_hEvent[0]=CreateEvent(NULL,FALSE,FALSE,_T("BeginThreadB"));
    g_hEvent[1]=CreateEvent(NULL,FALSE,FALSE,_T("BeginThreadA"));
    SetEvent(g_hEvent[1]);
    threadA()
    {
    while (true)
    {
    if(WaitForSingleObject(g_hEvent[1],0)==WAIT_OBJECT_0)
    {
    ResetEvent(g_hEvent[1]);
    break;
    }
    }
    .....
    doSomething1();
    SetEvent(g_hEvent[0]);
    }
    threadB()
    {
    while (true)
    {
    if(WaitForSingleObject(g_hEvent[0],0)==WAIT_OBJECT_0)
    {
    ResetEvent(g_hEvent[0]);
    break;
    }
    }
    .....
    doSomething2();
    SetEvent(g_hEvent[1]);
    }这样就是一个死循环了,怎么样控制退出你自己定吧。
      

  4.   

    同意
    我也是用CCriticalSection 
    也可以用全局变量
      

  5.   

    楼上说得对,我所以用线程,是想提高速度。我想把程序改成这样
    threadA()
    {
    while (true)
    {
    doSomething1();
    }
    }
    threadB()
    {
    while (true)
    {
       doSomething2();
                等待doSomething1做完;
                doSomething3();
    }
    .....

    }即threadA不受干扰的运行,而threadB需要等待。我不会使用同步类,我不明白msdn上为什么说CSingleLock要与同步类一起使用
    还有CEvent,设为自动方式,一旦等到事件,马上又变成非信号状态,那什么时候再变成信号状态?
      

  6.   

    csinglock是保护资源的
    你还可以设置信号量
    然后waitsingleobject来同步
      

  7.   

    waitsingleobject(a,b)
    是同步函数
    用来同步,线程、进程、事件、和作业
    在a,运行完后,再运行bwaitmultiobject
    功能类似
    不过可以等待多个目标一要做的是等待一个线程中的一部分,所以不能单纯等待线程
    所以2i3i4i(2i3i4i) 创建了个时间event来做等待目标,就是在
    目标线程中加了个标记,用来等待
    现在应该明白了吧!!!
    HANDLE g_hEvent=CreateEvent(NULL,FALSE,FALSE,_T("WaitingForA"));threadA()
    {
         doSomething1();
         SetEvent(g_hEvent);
    }
    threadB()
    {
    if(WaitForSingleObject(g_hEvent,0)==WAIT_OBJECT_0)
    {
    ResetEvent(g_hEvent);
    break;
    }
    }
    .....
    doSomething2();
    doSomething3();
    }
    有点仓促,凑和着看吧!OK?
      

  8.   

    麻烦再问一下
    HANDLE g_hEvent=CreateEvent(NULL,FALSE,FALSE,_T("WaitingForA"));threadA()
    {                       我是不是应该加在这里,我不明白的是手动方式event
                              <-----------------------------------
         doSomething1();  ResetEvent后,什么时候再变为有信号状态?|
         SetEvent(g_hEvent);                                      |
    }                                                             |     
    threadB()                                                     |    
    {                                                             |     
    if(WaitForSingleObject(g_hEvent,0==WAIT_OBJECT_0)    |
    {                                                    |    
    ResetEven(g_hEvent);-------------
    break;
    }
    }
    .....
    doSomething2();
    doSomething3();
    }
      

  9.   


    WaitForSingleObject(g_hEvent,0==WAIT_OBJECT_0)是要等待
    g_hEvent
    SetEvent(g_hEvent); 
    是说当
    doSomething1();
    运行过后,
    g_hEvent就处于激活状态
    等待状态才会结束跳出等待
    执行下面的程序
    ResetEven(g_hEvent);
    是重置g_hEvent的状态
    为以后循环使用做准备
    如果不想在执行doSomething1();
    那可惜省去,没太大影响!
    OK?
    明白?