2016-09-06 43 views
0

我有一個使用Delphi編寫的應用程序,使用TClientSocket將數據發送到用C#編寫的另一個應用程序。由於很多原因,C#應用程序響應緩慢,阻塞了我的Delphi應用程序,並且不尊重我設置的超時時間。Delphi中的TClientSocket持久連接

我的Delphi應用程序讀取回應是這樣的:

Sock.Socket.ReceiveText 

這會導致應用程序等待響應。但如果我這樣做,應用程序等待並尊重超時:

while not receiveData do 
begin 
    if Sock.Socket.ReceiveLength > 0 then 
    begin 
    receiveData := True; 
    end; 
    Inc(Cont); 
    Sleep(100); 

    if (Cont > 10) then 
    raise Exception.Create('Timeout'); 
end; 

我的Delphi應用程序發送兩個請求。第一次,但C#仍在處理它。我的Delphi應用程序然後發送第二個請求,這次C#發送第一個請求的響應。

第二個請求是否會接收第一個請求的數據?或者,當我在Delphi中超時時,他們會交叉信息嗎?

回答

3

一旦你的Delphi代碼超時,它會忘記第一個請求,但你的C#代碼不知道。由於您沒有刪除連接,因此第二個請求確實會收到第一個請求的響應數據。通過實現超時邏輯,然後忽略超時的原因,你會讓你的兩個應用程序彼此不同步。因此,要麼使用更長的超時(或根本沒有超時),要麼在發生超時時斷開連接。

至於你的Delphi應用程序凍結,只有當你在阻塞模式下使用TClientSocket組件並在主UI線程的上下文中執行你的閱讀時纔會發生這種情況。你不應該在主UI線程中使用阻塞模式。或者:

  1. 使用TClientSocket在非阻塞模式,盡一切只有OnRead事件你的閱讀,並且不讀超過ReceiveLength表示。

  2. 使用TClientSocket阻塞模式,並盡一切你的閱讀在輔助線程,然後信號中的主UI線程只有當有可用它來處理(最好將處理在工作人員的數據數據線程,並且只在進行UI更新時與主線程同步)。