在另一个线程上调用非静态类函数

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 的类,这样它就可以访问消息映射,真正简化了我的代码;

以上是关于在另一个线程上调用非静态类函数的主要内容,如果未能解决你的问题,请参考以下文章

异常处理流程图+多线程Thread类流程图+非静态方法调用

为什么类中的线程函数必须要声明静态

访问静态成员函数中的非静态成员的解决方法

MFC中静态成员函数调用其他类的非静态变量

c# 有调用一个类的静态方法,是不是执行这个类的构造函数

C++使用模板类调用非静态成员函数