2012-04-23 49 views
-1

有一些问题搞清楚如何做到这一点。将尝试解释我首先要做的是什么。可以在同一个线程中并行调用一个插槽吗?

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

上传 - > StorageProvider - > QNetworkAccessManager - >互联网

到目前为止好权?我可以在上传器中插入一个插槽,该插槽用于侦听StorageHandler何时完成QNAM上的请求。

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

这意味着,只要信号(块标识)由StorageProvider发射将被调用插槽,则要存储做的ID,然后查找未上传一个新的(忘了提我有一个已经上传的ID列表,所以当它通过ID(0 ... 1000)时,它还需要1.将文件4mb的索引推送到前方2.检查已经存在的列表块如果它在。

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

感谢

+1

没有。一个线程,一个代码的执行。任何其他意味着有另一个线程。 – UmNyobe 2012-04-23 22:28:36

回答

1

哇,我的眼睛。通读一遍,仍然没有处理你想要的东西...所以这里是独家新闻。

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

但是,这并不意味着可以安全地假设所有5个电话都必须以您期望的顺序到达,或者甚至来自同一个线程。如果你想变得花俏并且处理东西并行(不能说出来,这个帖子太混乱了),那么就使用QtConcurrent::run()来举例说明如何启动一个新线程进行处理。在这个方案下,所有的插槽都会将数据推送到一个队列中(记住用一个互斥锁来保护它)并引发QtConrrent :: run()函数。

+0

gosh im抱歉。英语是我的第二语言,我很难解释这种情况。不管它们到达的顺序如何,只要插槽并不是平行排列的,这样imresresing的索引就不会同时被两个线程增加,并且因此读取的缓冲区im不会被两个线程读取例如(这可能会给他们相同的数据块) – chikuba 2012-04-23 22:41:28

+0

你的英语很好!在一个长期的技术性的帖子中,很难跟随你所说的话。缩短回答:如果您知道每次都从同一个线程发出相同的信号,并且您没有像使用Qt的其他线程功能那样进行任何操作,那么您的电话将按照它们发出的顺序排队。现在棘手的部分是,你必须保证它们按照你想要的顺序发射,如果你将它从网络I/O转换为基础,这可能不是一个安全的假设。 – 2012-04-23 23:30:05

+0

耶还好。由于我无法控制他们在互联网上的行为(失败,需要重试等),以及何时完成(无论哪个请求),他们将通过相同的过程,因此我完全不在乎它们何时完成。所以我应该在安全的一面,我想:)我唯一的担心是关于请求在线程(我无法控制)的整个事情,并不知道当他们停止并行 – chikuba 2012-04-24 02:37:52

相关问题