MFC多线程安全问题。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC多线程安全问题。相关的知识,希望对你有一定的参考价值。
有一个函数BroadcastMessage(),里面使用UDP方式广播消息,需要执行一定的时间。先后两次调用AfxBeginThread(BroadcastMessage,NULL);,但是两个线程运行时间有交叉。结果导致两个线程的广播都失败了。请问这个问题怎么解决?
可以不可以有一种方法,让后面要调用的线程等到前面的完成了才调用?
CEvent 类提供了对事件的支持。事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步
对象。例如在某些网络应用程序中,一个线程(记为A)负责监听通讯端口,另外一个线程(记为B)负责更
新用户数据。通过使用CEvent 类,线程A可以通知线程B何时更新用户数据。每一个CEvent 对象可以有两种
状态:有信号状态和无信号状态。线程监视位于其中的CEvent 类对象的状态,并在相应的时候采取相应的操
作。
在MFC中,CEvent 类对象有两种类型:人工事件和自动事件。一个自动CEvent 对象在被至少一个线程释
放后会自动返回到无信号状态;而人工事件对象获得信号后,释放可利用线程,但直到调用成员函数
ReSetEvent()才将其设置为无信号状态。在创建CEvent 类的对象时,默认创建的是自动事件。 CEvent 类的
各成员函数的原型和参数说明如下:
1、CEvent(BOOL bInitiallyOwn=FALSE,
BOOL bManualReset=FALSE,
LPCTSTR lpszName=NULL,
LPSECURITY_ATTRIBUTES lpsaAttribute=NULL);
bInitiallyOwn:指定事件对象初始化状态,TRUE为有信号,FALSE为无信号;
bManualReset:指定要创建的事件是属于人工事件还是自动事件。TRUE为人工事件,FALSE为自动事件;
后两个参数一般设为NULL,在此不作过多说明。
2、BOOL CEvent::SetEvent();
将 CEvent 类对象的状态设置为有信号状态。如果事件是人工事件,则 CEvent 类对象保持为有信号状
态,直到调用成员函数ResetEvent()将 其重新设为无信号状态时为止。如果CEvent 类对象为自动事件,则
在SetEvent()将事件设置为有信号状态后,CEvent 类对象由系统自动重置为无信号状态。
如果该函数执行成功,则返回非零值,否则返回零。 3、BOOL CEvent::ResetEvent();
该函数将事件的状态设置为无信号状态,并保持该状态直至SetEvent()被调用时为止。由于自动事件是
由系统自动重置,故自动事件不需要调用该函数。如果该函数执行成功,返回非零值,否则返回零。我们一
般通过调用WaitForSingleObject函数来监视事件状态。
你可以看看链接的资料,应该可以解决的
或者,定义个BOOL变量,当第一个线程执行完为TRUE,然后第二个线程查询它,当为TRUE是执行
参考资料:http://hi.baidu.com/hustwu/blog/item/73a735d1550b43d0562c844d.html
参考技术A criticalsection event mutex等等内核对象都可以,可以参见《windows核心编程》中关于线程同步方面的知识 参考技术B WaitForSingleObject,等获取指定条件后再运行用百度查 线程的同步与互斥 vc,然后参考一下人家的代码 参考技术C 解决不了,伤神
在多线程崩溃的 MFC 中使用 Techart activeX
【中文标题】在多线程崩溃的 MFC 中使用 Techart activeX【英文标题】:using Teechart activeX in MFC with multithreading crashed 【发布时间】:2016-04-14 08:16:25 【问题描述】:当我在MFC中使用teechart显示用户线程中的曲线时,它崩溃了。我想知道这个activeX是否可以支持多线程。
【问题讨论】:
【参考方案1】:TeeChart 不是线程安全的,因此您应该防止图表从一个线程重新绘制并同时从另一个线程修改。
【讨论】:
非常感谢。我找不到在多线程中使用 Techart 的演示。 @耶雷以上是关于MFC多线程安全问题。的主要内容,如果未能解决你的问题,请参考以下文章
在多线程崩溃的 MFC 中使用 Techart activeX
线程安全地构造 C++ 对象(MFC CRecordset)