k_z*_*r_k 3 c++ qt multithreading
我有代码:
#include <iostream>
#include <QThread>
#include <unistd.h>
#include <stdlib.h>
#include <QApplication>
using std::cerr;
using std::endl;
class Thread : public QThread
{
Q_OBJECT
public:
Thread();
~Thread();
void setMessage(const QString &_message);
void stop();
protected:
void run();
private:
QString message;
volatile bool stopped;
};
Thread::Thread()
{
stopped = false;
run();
}
Thread::~Thread()
{
}
void Thread::run()
{
while(!stopped){
cerr << qPrintable(message);
sleep(1);
}
stopped = false;
cerr << endl;
}
void Thread::stop()
{
stopped = true;
}
void Thread::setMessage(const QString &_message)
{
message = _message;
}
int main(int argc,char *argv[])
{
QApplication app(argc, argv);
Thread *A,*B;
A = new Thread();
B = new Thread();
A->setMessage("Thread A\n");
B->setMessage("Thread B\n");
//.run();
//.run();
sleep(10);
A->stop();
B->stop();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我有错误
g++ -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-O1 -o tmp main.o -L/usr/lib -lQtGui -lQtCore -lpthread
main.o: In function `Thread::~Thread()':
main.cpp:(.text+0xa): undefined reference to `vtable for Thread'
main.o: In function `Thread::Thread()':
main.cpp:(.text+0x1da): undefined reference to `vtable for Thread'
collect2: ld returned 1 exit status
make: *** [tmp] Error 1
Run Code Online (Sandbox Code Playgroud)
vip*_*ipw 10
您必须使用moc生成标头.这可以使用Qt构建系统自动完成.您应该使用qmake文件而不是直接使用gcc.
你也应该把声明和代码分成头文件和cpp文件.
以下是moc所做的描述:http://doc.qt.nokia.com/latest/moc.html
stackoverflow上有一个类似的问题(有答案): 对vtable的未定义引用.试图编译一个Qt项目
您需要在源文件的底部有一行:
#include "main.moc"
Run Code Online (Sandbox Code Playgroud)
那是因为声明class Thread不在标题中 - 它在.cpp文件中.所以默认情况下moc不会在它上面运行.添加该行有两个作用:
qmake,并moc认为moc必须处理.cpp文件moc生成的东西被编译步骤拉入因此,在添加该行之后,您需要重新运行,qmake以便更新makefile main.moc以使其生成.
通常,moc针对头文件运行并创建包含在构建中的.cpp文件(qmake见此).这个"技巧" moc也会导致问题在.cpp文件上运行(以及moc编译生成的代码).
包含main.moc在最后的另一种方法main.cpp是将定义移动class Thread到.h头文件#include中.如果定义在标题中qmake并且moc应该自动处理.
| 归档时间: |
|
| 查看次数: |
8265 次 |
| 最近记录: |