gpt4 book ai didi

c++ - 如何删除 Qt 中的绑定(bind)对象?

转载 作者:行者123 更新时间:2023-11-30 00:53:56 29 4
gpt4 key购买 nike

有两个类:WidgetWorker。这是一个示意图代码。

class Widget
{
Worker *m_worker;
QTextEdit *m_edit;
public:

Widget():m_edit(new QTextEdit){}

~Widget()
{
m_worker->ShouldStop = true;
delete *m_worker;
}

void doWork()
{
m_worker = new Worker;

if (!worker->doWork())
m_edit->setText("failed");
}
}

class Worker
{

Worker() : ShouldStop(false){}

public:
bool ShouldStop;

bool doWork()
{
while(true && !ShouldStop)
{
QThread::sleep(1);
QApplication::processEvents();
}

//consider the work undone if a stop was forced
if (ShouldStop)
return false;
}
}

在调用 WidgetdoWork() 之后,执行在 Worker< 的方法 doWork() 中循环。然后关闭小部件,并在调用 processEvents() 期间调用其析构函数。然后执行返回到 WorkerdoWork()。它现在检查 ShouldStop 并返回到 WidgetdoWork() 并尝试向 m_edit 添加一些内容.但是 Widget 对象已经死了。

问题:

  1. 如何彻底删除 Worker?
  2. 避免这种相互作用的最佳设计是什么?

最佳答案

理想情况下,工作线程应该只通过信号和槽机制返回数据,而不是直接访问原始对象。实际上创建线程并避免调用 QApplication::processEvents() 是避免问题的第一种方法。

此外,当您想在新线程中启动一个 worker 时,您应该考虑使用这样的设计。您可以创建一个通用 QThread 并为其分配一个 QObject,而不是子类化 QThread,如下所示:

Worker *worker = new Worker;
QThread *workerThread = new QThread(this);

connect(workerThread, &QThread::started, worker, &Worker::doWork);
connect(workerThread, &QThread::finished, worker, &Worker::deleteLater);
worker->moveToThread(workerThread);

// Starts an event loop, and emits workerThread->started()
workerThread->start();

如果您使用的是 Qt 5,请考虑围绕此模式重构您的代码。

关于c++ - 如何删除 Qt 中的绑定(bind)对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15236223/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com