gpt4 book ai didi

C++ QThread 和连接导致崩溃

转载 作者:行者123 更新时间:2023-11-28 04:37:02 24 4
gpt4 key购买 nike

我的 QThread 计数器崩溃给出了奇怪的结果,因为线程计数正确但在 SetLabel 函数中我得到了一个与 QThread 中的不同的数字然后它在 3 秒后崩溃并且标签似乎没有更新.

QThread* CountThread = new QThread;
Counter* Count = new Counter();
Count->moveToThread(CountThread);
connect(CountThread, SIGNAL(started()), Count, SLOT(Process()));
connect(Count, &Counter::SecondsUpdate, this, [=]{ SetLabel(Count->Seconds) ;});
connect(Count, SIGNAL(finished()), CountThread, SLOT(quit()));
CountThread->start();


void Counter::Process()
{
int secs = 0;
while (secs < 1000)
{
qDebug() << "hello" << secs;
secs += 1;
Sleep(1000);
emit SecondsUpdate();
}
emit finished();
}


void BaseWindow::SetLabel(int Seconds)
{
qDebug() << Seconds;
this->Test->setText(QString("Seconds: " + QString::number(Seconds)));
}

class Counter : public QObject
{
Q_OBJECT
public slots:
void Process();

signals:
void finished();
void SecondsUpdate();

public:
int getValue() { return Seconds;}
int Seconds;

};

编辑:问题似乎出在标签的更改上,因为我评论了这个->Text->setText out 并且它没有崩溃

最佳答案

显示的代码有两个基本问题。

  1. Counter::Seconds 从未初始化/更新。
  2. Count 移动到新的 QThread 后,您可以继续从主线程访问它。

您可以通过删除 Seconds 成员并将本地计数器 secs 作为参数传递给 Counter::SecondsUpdate< 来解决这两个问题 信号...

class Counter: public QObject
{
Q_OBJECT;
public slots:
void Process();
signals:
void finished();
void SecondsUpdate(int seconds);
public:
};

void Counter::Process ()
{
int secs = 0;
while (secs < 1000)
{
qDebug() << "hello" << secs;
secs += 1;

/*
* Sleep(1000) --> QThread::sleep(1)
*/
QThread::sleep(1);

/*
* Pass secs as a parameter to the SecondsUpdate signal.
*/
emit SecondsUpdate(secs);
}
emit finished();
}

然后,将相关的connect 调用从...更改

connect(Count, &Counter::SecondsUpdate, this, [=]{ SetLabel(Count->Seconds) ;});

为了...

connect(Count, &Counter::SecondsUpdate, this, &BaseWindow::SetLabel);

关于C++ QThread 和连接导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51122080/

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