全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1550
推到 Plurk!
推到 Facebook!

重覆執行Thread記憶體一直增加問題

尚未結案
benlin0725
一般會員


發表:4
回覆:2
積分:1
註冊:2012-05-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-05-03 17:31:09 IP:61.58.xxx.xxx 訂閱
小弟是新手
最近遇到了一個問題
就是使用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-08-10 00:49:18 IP:128.2.xxx.xxx 訂閱
 你的 ExeThread在那裡delete的?
系統時間:2017-10-19 22:32:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!