Qt中QRunable继承QObject出现的问题

QT项目中有一个功能,需要把数据库的数据中加载出来然后在界面上显示出来,由于需要加载的数据表比较多,所有优先想到了使用多线程来加载数据库。

1.定义一个类继承QRunable接口,我还想让它可以发送信号,以便可以观察加载的进度,同时这个类也要继承QObject,不要忘了加上宏 Q_OBJECT

头文件

class LoadTableRunable : public QRunnable, public QObject {
	Q_OBJECT

public:
	LoadTableRunable(QObject *parent);
	~LoadTableRunable();
	void run();
signals:
	void sigRunableLoadTaskMsg(int, void*);//线程加载过程中的信息
};

CPP文件

LoadTableRunable::LoadTableRunable(QObject *parent)
: QObject(parent) {
}

LoadTableRunable::~LoadTableRunable() {

}

void LoadTableRunable::run() {

}

编译一下:

1>  moc_LoadTableRunable.cpp
1>GeneratedFiles\moc_LoadTableRunable.cpp(87): error C2039: “staticMetaObject”: 不是“QRunnable”的成员
1>c:\qt\qt5.7.0\5.7\msvc2013\include\qtcore\qrunnable.h(48) : 参见“QRunnable”的声明
1>GeneratedFiles\moc_LoadTableRunable.cpp(104): error C2039: “qt_metacast”: 不是“QRunnable”的成员
1>c:\qt\qt5.7.0\5.7\msvc2013\include\qtcore\qrunnable.h(48) : 参见“QRunnable”的声明
1>GeneratedFiles\moc_LoadTableRunable.cpp(109): error C2039: “qt_metacall”: 不是“QRunnable”的成员
1>c:\qt\qt5.7.0\5.7\msvc2013\include\qtcore\qrunnable.h(48) : 参见“QRunnable”的声明

嗯?这是怎么回事?明明已经继承QObject这个类,同是也添加了Q_OBJECT这个宏,怎么还会报错呢?

原来是需要把QRunable和QObject交换一下位置就可以了。

class LoadTableRunable : public QObject , public QRunnable {
	Q_OBJECT

public:
	LoadTableRunable(QObject *parent);
	~LoadTableRunable();
	void run();
signals:
	void sigRunableLoadTaskMsg(int, void*);//线程加载过程中的信息
};

应该是先写继承 QObject 然后在继承 QRunable,这样编译就通过了。

2.如何运行这个线程呢?通过线程池来管理

//数据1线程
LoadTableRunable* deviceRunable = new LoadTableRunable(parentObj);
connect(deviceRunable, SIGNAL(sigRunableLoadTaskMsg(int, void*)), loadTaskManager, SLOT(slotResult(int, void*)), Qt::BlockingQueuedConnection);
QThreadPool::globalInstance()->start(deviceRunable);

//数据2线程
LoadTableRunable* trackRunable = new LoadTableRunable(parentObj);
connect(trackRunable, SIGNAL(sigRunableLoadTaskMsg(int, void*)), loadTaskManager, SLOT(slotResult(int, void*)), Qt::BlockingQueuedConnection);
QThreadPool::globalInstance()->start(trackRunable);

QThreadPool::globalInstance()->waitForDone();//等待所有线程运行完成后退出

以上就完成了通过线程池来调用线程的过程!

你可能感兴趣的:(qt,线程)