線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2318
推到 Plurk!
推到 Facebook!

indy 10 UDP收取30部左右Client端畫面,不定時記憶體錯誤

答題得分者是:GrandRURU
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-03-25 14:05:41 IP:61.218.xxx.xxx 訂閱
已經離開程式員很久了...發現自己有點脫節...如果問題提的不好...還請各位前輩見諒...
設定
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-03-25 18:06:57 IP:60.250.xxx.xxx 訂閱
可以PO一下錯誤訊息嗎?
------
Mephise Chen
前興德工程師
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-03-25 20:12:11 IP:123.240.xxx.xxx 訂閱
先謝謝您的回應
錯誤大至上都是如下...
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
修正一下錯誤訊息只是客戶端數量少時出現的慢......一樣也會有錯誤 >"<
編輯記錄
mine 重新編輯於 2011-03-25 06:18:25, 註解 無‧
mine 重新編輯於 2011-03-25 06:21:25, 註解 無‧
mine 重新編輯於 2011-03-25 07:06:07, 註解 無‧
mine 重新編輯於 2011-03-25 07:07:31, 註解 無‧
mine 重新編輯於 2011-03-25 07:10:04, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-03-26 04:45:51 IP:220.135.xxx.xxx 訂閱
請問:
Cip:=Abinding.PeerIP;
同一個PeerIP是否有超過一個以上的連線? 也就是說,是否同一台電腦裡啟動了一個以上的udp clients? 還是一個ip只會有一個client?

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
GrandRURU
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-03-26 09:28:30 IP:111.249.xxx.xxx 未訂閱
如果n個 Client都需要用到VCL元件,請記得要做 Thread Synchronize 
像是 TIdSync 之類的元件來做橋接


mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-03-26 13:30:36 IP:123.240.xxx.xxx 訂閱
TO:aftcast 大大
Client是只有一個Udp Client...其他溝通都是用TCP...

TO GrandRURU 大大
了解...我會去處理同步的部份 結果再向大家回報


謝謝二位

mephise
高階會員


發表:4
回覆:149
積分:205
註冊:2004-02-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-03-27 09:07:10 IP:59.115.xxx.xxx 訂閱
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
站務副站長


發表:235
回覆:1655
積分:1753
註冊:2005-06-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-03-27 11:50:12 IP:111.249.xxx.xxx 未訂閱
===================引 用 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-03-28 11:08:42 IP:61.218.xxx.xxx 訂閱
謝謝樓上的大大費神了
ThreadedEvent:True

當初將這參數設為True的原因,是原本設計時有使用BussinessSkinForm
在拉動視窗時總時不明的原因鎖定(滑鼠變漏斗),後來拿掉Skin後
也就沒把他改回來了....(後來發現鎖定原因是因為另一支Client不停送資料造成的)
目前還沒實測
改用TidSync 跟關掉ThreadedEvent我都會去測試,晚點再跟大家報告結果
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-03-28 14:31:56 IP:163.17.xxx.xxx 訂閱
謝謝所有提供想法的前輩
果然在ThreadedEvent改成False之後問題就排除了。
如果設成Ture自行使用TidSync.synchroizeMethod也是可以...
問題果然是出在這。再次感謝
系統時間:2017-12-15 12:36:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!