多线程程序中的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();.之后的另一个线程中被销毁

除了三个if之外,还有什么更好的方法来获得相同的功能吗?

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

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

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

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

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

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

Qt提供了许多线程同步结构,在继续使用这个程序之前,您可能想从QMutex开始学习更多关于线程安全的知识。

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

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

只要你的其他线程正在使用锁定相同的互斥对象,那么它将阻止删除你的标签,而你正在显示它们

相关内容

  • 没有找到相关文章

最新更新