QPointer在多线程程序中

时间:2011-09-28 19:50:07

标签: multithreading qt qpointer

根据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->show1();label->show2();.

之后标签可能会在另一个帖子中被销毁

除了三个ifs之外,还有一种漂亮的方法可以获得相同的功能吗?

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

我没有多线程程序的经验。任何帮助表示赞赏。 ;)

2 个答案:

答案 0 :(得分:6)

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

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

或者(也许更简单),你的线程代码可以发出一个跨线程信号(如here所述)并让Qt在内部处理事件发布。这可能对你的目的更好。

答案 1 :(得分:0)

您的方法都不是线程安全的。您的第一个线程可能会执行if语句,然后另一个线程将删除您的标签,然后您将进入if语句并崩溃。

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

使用互斥锁会使你的函数看起来像这样:

mutex.lock();
label1->show();
label2->show();
label3->show();
mutex.unlock()

只要您的其他主题使用锁定相同的互斥锁对象,就会阻止您在显示标签时删除标签。