2012-04-23 48 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

相關問題