QT多线程-从mainwindow.cpp中的线程内调用函数

时间:2020-04-11 19:20:01

标签: c++ qt

我试图让线程在testing()中每隔X秒调用一次函数mainwindow.cpp

我实现了一个名为AutoSaveThread的类。

头文件看起来像这样:

#ifndef AUTOSAVETHREAD_H
#define AUTOSAVETHREAD_H

#include <QtCore>

#include <unistd.h>

class AutoSaveThread : public QThread
{
public:
    AutoSaveThread(QObject*);
    void run();

signals:
    void callTest();


};

#endif // AUTOSAVETHREAD_H

.cpp方法看起来像文件,如下所示:

#include "autosavethread.h"

AutoSaveThread::AutoSaveThread(QObject *parent){
    connect(this, SIGNAL(callTest()), parent, SLOT(testing()));
}

void AutoSaveThread::run()
{
    while(true){
        sleep(3);
        emit callTest();
        // call autosave in mainwindow.cpp
    }
}


main.cpp是我创建线程的地方,

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    AutoSaveThread myThread(&w);
    myThread.start();
    w.show();
    return a.exec();
}

测试功能是:

void MainWindow::testing()
{
    qDebug()<<"nice";
}

当我尝试运行此代码时,我得到以下输出:

Undefined symbols for architecture x86_64:
  "AutoSaveThread::callTest()", referenced from:
      AutoSaveThread::run() in autosavethread.o
ld: symbol(s) not found for architecture x86_64

任何帮助将不胜感激!

编辑:

进行更改后,@ Jens建议我得到以下错误:

  "AutoSaveThread::callTest()", referenced from:
      AutoSaveThread::run() in autosavethread.o
  "vtable for AutoSaveThread", referenced from:
      AutoSaveThread::AutoSaveThread(QObject*) in autosavethread.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64

2 个答案:

答案 0 :(得分:0)

如果要每隔X秒在Qt中运行一个处理程序,则根本不需要创建线程。只需实例化一个QTimer,用QTimer::setInterval()设置所需的时间间隔,然后将QTimer::timeout信号连接到您要运行的插槽/处理器。

有关工作示例,请检查details section on QTimer's doc page

答案 1 :(得分:0)

第一件事:您没有运行程序,正在尝试对其进行编译,而您得到的是编译错误:您缺少callTest()的实现。

要使用信号和插槽,必须使用moc-compiler编译autosavethread.h的头。这将生成缺少的方法。

moc生成的文件必须进行编译并与其他源链接。

要使其正常运行,您的班级必须配备关键字Q_OBJECT:

class AutoSaveThread : public QThread
{
   Q_OBJECT
public:

建议:使用Qt Creator并从一个简单的示例开始。然后继续使用线程。线程处理会让您望而却步-尤其是如果在启动主程序之前启动线程,则可能会遇到各种问题。