多线程中出现Access violation at adress,请指教啊,谢谢 ( 积分: 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++Builder很难帮你调试呀!
一般这种情况是数组访问越界了!
 
// 最好在使用数组下标的是否进行有效性校验
例如:
for(int i=1,j=0;i<=FlSrc.Length() i <
;i++)
建议改为:
for(int i=1,j=0;i<=FlSrc.Length() &&
i <
m_iLinenum i <
;i++)
 
FreeOnTerminate=true;
RdRun->Terminate();RdRun已经执行结束被释放过了就会出错。
 
多人接受答案了。
 
后退
顶部