如何倾听一个“声音”;“已完成”;将执行移动到Qt中的另一个线程后的指示

如何倾听一个“声音”;“已完成”;将执行移动到Qt中的另一个线程后的指示,qt,qthread,Qt,Qthread,我有一个非GUI操作,我打算在工作线程中执行。 在谷歌搜索之后,我想出了一个简单的方法来实现这一点 特别是QMetaObject::invokeMethod()非常适合我。我还注意到没有对QThread进行子分类,而是对QObject进行子分类以创建我的worker对象,然后将该对象的线程关联性移动到新创建的线程。(详细说明 现在我的问题是: 我将从我的主线程开始排队方法(我想象这是在使用QEventLoop的情况下发生的,即使我没有设置QEventLoop,即使我没有重新实现QThread::

我有一个非GUI操作,我打算在工作线程中执行。 在谷歌搜索之后,我想出了一个简单的方法来实现这一点

特别是
QMetaObject::invokeMethod()
非常适合我。我还注意到没有对QThread进行子分类,而是对QObject进行子分类以创建我的worker对象,然后将该对象的线程关联性移动到新创建的线程。(详细说明

现在我的问题是:

我将从我的主线程开始排队方法(我想象这是在使用QEventLoop的情况下发生的,即使我没有设置QEventLoop,即使我没有重新实现
QThread::run()
或调用
QThread::exec()
) 我需要知道我的工作者何时完成了处理。换句话说,我需要知道QEventLoop何时为空。我想我可以使用signal finished()来实现这一点。但它似乎不起作用。 有人能告诉我们如何发现工作线程何时完成了执行吗? 如果您需要更多信息/代码,请告诉我

类插件是QObject的一个子类

Plugin::Plugin()
{
    m_workerThread = new QThread(this);
    m_workerThread->start(QThread::IdlePriority);
    m_worker = new DataWorker(this);
    connect(m_workerThread, SIGNAL(finished()), m_worker, SLOT(deleteLater()));    
    m_worker->moveToThread(m_workerThread);
}


因此,当没有更多的UpdateDataToDB和RunfProctGetData剩下来处理时,我需要一个触发器,您不需要重新实现QThread::run(),您的代码就可以了。默认的run()将执行事件循环,并将执行排队的Dataworker插槽(Qt:QueuedConnection).Loop无限执行,直到您使用thread->quit()显式停止它

我建议您向Dataworker类发送一些通知信号,这些信号将从RunFProcToGetData()、updateDataTaintodb()发出,以便您可以将updateData()中最后调用的方法的通知信号连接到所需的插槽(可能在插件中)。该连接也将排队(如果对象在不同线程中运行,则默认为Qt:QueuedConnection)

这样,当updateData()中的所有排队方法完成执行时,您将收到通知。您可以多次调用updateData();m_workerThread将运行排队的Dataworker插槽或处于空闲状态。请记住停止线程,并在插件的析构函数中等待它完成:

Plugin::~Plugin() {
    ...
    m_workerThread_->quit();
    m_workerThread_->wait();
    ...
}

发布一些代码我不知道你在说什么在线程中简单地调用
quit()
是否会导致
终止()
要发出的信号?当然,除非您想让工作进程始终处于活动状态,否则您必须创建自己的信号。@cmannett85:我希望工作进程处于活动状态,并且在创建自己的信号和发出信号时没有任何问题。但是我如何知道何时调用quit()在线程中?为此,我应该查看QEventLoop内部,该QEventLoop在创建线程后会自动设置。没有找到任何API。
m_worker=new DataWorker(this);
。删除
this
。移动到线程()如果设置了父对象,则将失败。文档说。此外,Qt父对象系统用于使对象可以自动作用于其他对象(当它被删除、显示小部件等时)。因此,您有一个线程执行
m_worker.foo();
,而另一个线程由于插槽而执行
m_worker.bar
:竞争条件。
Dataworker::RunProcToGetData(const QString &foo)
{
// invoke a program to get the Data
}


Dataworker::updateDataIntoDB(const QSqlDatabase& db, const QString &foo)
{
// Update database 
}
Plugin::~Plugin() {
    ...
    m_workerThread_->quit();
    m_workerThread_->wait();
    ...
}