C++ 在另一个QThread上运行成员方法时,无法向其他线程拥有的对象发送事件

C++ 在另一个QThread上运行成员方法时,无法向其他线程拥有的对象发送事件,c++,multithreading,qt,signals-slots,qthread,C++,Multithreading,Qt,Signals Slots,Qthread,我需要在MainWindow类中的不同线程中运行一个方法,因为这是一个耗时的过程 这就是我所尝试的: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { initGui(ui); // Create background worker thread backgroundWorker = QThread::create([this]

我需要在MainWindow类中的不同线程中运行一个方法,因为这是一个耗时的过程

这就是我所尝试的:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    initGui(ui);

    // Create background worker thread
    backgroundWorker = QThread::create([this] {
        backgroundMethod();
    });

    // Define when finished with work
    connect(backgroundWorker, &QThread::finished, [this] () {
        qDebug() << "Background method has finished";

        // Stop movie
        ui->lblLoading->movie()->stop();

        // go to next screen
        ui->tabbarMainWidget->tabBar()->setCurrentIndex(1);

        //show backup icon files
        if(filesToBackup.size() > 0) {
            qDebug() << "There are files to backup!";
            ui->lblInfoImage->show();
        }
    });

    // Start worker thread
    backgroundWorker->start();
}
MainWindow::MainWindow(QWidget*父项):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
initGui(ui);
//创建后台工作线程
backgroundWorker=QThread::create([this]{
背景方法();
});
//定义完成工作的时间
connect(backgroundWorker,&QThread::finished,[this](){
qDebug()lblLoading->movie()->stop();
//转到下一屏幕
ui->tabbarMainWidget->tabBar()->setCurrentIndex(1);
//显示备份图标文件
如果(filesToBackup.size()>0){
qDebug()lblInfoImage->show();
}
});
//启动工作线程
backgroundWorker->start();
}
背景方法

void MainWindow::backgroundMethod() {
    for (int i = 0; i < 10; i++) {
        qDebug() << "Hello World";
    }
}
void主窗口::backgroundMethod(){
对于(int i=0;i<10;i++){

qDebug()问题很简单:您在非UI线程上执行UI代码,这在Qt(以及许多其他跨不同语言的UI框架)中是严格禁止的。发生这种情况是因为您连接错误:

connect(backgroundWorker, &QThread::finished, [this] () {
    ...
});
该连接意味着:每当
QThread
发出
finished
信号时,运行该函数。问题是,它将在发出信号的上下文中运行该函数,该信号是线程
backgroundWorker
所在的另一个线程。因此,您必须提供UI线程上下文以接收该信号:

connect(backgroundWorker, &QThread::finished, this, [this] () {
        ...
    });

现在,提供的函数将在UI线程的上下文中执行(
this
).

显示
backgroundMethod
方法。@eyllanesc updated您的代码没有帮助,再次提供更新的…背景方法内容应该没有任何区别。这是一个关于使用不同线程的信号/插槽机制的问题。backgroundThread的内容没有本质。我建议您的代码不是MRE如果您需要帮助,请慢慢来,提供您所需要的。感谢您的解释。我理解[这]是为workerThread提供访问UI线程的上下文。因此,我感到困惑。我查看了
std::Thread
示例,注意到上下文是单独传入的。我们将尝试下一步。谢谢!@KGCybeX在Qt真正获得回报之前,不要将
std::Thread
与Qt一起使用。并阅读循环、事件和nd线程在Qt中交互。这将是一个良好的开端。