QT添加项目触发器重绘,而不是冻结

时间:2016-01-18 11:46:49

标签: qt

我是第一次使用QT,在添加元素时刷新GUI时出现了一些问题。

守则看起来像:

integration.response.body.Location

使用PObj :: process定义:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

   PObj obj;
   MainWindow mw;
   qRegisterMetaType<std::string>();

   QObject::connect(&obj, SIGNAL(setText(std::string const&)),
                    &mw, SLOT(appendText(std::string const&)));

   QFuture<void> f1 = QtConcurrent::run(&obj, &PObj::process);
   mw.show();

    f1.waitForFinished();

    return a.exec();
}

MainWindow :: appendText插槽:

void PObj::process()
{
for(; ;)
{
    sleep(1);

    //do work and set text
     std::string text = "bla";
     emit setText( text );
}
}

我尝试过放置qApp-&gt; processEvents(),QCoreApplication :: processEvents(); ...在ThreadPool中运行未来。

我以为用Concurrent :: run运行它们就够了吗?

更新

问题是,为什么每次添加新项目时GUI都不刷新?

1 个答案:

答案 0 :(得分:0)

f1.waitForFinished();调用阻塞,直到f1完成,顾名思义。这永远不会发生,因为你有无限循环。所以你的代码永远不会进入主循环。你不能像这样阻止主线程!通常,请避免使用任何WaitForXxxx()方法,尤其是GUI线程。

另外,你无法阻止process();无论如何,所以等待它完成没有任何意义......你可能想要添加一种方法告诉它停止(例如原子变量)但是无论如何,为了解决你的问题,只需删除{{ 1}}行。

要很好地终止任务,请尝试添加f1.waitForFinished();标志( volatile boolean,它不会做),然后更改代码:

将成员变量添加到QAtomicInt(应该将其设为私有并添加setter):

PObj

像这样改变主要:

    QAtomicInt termianteFlag;

int main(int argc, char *argv[])
{
    ///snip

    QFuture<void> f1 = QtConcurrent::run(&obj, &PObj::process);
    mw.show();

    int ret = a.exec();
    f1.terminateFlag = 1; // change this to setter method
    f1.waitForFinished(); // this is not ideal, will wait for up to a second before exit

}