2013-06-25 36 views
1

當試圖通過連接到服務器上某個地方託管的PHP腳本嘗試登錄時,應用程序停止響應,這是預期的,但如果連接或PHP腳本的響應延遲,則等待時間太長,看起來應用程序已掛起,我們不希望用戶思考。應該在一個單獨的線程中完成C++應用程序的登錄嗎?

因此,爲了這個目的創建一個新的線程是一個好主意,並且直到收到響應時才簡單地禁用主應用程序上的控件?

我在C++和純Winapi以及libCurl和oop中工作。

+2

使用線程似乎對我來說是一個合理的方法。 –

+3

您也可以使用帶回調的異步I/O。 –

+1

您也可以在連接上超時,如果超時過期,建議用戶在另一次嘗試。 – hetepeperfan

回答

2

你不應該在你的主(GUI?)線程中做(可以)時間密集型的任務。連接到服務器是這樣的。你可能會通過使用異步IO(例如回調函數或非阻塞套接字)來解決它,但這些解決方案也爲您產生了另一個線程。 在另一個線程中進行連接並在連接時禁用控件,但告訴用戶程序正在做某些事情(例如通過旋轉圓圈或其他東西)。當程序似乎什麼都不做時,用戶討厭它。

+0

旋轉的圓圈本身需要一個單獨的線程?如何讓主線程在進程中被阻塞,在連接上放置一個超時併爲旋轉圓圈動畫創建一個新線程?這種方法有什麼缺陷? – StudentX

+0

應用程序在主線程中處理它的消息,所以如果你阻止它,它仍然會反應,就好像它不再工作一樣。在Windows上,例如會有一個「xy停止響應」消息,大多數用戶點擊「強制關閉」而不是「等待」。您應該在主線程中使用一個(窗口系統提供的)定時器,該定時器調用每隔50毫秒左右旋轉一圈的方法。 – Marius

2

libcurl多接口能夠異步工作,所以不必使用單獨的線程,而必須調用curl_multi_perform()函數,直到獲得結果。它看起來很奇怪,但是每次你可以避免在你的應用程序中使用線程,你就會贏。線程==錯誤有一天會發生,所以如果可能的話,避免它們。這裏有一些basic example

相關問題