重覆執行Thread記憶體一直增加問題 |
尚未結案
|
benlin0725
一般會員 發表:4 回覆:2 積分:1 註冊:2012-05-03 發送簡訊給我 |
小弟是新手
最近遇到了一個問題 就是使用timer一直new一個thread後 執行完後就free(或delete)掉 問題來了 就是找不出為什麼記憶體會一直增加的問題點 請各位有經驗的大大幫忙小弟找尋bug 以下是< void __fastcall TTaskExecuteForm::btnSetClick(TObject *Sender) { DWORD dwRet,dwLength; AnsiString sAnsi; int iFileHandle,iFileLength; char sPath[MAX_PATH 1]; char sFilePath[MAX_PATH 1],*sFilePart[1]; if(edtExecuteName->Text.Length()) { dwRet=GetCurrentDirectory(MAX_PATH,sPath); //找尋當前的目錄的完整路徑 if(dwRet==0) return; dwRet=SearchPath(sPath,edtExecuteName->Text.c_str(),TEXT(".ini"),100,sFilePath,sFilePart); //在指定的目錄下找尋指定的檔案名稱是否存在 if(dwRet!=0) { iFileHandle=FileOpen(*sFilePart,fmOpenRead); iFileLength=FileSeek(iFileHandle,0,2); FileSeek(iFileHandle,0,0); sReceiveBuff=new char[iFileLength 1]; FileRead(iFileHandle,sReceiveBuff,iFileLength); FileClose(iFileHandle); if(ExeThread) ExeThread->Terminate(); //停止Thread else { ExeThread=new ExecuteThread(true); //新增一個ExeThread並預設為暫停運作 ExeThread->FreeOnTerminate=true; if(!ExeThread) //檢查系統是否有配置記憶體空間給ExeThread return; ExeThread->Resume(); //開始執行ExeThread } } else { sAnsi=""; sAnsi ="所輸入的任務名稱 \" "; sAnsi =edtExecuteName->Text; sAnsi =".ini \" 檔案不存在 \n請重新輸入"; dwRet=MessageBox(Handle,sAnsi.c_str(),"系統訊息",MB_OK MB_ICONWARNING); if(dwRet=IDOK) { edtExecuteName->Text=""; return; } } } } void __fastcall TTaskExecuteForm::Timer1Timer(TObject *Sender) { Timer1->Enabled=false; ExeThread=NULL; delete[] sReceiveBuff; TaskExecuteForm->btnSetClick(Sender); } 以下是< void __fastcall ExecuteThread::Execute() { while(!this->Terminated) { if(dwConnRobot) { Synchronize(GoStrtokString); } } } void __fastcall ExecuteThread::MoveRobot() { MOVEDATASTRUCT *ptr; int iRet; long lPosNo; float fPosition[7]={0}; ptr=HeadPos; while(ptr!=NULL) //檢查ptr是否已指向到檔案的結尾 { lPosNo=ptr->lpMovePosition; iRet=nrc_get_VarP(lPosNo,fPosition); switch(ptr->sMoveType) { case 'P': iRet=nrc_MoveP(ptr->lInterpolation,ptr->sPoseAccuracy.c_str(),fPosition,"NEXT"); break; case 'J': iRet=nrc_MoveJ(ptr->lInterpolation,ptr->sPoseAccuracy.c_str(),fPosition,"NEXT"); break; case 'T': iRet=nrc_MoveT(ptr->lInterpolation,ptr->sPoseAccuracy.c_str(),fPosition,"NEXT"); break; } if(ptr==HeadPos) { HeadPos=HeadPos->NextPos; delete ptr; } ptr=HeadPos; } TaskExecuteForm->Edit1->Text=i ; } void __fastcall ExecuteThread::GoStrtokString() { long lInterpolation; AnsiString sSentence,sAnsi; bool bIndexFlag=false; int iIndex=0,iCount=0,*iStringBuff=NULL; char *sString,*psReceiveBuff; psReceiveBuff=sReceiveBuff; do { sString=strtok(psReceiveBuff,"\r\n"); newptr=new MOVEDATASTRUCT; if(!newptr) //檢查系統是否有配置記憶體空間給變數newptr return; sSentence=AnsiString(sString); // iStringBuff=(int*) malloc(sSentence.Length() 1); iStringBuff=new int[sSentence.Length() 1]; if(!iStringBuff) //檢查系統是否有配置記憶體空間給變數newptr return; for(int iLoop=0;iLoop<=sSentence.Length();iLoop ) { iStringBuff[iLoop]=(int)sString[iLoop]; //將所有字元強制轉換成十進位值比較 if(iStringBuff[iLoop]<48) { sAnsi=sSentence.SubString(iIndex,iCount); if(sAnsi=="MOVE") newptr->sInstrction=sAnsi; if(sAnsi=="P") newptr->lInterpolation=0; if(sAnsi=="L") newptr->lInterpolation=1; if(sAnsi=="C") newptr->lInterpolation=2; if(sAnsi=="S") newptr->lInterpolation=3; if(sAnsi=="@P"||sAnsi=="@E"||sAnsi=="@0") newptr->sPoseAccuracy=sAnsi; if((iStringBuff[iLoop-sAnsi.Length()]>64)&&(iStringBuff[iLoop-sAnsi.Length() 1]>=48)&&(iStringBuff[iLoop-sAnsi.Length() 1]<=57)) { newptr->sMoveType=(char)iStringBuff[iLoop-sAnsi.Length()]; newptr->lpMovePosition=StrToInt(sSentence.SubString(iIndex 1,iCount-1)); } iCount=0; bIndexFlag=false; } else { if(!bIndexFlag) //設立一個找尋Index的旗標 if(iStringBuff[iLoop]>=48) { iIndex=iLoop 1; //iLoop 1是因為string的起始位置是1而陣列的起始位置是0 bIndexFlag=true; } iCount ; } } newptr->NextPos=NULL; if(HeadPos==NULL) //檢查HeadPos的內容為NULL(上未建立任何節點)時,將HeadPos及TailPos同時指向第一個節點 HeadPos=newptr; else //檢查HeadPos的內容不為NULL時,將新建立的節點指向前一個節點後面 TailPos->NextPos=newptr; TailPos=newptr; delete[] iStringBuff; // free(iStringBuff); psReceiveBuff=psReceiveBuff strlen(sString) 2; } while(*psReceiveBuff!=NULL); MoveRobot(); this->Terminate(); if(TaskExecuteForm->ExeThread->Terminated) TaskExecuteForm->Timer1->Enabled=true; } 編輯記錄
benlin0725 重新編輯於 2012-05-03 21:09:48, 註解 無‧
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |