主线程 和多个线程都调用主线程的 函数GetCheckedRadio()  需不需要同步?如果不同步主线程是不是可能阻塞?

解决方案 »

  1.   

    建议不要多个Thread 同时访问界面元素, 同一个Thread 来控制界面 和获取数据时最好的
    原因:同步对象 SynObj(可以使任何同步对象)
    假定:你的窗口在MainThread中创建,也就是说消息在MainThread中处理:
    MainThread
    {
      MsgLoop
      {
         case WM_XXXX:
              SynObj.Lock()
               ....
              SynObj.UnLock()
              break;
     } 
    }Thread_A 
    {
       SynObj.Lock()
       。
       GetCheckedRadio();
       。
       SynObj.Lock()
    }这2个Thread 同时运行 就有可能出现死锁现象,   GetCheckedRadio() 内部是通过SendMessage实现的,
    当Thread A SynObj.Lock() 锁定对象子后, MainThread 的 SynObj.Lock()进行等待状态,而Thread_A 的 GetCheckedRadio() 
    是通过SendMessage实现的  那么这个SendMessage 发送到MainThread的消息 就会放入MainThread的对列当中
    等待执行,而MainThread的MsgLoop一直处于等待状态无法取出消息进行处理,那么Thread A 的GetCheckedRadio(), 也进入了无限期等待状态, 所以这样就产生了一个死锁Thread