可以在同一个线程中并行调用插槽吗?

时间:2012-04-23 22:14:35

标签: c++ qt qnetworkaccessmanager

在确定如何执行此操作时遇到一些问题。将尝试解释我想先做的事情。

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

上传者 - > StorageProvider - > QNetworkAccessManager - >网络

到目前为止这么好吗?我可以在上传器中添加一个插槽,用于监听StorageHandler何时完成它在QNAM上发出的请求。

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

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

所以,我的问题是:如果我有一个插槽,将“currentBlockId”增加1,直到找到下一个可以上传的插槽+当时读取文件4mb,直到我们处于“currentBlockId”* 4mb的位置(文件中的索引将像索引一样向前推进,它不会是随机访问。当这个索引到达我们完成的文件末尾时)只要完成5个上传中的一个,就会调用这个插槽,我会有问题吗?我问的原因是因为QNAM使得它在不同的线程中进行调用,这可能会同时发出2-5“finished()”信号,这会调用同时处理它的插槽?就像,我不太确定那会发生什么。请注意,我的代码都没有线程,理论上信号应排队正确吗?并且一个接一个地调用插槽5次?

由于

1 个答案:

答案 0 :(得分:1)

哇,我的眼睛。仔细阅读一遍,仍然无法处理你想要的东西......所以这就是独家新闻。

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

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