我试图让线程在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
答案 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并从一个简单的示例开始。然后继续使用线程。线程处理会让您望而却步-尤其是如果在启动主程序之前启动线程,则可能会遇到各种问题。