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

可否請大家幫我看看那邊會消耗記憶體

答題得分者是:dllee
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-05 17:52:29 IP:61.220.xxx.xxx 未訂閱
大家好,又來麻煩大家了… 小弟的網路傳檔程式本來以為可以收工了,沒想到路遙知馬力,小弟的Client端程式大約十數分鐘後就有點像是顯示記憶體不足的樣子,原本該更新的圖都不會更新顯示,小弟設斷點去觀察各個程式被執行到的次數,取出佔最大比例的部分貼出來請大家幫忙找找看是否有什麼地方記憶體配置不當或使用不當,以致於導致無法更新image。 先謝啦!    //以下程式出現率3.75%
 
AnsiString TForm1::Find_Camera_Name(int num)
{
    myNodeItem *p;
    for (int i=0;iItems->Count;i  )
    {
        p=&nodeitem[i];
        if ((!lstrcmp(p->Type,"Camera")) && p->Data2[0]==num)
        {
            return((AnsiString)p->Name);
        }
    }
    return("");
} 
//以下程式出現率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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-05 18:15:49 IP:140.135.xxx.xxx 未訂閱
danielj您好:   會不會是動態產生的物件沒有釋放記憶體呢?? 要delete掉    
 
myNodeItem *p;
TMemoryStream *destStream,*tmpStream;
Graphics::TBitmap *bitmap;
   
使用完後都要釋放掉記憶體 即
 
delete p;
delete destStream;....依此類推
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-05 18:31:36 IP:61.220.xxx.xxx 未訂閱
謝謝taishyang 版主的回答! 我一直以為是有new才需有delete,不知道沒有new的也需要嗎? 又有的我只是當指標用來取出某些記憶體,而那些記憶體可能在程式未關閉時要一直存在,這時候應該不用delete吧? 說時在的,記憶體的東西很令我頭痛,能否請諸位高手方便的話為小弟說明一下呢?謝謝啦!
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-05 22:20:39 IP:61.224.xxx.xxx 未訂閱
引言: 謝謝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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-06 10:44:48 IP:61.220.xxx.xxx 未訂閱
多謝dllee的建議! 小弟有用98附屬應用程式中的資源監視表看過,記憶體並沒有愈來愈不夠的趨勢,而系統也沒有當機,主要是此程式會反應很慢(例如若先將此程式最小化,然後再回復正常,畫面要一陣子才會出現),而其餘的程式執行都還正常。 而小弟也仔細檢查過所有的程式碼,有new的地方一定都有delete掉了… 小弟一直找不出(其實也不知道該怎麼找才好)問題癥結所在,能否請各位高手指點一個方向,到底該從何著手比較好呢? 謝謝大家!
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-06 11:19:02 IP:218.160.xxx.xxx 未訂閱
void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { //試試讓程式有多一點的時間處理其他事,看看會不會好一點 Application->ProcessMessages(); }
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-06 13:21:02 IP:61.220.xxx.xxx 未訂閱
多謝brook您的建議! 我試過了,好像真的有好一些,可以撐得久一些,但是會出現作業系統錯誤”這個程式即將關閉"… 請大家再給一些建議… 謝謝!
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-06 14:18:12 IP:61.220.xxx.xxx 未訂閱
小弟又經過一個早上的測試,特別注意系統資源的問題,結果發現當程式變慢的時候,系統資源其實還算夠,其中一個case是 System:80, User:80, GDI:98 這時候的反應就有點慢,所以到底還是不是記憶體的問題,還是說有其它的問題呢?    小弟的Client端程式是在做不停地接收數個Server傳來的圖片檔,然後顯示在image上,是否是因為Client1Read一直持續不斷地高速執行,造成資源完全被集中在那裡,使得顯示的部分未被分配到資源,所以沒有辦法更新image,可是又為什麼這種情況沒有一開始就發生呢?而且brook兄所建議的加入一行 Application->ProcessMessages(); 加入後卻會出現"程式即將關閉"的錯誤?    能不能請各位大姐大哥們多給一些建議,小弟實在是不知道怎麼辦才好…    
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-06 16:07:21 IP:218.160.xxx.xxx 未訂閱
引言: 小弟的Client端程式是在做不停地接收數個Server傳來的圖片檔
一般的設計是一個Server端程式服務數個Client端,不知是不是筆誤?
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-08-06 16:59:55 IP:61.220.xxx.xxx 未訂閱
這邊或許和一般的應用不大一樣,因為小弟這邊是要做到A接收B,C,D,E,..等傳送來之檔案,而B,C,D,E,...是一直打開的,A可以選擇性地連接其中一部或多部電腦,所以小弟才會說是Client端程式是在做不停地接收數個Server傳來的圖片檔,不知道大家是否知道我的意思?還是我的觀念錯誤?請大家不吝指正,謝謝您!
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-08-07 09:29:46 IP:61.224.xxx.xxx 未訂閱
建議您改用 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-08-07 18:25:51 IP:61.220.xxx.xxx 未訂閱
謝謝您的回應! 小弟已經將全部的程式碼放在問題求助區 client端的程式在 http://delphi.ktop.com.tw/loadfile.php?TOPICID=11082404&CC=247856 server端在 http://delphi.ktop.com.tw/loadfile.php?TOPICID=10915888&CC=244132 請前輩們有空幫忙看看,多謝大家!
系統時間:2024-04-28 17:04:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!