【问题标题】:Calling a non-static class function on another thread在另一个线程上调用非静态类函数
【发布时间】:2011-03-23 03:43:15
【问题描述】:

我重写了我很久以前写的一些代码。 该代码是一个使用AfxBeginThread 启动另一个工作线程的类。当线程结束时,它需要将它的工作返回给调用类。

实际上,当线程结束时,它会通过PostMessage 将消息及其结果发送给被调用的类。 但这种方式确实依赖于 MFC,为此我的班级必须实现所有 MFC 的东西。

如果直接调用这个类的非静态方法而不是发送消息可能是正确的?

【问题讨论】:

    标签: c++ multithreading 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 的类,这样它就可以访问消息映射,真正简化了我的代码;
    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2014-07-13
    • 2014-10-28
    • 1970-01-01
    相关资源
    最近更新 更多