智能指针和QThread问题

问题描述 投票:0回答:3

在我的代码中的某个时刻,我有:

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);

怎么了?

c++ multithreading c++11 qt5 c++14
3个回答
2
投票

您需要将原始指针 (

Qthread *
) 传递给
moveToThread
。您必须使用
unique_ptr::release
(
thread.release()
) 或
unique_ptr::get
(
thread.get()
) 来获取原始指针,具体取决于您想要实现的目标。


0
投票

在我的项目中,我是这样使用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()


0
投票

您可以使用 QScopedPointer 代替 std::unique_ptr。 示例

© www.soinside.com 2019 - 2024. All rights reserved.