首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程程序中的QPointer

多线程程序中的QPointer
EN

Stack Overflow用户
提问于 2011-09-28 19:50:07
回答 2查看 1.5K关注 0票数 3

根据http://doc.qt.io/qt-5/qpointer.html的说法,QPointer非常有用。但我发现,在以下情况下,它可能效率低下:

如果我想显示标签三次或做其他事情,我必须使用

if(label) label->show1(); if(label) label->show2(); if(label) label->show3();

而不是if(label) { label->show1();label->show2();label->show3(); }

仅仅因为标签可能在label->show2();.之后的另一个线程中被销毁

除了三个ifs之外,还有其他很好的方法来获得相同的功能吗?

另一个问题是,当标签在if(标签)之后被销毁,if(label) label->show1();是否仍然错误?

我没有多线程程序的经验。任何帮助都是非常感谢的。;)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-28 23:18:39

我认为唯一安全的方法是确保只从main/GUI线程(即运行Qt事件循环的线程,在QApplication:exec()中)访问QWidgets。

如果您有在不同线程中运行的代码,并且该代码希望显示/隐藏/任何其他代码,那么该代码需要创建一个QLabels对象(或其子类),并调用qApp->postEvent()将该对象发送到主线程。然后,当Qt事件循环在主线程中拾取并处理该QEvent时,您的代码就可以安全地对QLabels进行操作。

或者(或者更简单地说),您的线程代码可以发出一个跨线程信号(如描述的这里),并让Qt在内部处理事件发布。这对你来说可能更好。

票数 6
EN

Stack Overflow用户

发布于 2011-09-28 20:58:42

两种方法都不是线程安全的。有可能您的第一个线程将执行if语句,然后另一个线程将删除您的标签,然后您将在if语句和崩溃中。

Qt提供了许多线程同步结构,在您继续使用这个程序之前,您可能希望从QMutex开始并了解更多关于线程安全性的信息。

使用互斥对象将使您的函数看起来如下所示:

代码语言:javascript
复制
mutex.lock();
label1->show();
label2->show();
label3->show();
mutex.unlock()

只要您的其他线程使用的是锁定同一个互斥对象,那么它将阻止您在显示标签时删除它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7588775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档