C++ Qt线程同步设计
我有一个设计问题,这已经困扰了我很长一段时间了。基本上,我有一个需要很长时间才能执行的功能和一个需要响应和更新的gui。当用户点击开始按钮时,long函数开始在while循环中执行,每次执行后都需要更新gui 我认为最好的方法是在while循环中运行QThread,如果用户按下start按钮,long函数将开始执行。与以下内容类似:C++ Qt线程同步设计,c++,multithreading,qt,user-interface,thread-safety,C++,Multithreading,Qt,User Interface,Thread Safety,我有一个设计问题,这已经困扰了我很长一段时间了。基本上,我有一个需要很长时间才能执行的功能和一个需要响应和更新的gui。当用户点击开始按钮时,long函数开始在while循环中执行,每次执行后都需要更新gui 我认为最好的方法是在while循环中运行QThread,如果用户按下start按钮,long函数将开始执行。与以下内容类似: class Application : public QThread { void run (void) { while (!mEx
class Application : public QThread
{
void run (void)
{
while (!mExiting)
{
if (StartPressed)
LongFunction();
// Need to update gui before
// running long function again
}
}
}
我尝试使用BlockingQueuedConnection执行QMetaObject::Invoke,但是,当gui应用程序退出时,线程会被卡住,永远不会退出。我还尝试使用QMutex,但是,在等待长函数锁定并使用的互斥量时,gui会被锁定
我在想,当应用程序想要退出时,有没有办法取消BlockingQueuedConnection,或者有没有其他方法来实现这一点。你很接近了,但你不需要从
QThread
继承。相反:
QObject
中的插槽中Q_slot void finish();
)QThread
的实例。调用myObject->moveToThread(myThread)
gui
发送stop()
信号,请设置以下连接:
连接(gui、信号(stop())、myObject、插槽(finish())
-停止计算连接(gui、信号(stop())、myObject->thread()、插槽(quit())
-以结束线程中的事件循环connect(myObject->thread(),SIGNAL(finished()),myObject->thread(),SLOT(deleteLater())
-在run()方法返回时删除线程
myObject->thread()中删除myObject,则删除myObject是错误的
非零:您不能删除线程关联性与当前线程不同的对象。零线程关联性意味着没有线程声明该对象-在我们的例子中,当对象的线程被破坏时。然后任何线程都可以删除它
出于同样的原因,您不能moveToThread
有父对象的对象。但是,您移动的对象可以有子对象,但它本身不能有父对象