是否可以在同一线程中并行调用插槽

Can a slot be called in parallel in the same thread?

本文关键字:并行 调用 插槽 线程 一线 是否      更新时间:2023-10-16

弄清楚如何做到这一点时遇到一些问题。将尝试解释我首先要做的事情。

首先,我有这个包含只读文件的类。此类将使用 this other 类 (StorageProvider) 来上传此文件的块。该类包含一个 QNetworkAccessManager。上传文件块时,我会将块发送到 StorageProvider 类,然后该类使用发送到 QNAM 的 REST 请求。当QNetworkReped完成后,StorageProvider将向上传者发出信号(以便它知道该块已完成)。

Uploader -> StorageProvider -> QNetworkAccessManager -> Internet

到目前为止一切顺利吧?我可以在上传器中放置一个插槽,用于侦听存储处理程序何时完成它在 QNAM 上发出的请求。

但是,由于 QNAM 可以通过 HTTP 同时执行 6 个请求,因此我想这样做,以便当 StorageProvider 发出信号表示它已完成一个块时,并且唯一的 BlockId 连接到信号,允许上传者知道哪个块完成了,而不仅仅是它完成了。

这意味着每当 StorageProvider 发出信号 (blockId) 时将调用的插槽必须存储已完成的 id,然后查找未上传的新 id(忘了提到我有一个已经上传的 ID 列表,所以当它逐步通过 id (0...1000) 时, 它还需要 1.将文件的索引向前推送 4MB 2。签入已存在的块列表(如果它在其中)。

所以,我的问题是:如果我有一个插槽,它增加一个"currentBlockId",直到它找到下一个可以上传的插槽+读取文件4mb,直到我们处于位置"currentBlockId"* 4mb(文件中的索引将像索引一样向前推送,它不会是随机访问。 当这个索引到达文件末尾时,我们就完成了),这个插槽将是每当完成 5 个上传中的一个时都会调用,我会遇到问题吗?我问的原因是因为 QNAM 在不同的线程中调用它,这可能会同时发出 2-5 个"finish()"信号,这会同时调用处理它的插槽?就像,我不太确定会发生什么。请注意,我的所有代码都不是线程化的,理论上信号应该排队,对吗?老虎机会被叫5次,一个接一个?

谢谢

哇,我的眼睛。通读一遍,仍然没有掌握你想要什么......所以这是独家新闻。

默认情况下,在事件线程上调用槽。默认情况下,只有一个事件线程。在这方面,你是对的。默认情况下,当槽使用事件线程时,调用将排队等待以后。

但是,这并不意味着可以安全地假设所有 5 个调用都必须按照您期望的顺序到达,甚至来自同一个线程。如果你想花哨并并行处理东西(看不出来,帖子太混乱了),那么使用 QtConcurrent::run() 作为如何启动一个新线程进行处理的一个例子。在这种方案下,插槽所做的只是将你的数据推送到队列中(记住用互斥锁保护它)并触发QtConrrent::run()函数。