gpt4 book ai didi

c++ - 为什么我正在等待 QWaitCondition 的线程没有返回

转载 作者:行者123 更新时间:2023-11-28 02:54:51 25 4
gpt4 key购买 nike

我有一个数据结构,我想在其中等待它接收数据。当我调用 setInterrupt 时,我希望我的线程停止但它永远不会返回。

这是我的队列:

  BufferedIpQqueue::BufferedIpQqueue()
{

}

BufferedIpQqueue::~BufferedIpQqueue()
{
bufferWaitCondition.wakeAll();
}

QString BufferedIpQqueue::get()
{
QMutexLocker locker(&mutex);

while(queue.isEmpty())
{
qDebug() << "waiting at mutex " << &mutex << "calling threadid: " << QThread::currentThreadId();
bufferWaitCondition.wait(&mutex);
}

return queue.first();
}

void BufferedIpQqueue::put(QString &data)
{
QMutexLocker locker(&mutex);

queue.append(data);
bufferWaitCondition.wakeAll();
}

void BufferedIpQqueue::wakAllThreads()
{
qDebug() << "wake all waiting threads at mutex: " << &mutex << "calling threadid: " << QThread::currentThreadId();
bufferWaitCondition.wakeAll();
}

这是我的消费者主题:

IpCheckWorker::IpCheckWorker(BufferedIpQqueue *queue)
{
this->queue = queue;

interrupt = false;
}

void IpCheckWorker::setInterrupt(bool value)
{
QMutexLocker lock(&mutex);
qDebug() << "wake all threads";
interrupt = value;
queue->wakAllThreads();
}

bool IpCheckWorker::getInterruptFlag()
{
QMutexLocker lock(&mutex);

return interrupt;
}


void IpCheckWorker::process()
{
while(getInterruptFlag() == false)
{

qDebug() << "enter process loop ThreadID:" << QThread::currentThreadId();
QString check_ip = queue->get();

qDebug() << "proccess ThreadID:" << QThread::currentThreadId();
}
qDebug() << "leave process event ThreadID:" << QThread::currentThreadId();
emit finished();

}

我得到以下输出:

  • 进入进程循环 ThreadID: 0xf94
  • 正在等待互斥体 0x51ab5f0 调用 threadid:0xf94
  • 唤醒所有线程
  • 在 mutex: 0x51ab5f0 调用 threadid: 0x10dc 时唤醒所有等待的线程
  • 正在等待互斥体 0x51ab5f0 调用 threadid:0xf94

在我的 BufferedIpQqueue::get() 方法中,我似乎在 while(queue.isEmpty()) 存货。为什么我的方法没有返回到 IpCheckWorker::process()?

任何帮助如何正确地做这件事都是非常友好的。

最佳答案

您正在做的是重新实现一个不太灵活的 QThreadPool。如果你愿意,你可以看看its implementation了解它如何使用等待条件。我只是建议使用 QThreadPool 并结束它,因为它非常适合您的要求。

线程池维护着一个QRunnable实例队列。实例由空闲线程拾取。线程管理是自动的。 QRunnable 是类似于 QEvent 的轻量级类 - 它不是 QObject

QThreadPool 不是 单例。有一个全局实例,但您不必使用它。您可以拥有自己的实例。

此示例与 Qt 4.4 及更高版本兼容。

#include <QCoreApplication>
#include <QThreadPool>
#include <QRunnable>
#include <QBasicTimer>
#include <QDebug>
#include <cstdlib>

class Thread : public QThread {
public:
using QThread::msleep;
};

class IpData {
QString m_value;
public:
IpData(const QString & str) : m_value(str) {}
const QString & value() const { return m_value; }
};

class IpRunnable : public QRunnable, IpData {
void run() {
qDebug() << "[" << QThread::currentThreadId()
<< "] processing ip" << value();
Thread::msleep(qrand() < (RAND_MAX/4.0) ? 0 : 100);
}
public:
IpRunnable(const IpData & data) : IpData(data) {}
IpRunnable(const QString & str) : IpData(str) {}
};

class Test : public QObject {
Q_OBJECT
int i;
QBasicTimer timer;
void timerEvent(QTimerEvent * t) {
if (t->timerId() != timer.timerId()) return;
QThreadPool::globalInstance()->start(new IpRunnable(QString::number(i)));
if (++i > 100) qApp->quit();
}
public:
Test() : i(0) { timer.start(20, this); }
};

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QThreadPool::globalInstance()->setMaxThreadCount(5);
Test test;
return app.exec();
}

#include "main.moc"

关于c++ - 为什么我正在等待 QWaitCondition 的线程没有返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22246358/

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