根据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();是否仍然错误?
我没有多线程程序的经验。任何帮助都是非常感谢的。;)
发布于 2011-09-28 23:18:39
我认为唯一安全的方法是确保只从main/GUI线程(即运行Qt事件循环的线程,在QApplication:exec()中)访问QWidgets。
如果您有在不同线程中运行的代码,并且该代码希望显示/隐藏/任何其他代码,那么该代码需要创建一个QLabels对象(或其子类),并调用qApp->postEvent()将该对象发送到主线程。然后,当Qt事件循环在主线程中拾取并处理该QEvent时,您的代码就可以安全地对QLabels进行操作。
或者(或者更简单地说),您的线程代码可以发出一个跨线程信号(如描述的这里),并让Qt在内部处理事件发布。这对你来说可能更好。
发布于 2011-09-28 20:58:42
两种方法都不是线程安全的。有可能您的第一个线程将执行if语句,然后另一个线程将删除您的标签,然后您将在if语句和崩溃中。
Qt提供了许多线程同步结构,在您继续使用这个程序之前,您可能希望从QMutex开始并了解更多关于线程安全性的信息。
使用互斥对象将使您的函数看起来如下所示:
mutex.lock();
label1->show();
label2->show();
label3->show();
mutex.unlock()只要您的其他线程使用的是锁定同一个互斥对象,那么它将阻止您在显示标签时删除它们。
https://stackoverflow.com/questions/7588775
复制相似问题