请教一个线程问题
我的目的是在主程序里产生一个线程,线程读取一个命令文件。
void __fastcall TMainForm::LoadCommandClick(TObject *Sender)
{
cf=true;
Command1 = new CommandFile(false); // creat a new thread
}
在线程里面我执行读取文件和执行命令
void __fastcall CommandFile::Execute()
{
String commandfile,s;
char *line;
char cFirst, cSecond;
String sCommandnum;
int i,j;
int loop_begin,loop_end,cont=0;
char *cBuffer;
long begin,end,icount;
line = new char [40];
line= " ";
MainForm-> OpenDialog1-> FileName= " ";
MainForm-> OpenDialog1-> Execute();
commandfile=MainForm-> OpenDialog1-> Files-> Text;
if(MainForm-> OpenDialog1-> FileName.Length()!=0) // if filename is not empty
{
commandfile=MainForm-> OpenDialog1-> FileName;
ifstream cfile (commandfile.c_str());
if (cfile.is_open())
{
begin = cfile.tellg();
cfile.seekg (0, ios::end);
end = cfile.tellg();
icount=end-begin;
if(icount> 0)
{
cBuffer = new char [icount];
cfile.seekg (0, ios::beg);
cfile.read (cBuffer, icount);
}
cfile.close();
j=0;
line= " ";
for(i=0;i <icount;i++)
{
line[j]=cBuffer[i];
j++;
if(line[j-1]== '\n ')
{
line[j]=0;
if(line[0]== 'L '&& line[1]== '0 ') // set loop start pointer
loop_begin=i;
if(line[0]== 'L '&& (line[1]== '2 '||line[1]== '3 '))
{
loop_end=i; // set loop end pointer
cont=i; // set continuse pointer
i=loop_begin; // jump to loop start
MainForm-> loop_flag=true;
}
if(MainForm-> loop_flag && i==loop_end) //jump to loop start
i=loop_begin;
GoCommand(line);// 这是一个线程里的子函数
if( !MainForm-> loop_flag && cont!=0) // continue excute command file
{
i=cont;
cont=0;
}
for(j=0;j <4;j++) line[j]=0; // initialize line
j=0;
if(MainForm-> bW_answer || waitflag==true)
this-> Suspend(); // pause excute next command till get answer
waitflag=false;
}
}
}
}
delete[] cBuffer;
delete[] line;
MainForm-> cf=false;
}
问题是当第一次执行完命令文件,线程应该结束了,这个时候我应该可以开始另外一个新的线程来执行其他命令文件,可是实际上当我开始另外一个线程(在主程序里按LoadCommand Button)时,出现错误:HLS5010.exe raise exception calss EAccess with message "Access violation at address 004B080A in module HLS5010.exe ". 请高手帮我看看,到底是哪里错了?是不是上一个线程没结束呢?
哪里有线程的例子可以参考一下呢.谢谢了
[解决办法]
第一次运行完,支持终结,没有被释放
你可以在函数尾加一个 this-> Free(); 完成一个自我释放。