相关疑难解决方法(0)

如何在Qt中使用排队连接时压缩插槽调用?

读了一些文章后,像这样关于Qt信号插槽通信还是有关于排队的连接问题.

如果我有一些线程一直向对方发送信号,并且假设一个thread_slow在它的事件循环中运行一个慢速方法而另一个thread_fast运行一个快速的方法发送多个信号,而另一个线程仍在运行它的慢速方法...... ..当thread_slow返回到事件循环的慢速方法时,它会处理之前发送的所有信号thread_fast还是最后一个发送的所有信号(所有信号都是相同的类型)?

如果它将处理所有信号,是否有办法使thread_slow 唯一的过程成为最后一个?(考虑到多线程应用程序中的"最后一个"可能是模糊的,让我们考虑线程要求最后一个信号之前的最后一个信号,为了简单起见,所以在线程查找最后一个时发送的新信号可能会丢失).

(我问这个是因为我有多个线程从多个线程接收数据,我不希望它们处理旧数据,只是最后一个发送的数据)

我已经进行了一些测试,看来Qt将处理所有信号.我做了一个线程:

while(true)
{
    QThread::msleep(500);
    emit testQueue(test);
    test++;
}
Run Code Online (Sandbox Code Playgroud)

另一个插槽将执行:

void test::testQueue(int test)
{
    test.store(private_test.load() + test);
    emit testText(QString("Test Queue: ") + QString::number(private_test.load()));
}
Run Code Online (Sandbox Code Playgroud)

并且线程将运行:

while(true)
{
    QThread::msleep(3000);
    QCoreApplication::processEvents();
    private_test.store(private_test.load() + 1000);
}
Run Code Online (Sandbox Code Playgroud)

我每隔500毫秒从一个线程向另一个线程发送一个信号,另一个线程休眠3000毫秒(3秒)然后唤醒并将内部变量递增100.每次执行一个插槽时它会发出一个文本收到的值+内部变量.我得到的结果是,每次 QCoreApplication::processEvents();调用,所有信号都被执行....(我编辑了这部分是因为我在之前的代码中发现了一个错误)

c++ qt qthread qt-signals qtcore

22
推荐指数
2
解决办法
7450
查看次数

使用QtConcurrent在QT中进行多线程处理

我在Qt中开发一个应用程序,在某些时候处理一堆视频.它工作正常,但它在进程阶段只有40-60%的CPU使用率,所以我试图使它多线程.

我使用QtConcurrent导致他的"高水平"而不是更传统的线程管理,我的代码很简单:

for(int i = 0; i < totalVideos; i++)
{
    QFuture<ResultClass *> futureToken = QtConcurrent::run(this, process, listOfVideos.takeFirst());
    QFutureWatcher<ResultClass *>* fw = new QFutureWatcher<ResultClass *>();
    connect(fw, SIGNAL(finished()), this, SLOT(manageResult));
    fw->setFuture(futureToken);
}
Run Code Online (Sandbox Code Playgroud)

aaaand它的工作原理,100%的CPU使用率和大约25-30%的速度.但它产生了大约65个新线程(无论它处理25或250个视频),并且大多数线程在处理阶段后不会消失.

我的问题是:这种做法是对的吗?太粗糙了吗?我应该"手动"控制线程创建吗?QtConcurrent模块是否完全处理,所以我不应该关心线程管理?85个线程太多了吗?我是否应该尝试在流程阶段后杀死其中一些?

只需查看活动监视器即可完成每个观察.

提前致谢.

c++ qt multithreading qtconcurrent

5
推荐指数
1
解决办法
2124
查看次数

标签 统计

c++ ×2

qt ×2

multithreading ×1

qt-signals ×1

qtconcurrent ×1

qtcore ×1

qthread ×1