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

利用NMUDP傳送影像所產生的錯誤..

尚未結案
cceCKF
一般會員


發表:13
回覆:13
積分:5
註冊:2004-04-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-27 14:34:40 IP:220.132.xxx.xxx 未訂閱
想請教板上的先進: 小弟使用NMUDP來傳送影像,處理的過程先利用VFW偵測並擷取視訊圖片,將擷取的圖片分割成三部份並轉成JPEG格式,再分別傳送,每秒約佔5K頻寬!!在學校的網路環境測試效果還算可以,不過有個蠻嚴重的問題,就是大約過五分鐘以後,便會出現錯誤訊息,某一端程式就會當掉..由於板上大多使用Indy原件,因此找不到相關解決方法。下面是部分程式片段:
/*分割並傳送圖片(Timer每0.2秒執行一次)/
Graphics::TBitmap *Source= new Graphics::TBitmap;
Graphics::TBitmap *Source2= new Graphics::TBitmap;
Graphics::TBitmap *Source3= new Graphics::TBitmap;    TRect rect = ClientRect;
TCanvas *MyCanvas= new TCanvas;
HDC dc = GetDC(hCapWnd);
MyCanvas->Handle = dc;    Source->Width = 160;
Source->Height = 40;
Source->Canvas->CopyRect(Rect(0,0,160,40),MyCanvas,Rect(0,0,160,40));
Source->PixelFormat=pf24bit;    Source2->Width = 160;
Source2->Height = 40;
Source2->Canvas->CopyRect(Rect(0,0,160,40),MyCanvas,Rect(0,40,160,80));
Source2->PixelFormat=pf24bit;    Source3->Width = 160;
Source3->Height = 40;
Source3->Canvas->CopyRect(Rect(0,0,160,40),MyCanvas,Rect(0,80,160,120));
Source3->PixelFormat=pf24bit;    TJPEGImage* JPG=new TJPEGImage();
JPG->CompressionQuality=60;
JPG->Assign(Source);    TJPEGImage* JPG2=new TJPEGImage();
JPG2->CompressionQuality=60;
JPG2->Assign(Source2);    TJPEGImage* JPG3=new TJPEGImage();
JPG3->CompressionQuality=60;
JPG3->Assign(Source3);    TMemoryStream *ms1=new TMemoryStream;
TMemoryStream *ms2=new TMemoryStream;
TMemoryStream *ms3=new TMemoryStream;
JPG->SaveToStream(ms1);
JPG2->SaveToStream(ms2);
JPG3->SaveToStream(ms3);    ms1->Position=0;
ms2->Position=0;
ms3->Position=0;    NMUDP1->SendStream(ms1);
NMUDP2->SendStream(ms2);
NMUDP3->SendStream(ms3);
ms1->Free();
ms2->Free();
ms3->Free();    /*接收部分*/
TMemoryStream *rms1=new TMemoryStream;    NMUDP1->ReadStream(rms1);
TJPEGImage* RJPG1=new TJPEGImage();
RJPG1->LoadFromStream(rms1);
Graphics::TBitmap *rpic1= new Graphics::TBitmap;
rpic1->Width = 160;
rpic1->Height = 40;
rpic1->Assign(RJPG1);
Form5->PaintBox1->Canvas->Draw(0,0,rpic1);
rms1->Free();
RJPG1->Free();
rpic1->Free();    TMemoryStream *rms2=new TMemoryStream;
NMUDP2->ReadStream(rms2);
TJPEGImage* RJPG2=new TJPEGImage();
RJPG2->LoadFromStream(rms2);
Graphics::TBitmap *rpic2= new Graphics::TBitmap;
rpic2->Width = 160;
rpic2->Height = 40 ;
rpic2->Assign(RJPG2);
Form5->PaintBox1->Canvas->Draw(0,40,rpic2);
rms2->Free();
RJPG2->Free();
rpic2->Free();    TMemoryStream *rms3=new TMemoryStream;
NMUDP3->ReadStream(rms3);
TJPEGImage* RJPG3=new TJPEGImage();
RJPG3->LoadFromStream(rms3);
Graphics::TBitmap *rpic3= new Graphics::TBitmap;
rpic3->Width = 160;
rpic3->Height = 40 ;
rpic3->Assign(RJPG3);
Form5->PaintBox1->Canvas->Draw(0,80,rpic3);
rms3->Free();
RJPG3->Free();
rpic3->Free();
請問是哪段程式邏輯不對導致執行上的不正常呢?謝謝各位.. -- 我想多學一點 發表人 -
------
我想多學一點
李國維
高階會員


發表:42
回覆:287
積分:235
註冊:2003-02-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-27 19:03:41 IP:219.84.xxx.xxx 未訂閱
cceCKF: UDP的傳輸時是不會確認資料是否正確的傳達到.並且UDP可以使用廣播的方式將封包同時傳遞給多各Client.不過由於使用廣播傳送時.封包會再網路上停留一段時間.對於網路的負載會造成很大的影響. 所以我個人是建議如果是單純的架構下用TCP會來的比較好. 如果依照下列程式而言你試試看只開啟一各UDP來做傳輸.會不會比較好.
ralph
初階會員


發表:41
回覆:82
積分:29
註冊:2003-02-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-29 00:29:26 IP:66.171.xxx.xxx 未訂閱
請問你有確定你free memory 有完全釋放? 你可以去找一個看memory的程式, 再執行你程式.
cceCKF
一般會員


發表:13
回覆:13
積分:5
註冊:2004-04-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-02 10:28:47 IP:220.135.xxx.xxx 未訂閱
引言: cceCKF: UDP的傳輸時是不會確認資料是否正確的傳達到.並且UDP可以使用廣播的方式將封包同時傳遞給多各Client.不過由於使用廣播傳送時.封包會再網路上停留一段時間.對於網路的負載會造成很大的影響. 所以我個人是建議如果是單純的架構下用TCP會來的比較好. 如果依照下列程式而言你試試看只開啟一各UDP來做傳輸.會不會比較好. 我改寫試看看!! 補充一點.用new所生成的.最好用delete來銷毀 請問該如何做呢?用new產生的並沒有delete這個function可以使用耶 發表人 - 李國維 於 >< face="Verdana, Arial, Helvetica"> ..thanks! -- 我想多學一點
------
我想多學一點
李國維
高階會員


發表:42
回覆:287
積分:235
註冊:2003-02-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-03 10:04:07 IP:219.84.xxx.xxx 未訂閱
引言:
引言: cceCKF: UDP的傳輸時是不會確認資料是否正確的傳達到.並且UDP可以使用廣播的方式將封包同時傳遞給多各Client.不過由於使用廣播傳送時.封包會再網路上停留一段時間.對於網路的負載會造成很大的影響. 所以我個人是建議如果是單純的架構下用TCP會來的比較好. 如果依照下列程式而言你試試看只開啟一各UDP來做傳輸.會不會比較好. 我改寫試看看!! 補充一點.用new所生成的.最好用delete來銷毀 請問該如何做呢?用new產生的並沒有delete這個function可以使用耶 發表人 - 李國維 於 >< face="Verdana, Arial, Helvetica"> ..thanks! -- 我想多學一點
請問該如何做呢?用new產生的並沒有delete這個function可以使用耶 Graphics::TBitmap *Source= new Graphics::TBitmap; .... delete Source;
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-04-18 17:32:36 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-19 22:25:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!