是否可以创建一个从不同类调用函数的线程?

Posted

技术标签:

【中文标题】是否可以创建一个从不同类调用函数的线程?【英文标题】:Is it possible to create a thread that calls a function from a different class? 【发布时间】:2020-06-25 03:09:45 【问题描述】:

我正在开发一个 C++11 多线程 GUI 程序。

所以我有 DevToolsMainWindow 类。我想从MainWindow clicked() 事件函数中调用属于DevTools 的函数。 (所有对象定义都是在类的定义上创建的)。

MainWindow 调用 Obtain_XY_Thread 时的函数:

void MainWindow::on_obtain_xy_clicked()

    DevTools.Obtain_XY_Thread();

所以DevTools::Obtain_XY_Thread() 被调用,它创建了一个Obtain_XY 的线程,但我真正想要的是直接调用Obtain_XY

void DevTools::Obtain_XY_Thread()

    thread obtain_xy(&DevTools::Obtain_XY, *this);
    obtain_xy.detach();


void DevTools::Obtain_XY()

    for(int i=0;i<500;i++)
        //does something
    

这可行,但我认为这不是正确的方法。有什么方法可以调用Obtain_XY 而无需创建另一个函数?如何直接在MainWindow::on_obtain_xy_clicked() 上创建线程?

【问题讨论】:

【参考方案1】:

这只是通过添加std::thread来解决的:

void MainWindow::on_obtain_xy_clicked()

    std::thread obtain_xy(&DevTools::Obtain_XY, &DevTools);
    obtain_xy.detach();

【讨论】:

这里不需要class。您已将等效代码从 DevTools::Obtain_XY_Thread 移动到 MainWindow::on_obtain_xy_clicked 如果没有 class 怎么办?我试图不使用它,但出现以下错误:“must use 'class' tag to refer to type 'thread' in this scope”,所以我添加了它。 您还有其他对名为thread 的范围可见的内容吗?或者使用它的实际名称,std::thread 添加 std::thread 反而效果很好。我试过using namespace std;thread 似乎没有受到影响。这是有原因的吗? 您还有其他名为thread 的东西、函数、全局变量或类成员吗?

以上是关于是否可以创建一个从不同类调用函数的线程?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jasmine 在 AngularJS 中测试去抖函数从不调用该函数

其他信息: 线程间操作无效: 从不是创建控件“控件名”的线程访问它。

跨线程访问控件的问题和编程方法

在C ++中,是否有任何理由产生并立即加入一个线程,而不是直接调用该函数?

python中如何对类的成员函数开启线程?

MATLAB:OOP 调用不同类的函数