多线程连续建立和终止的内存怎样检查内存释放?谢谢 ( 积分: 200 )

  • 主题发起人 主题发起人 tigerseu
  • 开始时间 开始时间
T

tigerseu

Unregistered / Unconfirmed
GUEST, unregistred user!
主线程中读取键盘信号执行p_Run()与p_Stop()
void p_Run()
{

try
{
FlSrc=FrmMain->Memo1->Text;
//将文件读入字符串;
}
catch(...)
{
FrmMain->StatusBar3->Panels->Items[0]->Text="未指定文件!请指定";
}
if(FlSrc=="")
{

}

RdRun=new TrdRun(false);

}

void p_Stop() //程序停止并复位;
{
try
{
RdRun->Terminate();


}
catch(...)
{
...
}
}

线程运行多次的时候会出现“Access violation at adress ----.Read of adress FFFFFFFF”
以下是线程函数
__fastcall TrdRun::TrdRun(bool CreateSuspended)
: TThread(CreateSuspended)
{
Priority=tpHigher;
//设定线程优先级
FreeOnTerminate=true;

}
//---------------------------------------------------------------------------
void __fastcall TrdRun::Execute()
{
//---- Place thread code here ----
CODE *MCode=new CODE[m_iLinenum];
PGMSHOW *pShow=new PGMSHOW[m_iLinenum];// 用于主进程中显示行
for(int i=1,j=0;i<=FlSrc.Length();i++) //FlSrc 由主线程中读入
{
char tmp=FlSrc;
if(tmp=='n'||tmp=='N'||(i==FlSrc.Length()-1))
{
pShow[j].m_iBgn=i-1;
if(j!=0)
{ if(i<FlSrc.Length()-1)
{
pShow[j-1].m_iEnd=i-pShow[j-1].m_iBgn-1;
}
else
{
pShow[j-1].m_iEnd=FlSrc.Length()-pShow[j-1].m_iBgn;
}
}
j++;
}
}
NowPos();
//主进程得函数
for(int j=0;j<m_iLinenum;j++)
{
//这里将MCode[]置初值
}

POSITION pos;
//变量置初值
pos.m_lX=0;
//
pos.m_lU=0;
。。。。
CENTER cen;
//设定圆心坐标
for(int k=runPgm[0];k<runPgm[1];k++) //runPgm[0] 在主线程设定,这里读出
{
try
{
Synchronize(UpdateLine);//用于主进程中显示行
}
catch(...)
{
}
if(!Terminated) //如果没有终止该进程,则加工
//此处由主显示进程中断
{
switch(MCode[k].m_iGa)
{

case 1:
pos.m_lX=MCode[k].m_fU;
pos.m_lZ=MCode[k].m_fW;
pos.m_lY = 0;
pos.m_lU = MCode[k].m_fV;

p_LckMcx->Acquire();
try
{
RM=m_rm;
FDrvAxis(pos,mL);
//向主进程中的函数写入板卡,在此用重要区段保护
}
__finally
{
p_LckMcx->Release();
}
FWait();
//对板卡读。
break;
case 2:
...
case 3:
...
break;

} //End of switch(MCode[k].m_iGa)

...
if(!Terminated)
{
....//执行其它语句,同上
}

}
delete MCode;//结束
delete pShow
FWait();
Synchronize(UpdateFinish);
Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TrdRun::UpdateLine()
{
try
{
FrmMain->EdtRow->Text=IntToStr(m_iLN);
FrmMain->Memo1->SelStart=m_iFst;
FrmMain->Memo1->SelLength=m_iend;
if(FrmMain->PnlShow->Visible==true)
{
FrmMain->Memo1->SetFocus();
}
}
catch(...)
{
}
}

void __fastcall TrdRun::UpdateFinish()
{
FrmMain->StatusBar3->Panels->Items[0]->Text = "程序结束";
}
线程运行 p_run()和p_Stop()多次的时候会出现“Access violation at adress ----.Read of adress FFFFFFFF”
,还会出现stack overflow ,这个应当怎么解决呢?怎样能够找到那个地方内存没有释放呢?
 
主线程中读取键盘信号执行p_Run()与p_Stop()
void p_Run()
{

try
{
FlSrc=FrmMain->Memo1->Text;
//将文件读入字符串;
}
catch(...)
{
FrmMain->StatusBar3->Panels->Items[0]->Text="未指定文件!请指定";
}
if(FlSrc=="")
{

}

RdRun=new TrdRun(false);

}

void p_Stop() //程序停止并复位;
{
try
{
RdRun->Terminate();


}
catch(...)
{
...
}
}

线程运行多次的时候会出现“Access violation at adress ----.Read of adress FFFFFFFF”
以下是线程函数
__fastcall TrdRun::TrdRun(bool CreateSuspended)
: TThread(CreateSuspended)
{
Priority=tpHigher;
//设定线程优先级
FreeOnTerminate=true;

}
//---------------------------------------------------------------------------
void __fastcall TrdRun::Execute()
{
//---- Place thread code here ----
CODE *MCode=new CODE[m_iLinenum];
PGMSHOW *pShow=new PGMSHOW[m_iLinenum];// 用于主进程中显示行
for(int i=1,j=0;i<=FlSrc.Length();i++) //FlSrc 由主线程中读入
{
char tmp=FlSrc;
if(tmp=='n'||tmp=='N'||(i==FlSrc.Length()-1))
{
pShow[j].m_iBgn=i-1;
if(j!=0)
{ if(i<FlSrc.Length()-1)
{
pShow[j-1].m_iEnd=i-pShow[j-1].m_iBgn-1;
}
else
{
pShow[j-1].m_iEnd=FlSrc.Length()-pShow[j-1].m_iBgn;
}
}
j++;
}
}
NowPos();
//主进程得函数
for(int j=0;j<m_iLinenum;j++)
{
//这里将MCode[]置初值
}

POSITION pos;
//变量置初值
pos.m_lX=0;
//
pos.m_lU=0;
。。。。
CENTER cen;
//设定圆心坐标
for(int k=runPgm[0];k<runPgm[1];k++) //runPgm[0] 在主线程设定,这里读出
{
try
{
Synchronize(UpdateLine);//用于主进程中显示行
}
catch(...)
{
}
if(!Terminated) //如果没有终止该进程,则加工
//此处由主显示进程中断
{
switch(MCode[k].m_iGa)
{

case 1:
pos.m_lX=MCode[k].m_fU;
pos.m_lZ=MCode[k].m_fW;
pos.m_lY = 0;
pos.m_lU = MCode[k].m_fV;

p_LckMcx->Acquire();
try
{
RM=m_rm;
FDrvAxis(pos,mL);
//向主进程中的函数写入板卡,在此用重要区段保护
}
__finally
{
p_LckMcx->Release();
}
FWait();
//对板卡读。
break;
case 2:
...
case 3:
...
break;

} //End of switch(MCode[k].m_iGa)

...
if(!Terminated)
{
....//执行其它语句,同上
}

}
delete MCode;//结束
delete pShow
FWait();
Synchronize(UpdateFinish);
Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TrdRun::UpdateLine()
{
try
{
FrmMain->EdtRow->Text=IntToStr(m_iLN);
FrmMain->Memo1->SelStart=m_iFst;
FrmMain->Memo1->SelLength=m_iend;
if(FrmMain->PnlShow->Visible==true)
{
FrmMain->Memo1->SetFocus();
}
}
catch(...)
{
}
}

void __fastcall TrdRun::UpdateFinish()
{
FrmMain->StatusBar3->Panels->Items[0]->Text = "程序结束";
}
线程运行 p_run()和p_Stop()多次的时候会出现“Access violation at adress ----.Read of adress FFFFFFFF”
,还会出现stack overflow ,这个应当怎么解决呢?怎样能够找到那个地方内存没有释放呢?
 
可以安装内存泄露检查辅助工具!
 
有哪些内存泄漏检查辅助工具呢?比如...
 
楼主代码写得很工整,可惜俺C语言已经生疏了不少,不到万不得已,不会去看。:(
 
粗粗看了一下,线程设置为运行结束时自动释放实例的FreeOnTerminate=true;
这样,函数p_Run和p_Stop函数就有点问题啦。如果调用p_Stop时,线程RdRun已经执行结束并被释放,那么 RdRun->Terminate();就会引发内存访问违规错误。既然需要手动控制线程运行状态,那么就不要FreeOnTerminate=true,或者另外设个全局标志变量,在线程体中检测,这样p_Stop只需要设置一个这个标志,无须顾忌线程实例对象被Free的问题。另外,主线程与RdRun线程有没有及是否考虑了同步问题?RdRun线程中是直接调用NowPos();
//主进程得函数
void p_Run()
{
...
RdRun=new TrdRun(false);
...
}
void p_Stop() //程序停止并复位;
{
...
RdRun->Terminate();
...
}
 
后退
顶部