我是第一次使用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都不刷新?
答案 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
}