|
关于Kylix3中线程的问题
我写有一个函数如下:
bool work(AnsiString FName,AnsiString RetName)
{
Form1->Memo1->Lines->Clear();
FILE *fp;
AnsiString tem;
char buf[200];
fp=popen(FName.c_str(),"r");
while(fgets(buf,200,fp)!=NULL) //等程序处理完成,并读出终端信息显示到Form1->Memo1中
{
tem=AnsiString(buf) ;
Form1->Memo1->Lines->Add(tem.SubString(1,tem.Length()-1) );
}
pclose(fp);
if(FileExists(RetName)) // "c:\\ok.dat"))//检测处理结果文件
{
DeleteFile(RetName); //"c:\\ok.dat");
return true; //处理成功
}
else
return false;//处理失败
}
加在Form的Button中一执行,整个程序就象死了一样,
没有了反应了;直到外部大数据处理程序处理完成后,
程序才有反应。(一般处理数据要30分钟左右)。
所以,我就只好将这个work处理函数加在线程中,
用
void __fastcall TForm1::Button5Click(TObject *Sender)
{
MyThread *MyBat=new MyTread(false);
}
来启动处理.
但是传进与传出的参数如何操作呢??只有用extern吗?
如何知道何时处理完成了呢?返回的是true还是false呢?
原来是不用线程的,但是每次一按动数据处理按钮后,按钮没反应了,FORM也没有反应了,
想进行其它操作时,菜单也没有反应了,
为显示处理进度的进度条也没有反应了(因为要显示出正在处理数据,所以用了进度条
,在时钟中用StepIt()循环);
现在只好用线程作处理了。由于自己对线程不熟,所以想不出在线程中参数传入与出的
好方法,还有控制FORM中的进度条与按钮的允许与禁止。。。只好在这里求助了。。多谢! |
|