moveToThread方法本质上就是将一个对象放在线程上去执行了
QThread官网文档
moveToThread文档
这里把我认为文档中需要注意的内容摘出来
- 一定要通过槽函数的形式去调用函数,
- 要注意!你创建的QThread对象实例,仍然存活在主线程上,而非子线程。所以如果你直接调用其中的函数,那么还是在主线程上运行的。
- 该方法并不是线程安全的。
注意事项
目前来看,moveToThread
似乎是将主线程中的对象复制了一份到子线程,因为当我退出子线程的时候,他居然调用了这个对象的析构函数,而调用析构函数时的线程ID是子线程的ID。
- 退出子线程
subThread.quit()
析构写法
Worker::~Worker()
{
qDebug() << " dector"<<"thread id"<<QThread::currentThreadId();
}
Qt多线程操作数据库
注意事项
- 一定要注意,
QSqlDatabase
不能跨线程使用,也就是一定要在本线程创建QSqlQuery
对象。如果想在主进程中创建好数据直接调用子进程中的数据库操作,目前只能在主进程中创建QString
,然后传到子进程中,在子进程中的再创建query,然后执行。