c++ - QThreads - 为什么在构造函数中分配内存而不是拥有普通的类成员?
问题描述
http://doc.qt.io/qt-5/qthread.html
class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
connect(this, &Controller::operate, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &Controller::handleResults);
workerThread.start();
}
我的方式:
class Controller: public QObject
{
Q_OBJECT
public:
Worker objWorker;
QThread objQThread;
Controller();
~Controller();
public slots:
void receiveImage();
};
和
Controller::Controller()
{
objWorker.moveToThread( &objQThread );
connect( &objWorker, &Worker::imageReady, this, &Controller::receiveImage );
objQThread.start();
}
他们的方法在某些方面比我的更好吗?在哪种情况下应该首选哪个?
解决方案
来自:http ://doc.qt.io/qt-5/qthread.html
从 Qt 4.8 开始,可以通过将 finished() 信号连接到 QObject::deleteLater() 来释放刚刚结束的线程中的对象。
这只能通过创建 Worker 类的指针对象并为其分配内存来实现。
推荐阅读
- java - 导入 com.google.api 无法解决
- python - Paramiko 频道发送请求以远程启动跟踪
- c - C 字符无缘无故地加起来
- visual-studio - 从 VS WSL 构建事件中获取输出
- javascript - 在 iOS 移动版 Safari 13(iPhone X 和 11)中隐藏全屏 Web 应用程序的状态/位置栏
- java - 扫描输入并再次启动循环或关闭它
- javascript - 如何使用 knockout.js 在 asp.net mvc 中设置选定的选项?
- python - Python 池不能在 Windows 中工作,但在 linux 中工作
- python - 像矩阵一样更改列表列表
- javascript - VueJS 嵌套导航 3 级