indy 10 UDP收取30部左右Client端畫面,不定時記憶體錯誤 |
答題得分者是:GrandRURU
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
已經離開程式員很久了...發現自己有點脫節...如果問題提的不好...還請各位前輩見諒...
設定 INDY10 UDP SERVER BUFFERSIZE: 819200 PORT: 9100 ThreadedEvent:True OnUDPRead Code 如下 [code delphi] procedure TGDFrm.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle); var jpg:TJpegImage; i:integer; Cip:String; TFlag:integer; AStream: TIDStreamVCL; begin TFlag:=1; Cip:=Abinding.PeerIP; For i:=1 to Form2.Bsg1.RowCount do begin if Trim(Cip) =Form2.Bsg1.Cells[1,i] then Tflag:=i; end; try AStream := TIDStreamVCL.Create(TMemoryStream.Create, True); AStream.Write(AData); AStream.Position:=0; jpg := TJpegImage.Create; jpg.LoadFromStream(Astream.VCLStream); Timage(FindComponent('Image' IntTostr(TFlag))).Parent.DoubleBuffered:=True; Timage(FindComponent('Image' IntTostr(TFlag))).picture.Bitmap.assign(jpg); finally Jpg.Free; AStream.Free; end; end; [/code] 畫面可正常收取,在10個Client端時 並不會出現任何錯誤 實測在30個Client 同時回傳畫面時...會不定時的出現記憶體錯誤 (一定會出現)...有時會連跳二三個,但並不影響程式運行...畫面依然可正常收取 請問該如何改進 ? 請給小的一點指正.... 謝謝 編輯記錄
mine 重新編輯於 2011-03-25 00:07:32, 註解 無‧
|
mephise
高階會員 發表:4 回覆:149 積分:205 註冊:2004-02-09 發送簡訊給我 |
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
先謝謝您的回應
錯誤大至上都是如下... access violation at address 004224DE in module "project1.exe " write of address .... 只是記憶體位址並不相同.... 不知道自己思考的方向是否正確... 我想的方向大致上是否在同時收取多個Client端時 在線程上有衝突... 因為如果不用try finally改用try except 也不會進入例外處理.... 在看Debug時...主要是Tlist.Get 後面的動作有誤... 所以也想過是不是收的資料在assign 給Jpg時有誤 但這應該會是由Jpg回錯誤碼? 不知道想的是否正確.... Debug畫面http://cid-43d7606cacc2b50a.photos.live.com/self.aspx/新相簿/1.jpg 修正一下錯誤訊息只是客戶端數量少時出現的慢......一樣也會有錯誤 >"< |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
|
mephise
高階會員 發表:4 回覆:149 積分:205 註冊:2004-02-09 發送簡訊給我 |
Timage(FindComponent('Image' IntTostr(TFlag))).Parent.DoubleBuffered:=True;
Timage(FindComponent('Image' IntTostr(TFlag))).picture.Bitmap.assign(jpg); 這兩行嘗試搬到 Synchronize 的部份去執行, 這邊應該是是屬於Main Thread的部分, 你存取到 Main Thread 的 GUI元件了, 這個是一定要 Synchronize 的
------
Mephise Chen 前興德工程師 |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
===================引 用 mine 文 章===================
已經離開程式員很久了...發現自己有點脫節...如果問題提的不好...還請各位前輩見諒... 設定 INDY10 UDP SERVER BUFFERSIZE: 819200 PORT: 9100 ThreadedEvent:True OnUDPRead Code 如下 ===================引 用 mine 文 章=================== 請問是什麼原因一定要使用ThreadedEvent = True呢? 昨天和Aftcast大討論很久,看到以下連結 Thread: UDP client-server (Indy 9) 摘錄片段內容: When ThreadedEvent is False, TIdUDPServer synchronizes the OnUDPRead event with the main thread. So there is definately potential for delay there. On the other hand, when ThreadedEvent is True, the event is not synchronized, which means your event handler code must be thread-safe (your use of TListBox is not thread-safe). 如果不意外的話,將ThreadedEvent設定為False,你的問題就可以不藥而癒了 |
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |