在我的代码中的某个时刻,我有:
QThread* thread = new QThread;
Beacon *beacon = new Beacon(beg, end);
beacon->moveToThread(thread);
有一天,我读到了有关智能指针的文章。如果我理解,它可能适合上面的代码,我尝试过:
std::unique_ptr<QThread> thread {new QThread};
std::unique_ptr<Beacon> beacon {new Beacon(beg, end)};
beacon->moveToThread(thread);
这导致:
error: no viable conversion from 'std::unique_ptr<QThread>' to 'QThread *'
beacon->moveToThread(thread);
怎么了?
您需要将原始指针 (
Qthread *
) 传递给 moveToThread
。您必须使用 unique_ptr::release
(thread.release()
) 或 unique_ptr::get
(thread.get()
) 来获取原始指针,具体取决于您想要实现的目标。
在我的项目中,我是这样使用qthread的
使代码在单独的线程中运行的另一种方法是子类化 QThread 并重新实现 run()
这是我对
std::unique_ptr
和 Qthread
的使用
std::unique_ptr<QThread> top_thread{new mythread(nullptr, &numTop, allPics[0], 1, shape, type, containEF, false)};
top_thread->start();
效果很好
对于你的情况,你可以这样做
您可以在子类化的
std::unique_ptr<Beacon> beacon {new Beacon(beg, end)};
成员函数中实现这个run
。然后使用 thread->start()
class thread:public QThread
{
Q_OBJECT
public:
thread(QObject *parent = nullptr);
~thread();
virtual void run();
public:
};
并且在
run()
void mythread::run() {
std::unique_ptr<Beacon> beacon {new Beacon(beg, end)};
}
然后就可以简单使用了
thread->start()
您可以使用 QScopedPointer 代替 std::unique_ptr。 示例