在另一个线程上调用非静态类函数
Posted
技术标签:
【中文标题】在另一个线程上调用非静态类函数【英文标题】:Calling a non-static class function on another thread 【发布时间】:2011-03-23 03:43:15 【问题描述】:我重写了我很久以前写的一些代码。
该代码是一个使用AfxBeginThread
启动另一个工作线程的类。当线程结束时,它需要将它的工作返回给调用类。
实际上,当线程结束时,它会通过PostMessage
将消息及其结果发送给被调用的类。
但这种方式确实依赖于 MFC,为此我的班级必须实现所有 MFC 的东西。
如果直接调用这个类的非静态方法而不是发送消息可能是正确的?
【问题讨论】:
【参考方案1】:与其尝试直接调用一个方法(这将引入一套全新的线程问题),不如尝试使用本机 Win32 ::PostMessage()
而不是同一函数的 MFC 实现。任何线程都可以调用::PostMessage()
将消息安全地传递给另一个线程。
【讨论】:
我应该如何接收这条消息?我的类不是 MFC 派生的。 @bratao:使用 Windows 程序的正常消息循环(我认为)。 你说你用AfxBeginThread
启动线程,这是一个MFC函数。无论如何,Xeo 是对的,它只是进入您的消息循环的常规消息,但是您可以处理它(MFC 与否)。
我将我的课程转换为基于 CWnd 的课程。如果我没有消息映射,那就太在意了【参考方案2】:
听起来好像您想使用常规线程原语,而不是窗口消息原语。
您使用的是哪个版本的AfxBeginThread
?如果你将一个类实例传递给它,你应该能够在知道它完成运行后直接访问该类的成员。如果您向它传递了一个函数指针,您可以使用 lParam 参数传递任何类指针,然后将其用作通信上下文。
您只想确保在访问类时以线程安全的方式进行。如果你等到线程结束,你应该没问题。否则,您可以使用关键部分或互斥锁。请参阅MSDN article on thread synchronization primitives 了解更多信息。
【讨论】:
进入这个班级后,它会做很多事情,包括绘画和绘画。如果我在另一个线程中调用一个类函数,它不会返回到主线程,而是会保持 2 个线程在做事,这真的很危险。我选择将我的类转换为基于 CWnd 的类,这样它就可以访问消息映射,真正简化了我的代码;以上是关于在另一个线程上调用非静态类函数的主要内容,如果未能解决你的问题,请参考以下文章