-1

在弄清楚如何执行此操作时遇到一些问题。将尝试解释我首先要做什么。

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

Uploader -> StorageProvider -> QNetworkAccessManager -> Internet

到目前为止还不错吧?我可以在上传程序中放置一个插槽,以便在 StorageHandler 完成它在 QNAM 上发出的请求时进行监听。

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

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

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

谢谢

4

1 回答 1

1

哇,我的眼睛。通读一遍,仍然不知道你想要什么……所以这是独家新闻。

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

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

于 2012-04-23T22:33:10.743 回答