可否請大家幫我看看那邊會消耗記憶體 |
答題得分者是:dllee
|
danielj
初階會員 發表:65 回覆:135 積分:40 註冊:2003-06-11 發送簡訊給我 |
大家好,又來麻煩大家了…
小弟的網路傳檔程式本來以為可以收工了,沒想到路遙知馬力,小弟的Client端程式大約十數分鐘後就有點像是顯示記憶體不足的樣子,原本該更新的圖都不會更新顯示,小弟設斷點去觀察各個程式被執行到的次數,取出佔最大比例的部分貼出來請大家幫忙找找看是否有什麼地方記憶體配置不當或使用不當,以致於導致無法更新image。
先謝啦! //以下程式出現率3.75%
AnsiString TForm1::Find_Camera_Name(int num) { myNodeItem *p; for (int i=0;i//以下程式出現率92.46%,最高出現率 void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { fun32 ; fprintf(fp,"ClientSocket1Read %d\n",fun32); TClientSocket *client; myNodeItem *p; TMemoryStream *destStream,*tmpStream; //獲取目前Client資訊 client = ((TClientSocket *)Sender) ; p = &nodeitem[TreeView1->Selected->Index]; destStream = (TMemoryStream *)(jpg_pos->Items[client->Tag]); tmpStream = (TMemoryStream *)(tmp_pos->Items[client->Tag]); MYPACK mp; Socket->ReceiveBuf(&mp, sizeof(MYPACK)); AnsiString sz=(AnsiString)mp.szHeader; if (sz.Length()<8) { fprintf(fp,"mp長度小於8(%d)\n",sz.Length()); StatusBar1->SimpleText = "packet header長度不符"; return; } AnsiString filename; if(sz.SubString(1, 4)=="FILE") { if(sz=="FILE-START") { tmpStream->Size=mp.dwTotalDataSize; tmpStream->Position=0; packet_cnt [client->Tag]= 0; } tmpStream->Write(mp.pbThisData, mp.dwThisDataSize); packet_cnt[client->Tag] ; if(sz=="FILE-END") { tmpStream->Position=0; destStream->LoadFromStream(tmpStream); filename = "c:\\tmp\\" ExtractFileName(AnsiString(mp.szFileName)); if (!FileExists(filename)) destStream->SaveToFile(filename); if (destStream->Size != mp.dwTotalDataSize || packet_cnt[client->Tag]!=mp.dwPackTotal) { fprintf(fp,"圖片長度不符(} != }) 第M張錯誤\n",destStream->Size,mp.dwTotalDataSize,jpg_error_cnt[client->Tag]); StatusBar1->SimpleText = "圖片長度不符"; jpg_error_cnt[client->Tag] ; return; } //依據目前項目顯示 if (!lstrcmp(p->Type , "Quad View")) { Update_QuadView(client->Tag); } } AnsiString ClientMessage = mp.szFileName ; ClientMessage = ClientMessage IntToStr(mp.dwPackCount) IntToStr(mp.dwThisDataSize) ; Socket->SendText( ClientMessage );//回報接收結果給Server StatusBar1->SimpleText = client->Name "現在正與" Socket->RemoteHost "連線 目前圖片" mp.szFileName; } }//以下程式出現率約3.4% void TForm1::Update_QuadView(int cam_num) { fun38 ; fprintf(fp,"Update_QuadView %d\n",fun38); Graphics::TBitmap *bitmap; //將jpg Stream載入 TJPEGImage *myjpg = new TJPEGImage(); ((TMemoryStream*)jpg_pos->Items[cam_num])->Seek(soFromBeginning, 0); myjpg->LoadFromStream((TMemoryStream *)jpg_pos->Items[cam_num]); try { Image1->Canvas->StretchDraw(TRect((cam_num%2)*Panel1->ClientWidth/2, (cam_num/2)*Panel1->ClientHeight/2 ,(cam_num%2)*Panel1->ClientWidth/2 Panel1->ClientWidth/2 , (cam_num/2)*Panel1->ClientHeight/2 Panel1->ClientHeight/2 ),myjpg); } catch(...) { fprintf(fp,"QuadView - %d's JPEG Shown failed!\n",cam_num); } delete myjpg; //顯示Label AnsiString view_name = Find_Camera_Name(cam_num); ((TLabel *)Quad_Label->Items[cam_num])->Visible = true ; ((TLabel *)Quad_Label->Items[cam_num])->Caption = view_name " " rec_message[cam_num]; }//其餘程式出現率在0.01%以下,小弟猜大概不是兇手 |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
danielj
初階會員 發表:65 回覆:135 積分:40 註冊:2003-06-11 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
引言: 謝謝taishyang 版主的回答! 我一直以為是有new才需有delete,不知道沒有new的也需要嗎? 又有的我只是當指標用來取出某些記憶體,而那些記憶體可能在程式未關閉時要一直存在,這時候應該不用delete吧? 說時在的,記憶體的東西很令我頭痛,能否請諸位高手方便的話為小弟說明一下呢?謝謝啦!沒錯,有 new 的就需要 delete,在您提供的部分原始碼中,只有一個 new 而且也已 delete 了,基本上,如果您的程式由記憶體的問題,應該不是在這段程式吧。說真的,沒頭沒尾的程式,很難知道是那裡有問題。 像在 void TForm1::Update_QuadView(int cam_num) 內的 Graphics::TBitmap *bitmap; 根本就沒用到。 另外,不知道您是否有使用工作管理員確認您的程式是否占用記憶體愈來愈多,直到系統記憶體都占光,導致系統幾乎當機呢? 如果只是無法更新 image,有可能有其他執行緒占用過多的 CPU 時間或是有 LOOP 一直在執行,並不一定都是記憶體的問題。 還有,不要以為只要常執行的 code 會有問題,不常執行的 code 只要有 new 不 delete 或是重覆 new 就是會占用記憶體,與執行次數沒什麼關係。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
danielj
初階會員 發表:65 回覆:135 積分:40 註冊:2003-06-11 發送簡訊給我 |
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
|
danielj
初階會員 發表:65 回覆:135 積分:40 註冊:2003-06-11 發送簡訊給我 |
|
danielj
初階會員 發表:65 回覆:135 積分:40 註冊:2003-06-11 發送簡訊給我 |
小弟又經過一個早上的測試,特別注意系統資源的問題,結果發現當程式變慢的時候,系統資源其實還算夠,其中一個case是
System:80, User:80, GDI:98
這時候的反應就有點慢,所以到底還是不是記憶體的問題,還是說有其它的問題呢? 小弟的Client端程式是在做不停地接收數個Server傳來的圖片檔,然後顯示在image上,是否是因為Client1Read一直持續不斷地高速執行,造成資源完全被集中在那裡,使得顯示的部分未被分配到資源,所以沒有辦法更新image,可是又為什麼這種情況沒有一開始就發生呢?而且brook兄所建議的加入一行
Application->ProcessMessages();
加入後卻會出現"程式即將關閉"的錯誤? 能不能請各位大姐大哥們多給一些建議,小弟實在是不知道怎麼辦才好…
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
|
danielj
初階會員 發表:65 回覆:135 積分:40 註冊:2003-06-11 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
建議您改用 NT/2K/XP 的開發環境,才能利用工作管理員真正得知每個 process 占用系統資源的狀況,是否您的程式在更新變慢時,是否 CPU Loading 已滿載? 也可以使用
■【推薦】TaskInfo 系統狀態監視器(很詳細喔)
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=28254
它連每個程序的執行緒及網路使用狀況都有統計。 依您的描述,應該與記憶體無關,只與本身程式流程及程式技巧有關,如果,相關的 code 您不貼出來,我想別人很難幫得了您。 另外,關於網路元件,有部分網路元件寫得並不好,以 BCB5 內建的 TNMPOP3 就不是很好,利用它寫的程式如: ■【BCB】【發表】StatPlus StandAlone Version (0.0.9.525)
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=25676 當設定好 Email 帳號,開始 Check Mail 時,CPU Loading 就會飆到 100!!
您可以藉由 NT/2K/XP 的工作管理員試用不同的網路元件,找一個占 CPU Loading 小的,也許也可以改善。 沒空更新的網頁...
http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
danielj
初階會員 發表:65 回覆:135 積分:40 註冊:2003-06-11 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |