Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 多线程中的Qt代码序列。这可能吗?_Multithreading_Qt_Qthread - Fatal编程技术网

Multithreading 多线程中的Qt代码序列。这可能吗?

Multithreading 多线程中的Qt代码序列。这可能吗?,multithreading,qt,qthread,Multithreading,Qt,Qthread,这是objectA,它的子类是QThread void run() { while (continue) emit query(); } void work(int input, bool workdone) { // work hard here if (workdone) { continue = false; } } 这是主对象中的一些代码 { ObjectA A* = new ObjectA(this); connect(A

这是objectA,它的子类是QThread

void run()
{
    while (continue)
        emit query();
}

void work(int input, bool workdone)
{
     // work hard here
     if (workdone) { continue = false; }
}
这是主对象中的一些代码

{
    ObjectA A* = new ObjectA(this);
    connect(A, SIGNAL(query()), this, SLOT(handleQuery()));
    objectA.start();
}

void handleQuery()
{
    A.work(interger, allJobDONE);
}
好的,我不知道该怎么命名这个问题。基本上,它只是“这个代码会工作吗?”如果是的话,代码序列会是怎样的

让我解释一下我的问题。ObjectA是一个线程。它将通过发出一个查询信号来不时地查询信息。当主代码对查询信号进行除根时,主代码通过调用
work()
函数来决定是否存在作业,以便将作业发送到ObjectA。
如果此代码起作用,则同一对象中的
run()
work()
函数同时起作用。这可能吗?

有几个问题:

  • 函数
    ObjectA::run()
    阻塞线程的事件循环
  • A.work()
    是从错误的线程调用的
  • 需要考虑适当删除
    A
与其在
run()
循环时阻塞
,不如使用计时器。但是,在这种情况下,应该执行线程事件循环(它是在
QThread::run()
的默认实现中完成的)。因此,应该使用其他一些成员槽来启动该任务,例如:

void ObjectA::doLoop()
{
    emit query();
    QTimer::singleShot(0, this, SLOT(doLoop()));
}
该函数应该在线程启动时调用,例如,可以通过连接
ObjectA
constructor:

connect(this, SIGNAL(started()), this, SLOT(doLoop()));
最好保持私有指针
QTimer*
,以便能够停止计时器的
work()
或使用其他控件。请注意,在这种情况下
QTimer
对象应与
ObjectA
位于同一线程中

通常情况下,
ObjectA::work()
函数应该由来自
handleQuery()
的一些信号触发。
ObjectA
的事件循环将捕获该信号,
work()
将在
ObjectA
线程中启动。

A.work()将在(main?)中运行线程,这真的是您想要的吗?如果是,那么work()不应该在ObjectA中。