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->show1();被销毁或label->show2();.

除了三个 if 之外,还有其他漂亮的方法来获得相同的功能吗?

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

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

4

2 回答 2

6

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

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

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

于 2011-09-28T23:18:39.610 回答
1

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

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

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

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

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

于 2011-09-28T20:58:42.177 回答