由于程序中需要读大量的数据,并靠这些数据,建立对应的CTreectrl.所以用了多线程。 现在的问题是,在这个读取数据的这个线程中,这个从主线程传过去的ctreectrl指针,可能会在读取线程的insertitem结束之前,已经被销毁了(可能切换到另一个界面之类)。我想通过CEvent进行同步。大致思路如下:
在主线程中:
m_can_change.ResetEvent();
AfxBeginThread(Afx_CaseCustomer_LoadData,this,THREAD_PRIORITY_NORMAL);
在辅助线程中:
UINT Afx_CaseCustomer_LoadData(LPVOID lparam)
{
insertitem
.
.
.
.
.
extern CEvent m_can_change;
m_can_change.SetEvent();
}在主线程的切换线程中 (CMainframe)
extern CEvent m_can_change;
::WaitForSingleObject(m_can_change,INFINITE);
m_can_change.SetEvent();
         切换();可是,当我模拟如上所说的操作时,一旦主线被WaitForSingleObject住以后,这个读数据的线程好象就不往下执行了。

解决方案 »

  1.   

    这是有可能的。
    在子线程中对CTreectrl进行操作时,内部还有可能走的是消息。
    而你的消息是要在主线程中处理。
    这样当主线程等待时, 子线程也无法工作了。简单使用个变量表示子线程还在工作就可以了。
    主线程中查一下变量, 若是子线程在工作,
    就简单返回, 不切换就行了。
      

  2.   

    to  tabby(内存泄漏) :杀掉子线会不会造成内存泄露?
      

  3.   

    可能会在读取线程的insertitem结束之前,已经被销毁了(可能切换到另一个界面之类)。
    _______________
    会吗?切换界面会销毁TREECTRL??不信.
      

  4.   

    对,是会造成内存泄漏:
    If the target thread is allocating memory from the heap, the heap lock will not be released. 
    而且微软也不推荐这样使用。rtdb(东临碣石) 给的方法不断监测标志,是不是效率低了点?还有没有更好的办法呢?