2017-02-11 43 views
-1

我需要每兩秒重複發送4個字節,即00 00 00 F6
但是,IdUDPClient.SendBuffer傳輸後沒有返回。爲什麼對IdUDPClient.SendBuffer的調用不總是返回?

我嘗試發送幾個字節,並且每次都返回。

這工作:

UDP.SendBuffer(RawToBytes(#0 + #0 + #0 + #1 + #127 + #128 + #246, 7)); 

這不起作用:

UDP.SendBuffer(RawToBytes(#0 + #0 + #0 + #246, 4)); 

我已經失敗嘗試了許多的我已經在各種相關StackExchange發現問題的建議。

我看到至少三種情形:

  1. 懸掛,Wireshark的看到1個傳輸。
  2. 工作重複傳輸,但不包含4個字節的數據。
  3. 有時字節>7F3F發送。

有人能指出我做錯了什麼嗎?

編輯:上面發生在一個線程中。如果TIdUDPClient被放置爲表單上的可見組件,那麼它工作正常。

這可能是一個線程/重入問題?

+0

請提供一個[最小,完整和可驗證示例](/ help/mvce)來演示問題。此外,您正在濫用'RawToBytes()'。使用'Send()'而不是'SendBuffer()'。或者使用'IdGlobal。ToBytes()'。或者手動構建一個TIdBytes變量。 –

+0

@Remy Lebeau我做了一個MCV向你展示,並且工作。感謝推動我清理。一定是線程問題。回到繪圖板。 – AndersJ

+0

@Remy Lebeau TidBytes變量的SetLength很容易忘記:-( – AndersJ

回答

0

這無疑將有助於看到更多的代碼,有你確信你的線程實際運行使用TIdUDPClient時(調用execute),否則你的代碼不需額外來看,顯然:)

的區別可見表格組件是,它自動創建(構造函數是由德爾福設計師自動運行)

TIdUDPClient.Create(AOwner: **) 

這樣做的組件將在主線程上運行(「GUI線程」如果你喜歡)

幾t hings我倒是建議你爲了追捕下來要做的是:

首先確保線程實際執行

的問題也可能是,如果實例化TIdUDPClient的TIdUDPClient不具有所有者。創建(無)線內,嘗試實例INT與和業主無論是TThread類或應用程序

TIdUDPClient.Create(Self) 

TIdUDPClient.Create(Application) 

希望這會有所幫助,但正如我所說的發佈更多的代碼肯定會使我可以幫助你!

相關問題