簡體   English   中英

在主線程上啟動對話框等待工作線程的結果

[英]Launch dialog on main thread waiting for result of worker thread

我有一個應用程序,它發送 HTTP 請求並處理收到的響應。 主線程被阻塞,直到響應回來,否則我們無法處理數據。 要發送這些請求,用戶必須經過身份驗證。 我希望捕獲 401 響應,並在返回響應以供我的應用程序處理之前,提示用戶進行身份驗證。 根據成功,我想重試發送原始請求並返回響應,或者,如果身份驗證失敗,則返回原始 401 響應。

我正在使用 C++ REST SDK 發送 HTTP 請求。 這些發生在另一個線程(pplx::task)中。 我還使用 MFC 模式對話框來提示進行身份驗證。 你們中的一些人可能會看到發生的死鎖。 如果沒有,讓我再解釋一下。

主線程等待 HTTP 請求完成。 在該線程中,我捕獲了 401 並希望啟動一個對話框。 為此,我使用了boost::signal 此信號將SendMessage調用到我希望顯示對話框的句柄。 在 MFC 消息循環處理消息后,它將啟動對話框(在主線程上)。 這依賴於 MFC 消息循環,它被阻止等待 HTTP 請求。 簡而言之,主線程已經在等待請求完成,因此它無法運行其消息循環來接收來自SendMessage的調用。

主線程正在等待工作線程。 工作線程需要在主線程上啟動一個對話框才能繼續。 僵局。 有沒有人有任何巧妙的解決方案來解決這個問題?

我認為這里最簡單的解決方案是重新設計處理線程的方式。

我建議您不要為請求使用單個線程,而是為每個請求生成一個新線程,然后讓它返回狀態代碼(無論它是什么),然后您可以處理任何邏輯以在主線程中使用身份驗證進行重試(即顯示身份驗證對話框,然后使用憑據重新生成身份驗證線程)。

這也使您可以更好地封裝請求處理程序,這是一個很大的優勢。 為了正確封裝此邏輯(因此您不必檢查每個請求),您應該定義某種請求處理程序(類或函數)。 例如

StatusCode make_reqeust(...) {
  // Deal with the logic on authentication here
}

其中 StatusCode 是 HTTP 狀態代碼的類型。

當然,這並不能解決您的 UI 線程可能等待您的工作線程完成的問題,因此您還需要某種 UI 刷新方法,該方法每 x 時間調用一次並檢查所有工作線程的狀態(即通過檢查返回的std::future )。 你還想改變我上面的例子,在這種情況下可能會產生一個單獨的線程並返回一個std::future

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM