由于程序中需要读大量的数据,并靠这些数据,建立对应的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住以后,这个读数据的线程好象就不往下执行了。
在主线程中:
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住以后,这个读数据的线程好象就不往下执行了。
解决方案 »
- 【问题贴】关于一个小游戏中问题,没发现问题所在,可就是会出错。
- 如何取得整个屏幕的矩形坐标?(或者长度和宽度也行)
- 求帮助啊!!!
- 关于MSChart控件调用
- 如何快速查找文件并快速删除
- 如何在多个文档模板间进行切换
- 我想把dll放到资源中,如何获取资源中的dll的函数指针呢?
- 请帮我看一下代码,我本来用C方式编译是没问题的?
- 关于SQLConfigDataSource和CopyFile()的问题!
- 关于论坛规则:有人得一个三角形,有人得五个三角形,还有人得一个红星,还有人得两个红星,这是按照什么规则分类的?以信誉值,还是以分
- 一个c++函数
- 从VC++ 6到VC.net的过程中,我们程序员应该如何做,两者之间的区别有本质区别吗?
在子线程中对CTreectrl进行操作时,内部还有可能走的是消息。
而你的消息是要在主线程中处理。
这样当主线程等待时, 子线程也无法工作了。简单使用个变量表示子线程还在工作就可以了。
主线程中查一下变量, 若是子线程在工作,
就简单返回, 不切换就行了。
_______________
会吗?切换界面会销毁TREECTRL??不信.
If the target thread is allocating memory from the heap, the heap lock will not be released.
而且微软也不推荐这样使用。rtdb(东临碣石) 给的方法不断监测标志,是不是效率低了点?还有没有更好的办法呢?