gpt4 book ai didi

c++ - 我可以用 QTimer 代替 QThread 吗?

转载 作者:行者123 更新时间:2023-11-30 01:17:49 25 4
gpt4 key购买 nike

更准确地说,问题应该是:

将信号连接 QTimer::timeout 到我的工作函数和创建工作线程之间有什么区别与 QThread?


我正在编写一个程序,它在主线程中接收流数据(信号由 QIODevice::readread() 生成)并同时处理它们。现在我启动一个 QTimer 不断触发信号 QTimer::timeout,并且该信号连接到主线程中的工作函数,该函数执行数据处理工作。这就是我实现并发的方式。

我想知道这种方法是否不同于使用 QThread 创建另一个线程,因为我在 this topic 中找到了这个想法与我所做的非常相似。唯一的区别是接受的答案会创建另一个线程并在其上移动计时器和工作类。除了区别之外,我看不出有任何必要在我的案例中使用线程。

在我的例子中(在主线程中接收数据并同时处理它们),我是使用 QTimer 还是应该创建一个 QThread?我对多线程很陌生,如果我有什么误解,请帮助纠正我。谢谢。


[编辑]:

我不知道创建一个新线程来处理数据有什么区别/优势。现在,一切都在一个线程中进行:我一直将数据存储在一个队列中,并在一个由 QTimer::timeout 触发的函数中将它们一个一个地从队列中取出。

最佳答案

What's the difference between connecting the signal QTimer::timeout to my working 
function and creating a worker thread with QThread?

当您连接来自具有相同线程关联的对象的一些信号/槽对时,连接是直接。这意味着在你的情况下,主线程创建了 timer,并且还包含 slot,所以 signal 将在main 线程,也将在 main 线程中处理(因为插槽也在主线程中)。

当您连接来自具有不同线程关联的对象的一些信号/槽对时,连接将排队。这意味着信号发射时隙执行将在不同的线程中运行。

没有真正实现并发,计时器信号处理槽在主线程中按顺序执行。

所以这是你的选择:

  1. 如果你想在主线程中处理数据,当前代码是可以的。
  2. 如果您想在主线程中发出timeout 并在不同线程中处理数据,则使用处理方法创建新类并使用moveToThread 。具有该类的对象。

您提供的链接确实有不同的情况。在您的情况下(如果我错了请纠正我),您仅在数据可用 时才处理数据,而不仅仅是在指定时间之后。您的情况很像传统的生产者/消费者问题。我的建议是完全不使用 QTimer。而是创建一个新的 class 和一个 slot 来处理数据。然后在数据可用时从主线程发出信号,并连接到处理slot。您将实现真正的并发。在这种情况下,您需要为共享数据访问实现锁定,这在 Qt 中很容易,您可以只使用 QMutexLocker

关于c++ - 我可以用 QTimer 代替 QThread 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23555631/

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