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

C++ 可以在同一线程中并行调用插槽吗?,c++,qt,qnetworkaccessmanager,C++,Qt,Qnetworkaccessmanager,在弄清楚怎么做时遇到了一些问题。我会试着解释我首先要做的是什么 首先,我有一个包含只读文件的类。此类将使用另一个类(StorageProvider)上载此文件的块。该类包含一个QNetworkAccessManager。上载文件块时,我会将该块发送到StorageProvider类,然后该类使用它发送给QNAM的REST请求。当QNetworkReply完成时,StorageProvider将向上传程序发送信号(以便它知道该块已完成) 上传程序->存储提供商->QNetworkAccessMan

在弄清楚怎么做时遇到了一些问题。我会试着解释我首先要做的是什么

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

上传程序->存储提供商->QNetworkAccessManager->互联网

到目前为止还好吧?我可以在上传器中放一个插槽,当StorageHandler处理完它在QNAM上发出的请求时,它会监听

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

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

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


谢谢

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

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


然而,这并不意味着可以安全地假设你的5个电话都会按照你期望的顺序到达,甚至是从同一个线程到达。如果你想获得灵感并并行处理(不知道,这篇文章太混乱了),然后仅举一个示例,说明如何启动新线程进行处理。在这种方案下,插槽所做的只是将数据推送到队列上(请记住使用互斥锁对其进行保护),然后启动QtConrrent::run()函数。

不。一个线程,一次代码执行。其他任何东西都意味着还有另一个线程。天啊,对不起。英语是我的第二语言,我的处境很难解释。它们以什么顺序到达并不重要,只要插槽不平行,这样我增加的索引就不会增加同时有两个线程,因此im读取的缓冲区不会被两个线程读取(这可能会给它们相同的数据块)你的英语很好!很难理解你在一篇冗长的技术文章中所说的话。冗长的回答缩短了:如果你知道你每次都从同一个线程发出相同的信号,并且你没有做任何像使用Qt的其他线程功能那样的花哨的事情,那么你的呼叫将按照它们发出的顺序排队。现在ricky的部分是,你必须保证它们是按照你想要的顺序发出的,如果你是基于internet i/o,这可能不是一个安全的假设。是的,好的。我根本不在乎它们何时完成,因为我无法控制它们在internet上的执行方式(失败,需要重试等)以及何时完成(无论哪一个请求)它们都会经历相同的过程。所以我想我应该是安全的:)我唯一关心的是整个请求都在线程中(我无法控制),不知道它们何时停止并行