QPointer在多线程程序中

ech*_*cho 3 qt multithreading 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();仍然是错误的吗?

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

Jer*_*ner 6

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

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

或者(也许更简单),你的线程的代码能够生成一个跨线程信号(如描述在这里),并让Qt的内部处理事件发布.这可能对你的目的更好.