第二次调用线程不运行!(70分)

  • 主题发起人 wangsangwu
  • 开始时间
W

wangsangwu

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序的模型计算时间比较长,所以我在界面上加了一个进度条。
在模型计算的时候显示进度。我添加了一个线程调用模型计算,而进度条是
通过界面上的定时器触发的。
结果我发现我得程序第一次可以实现,但是第二次点击的时候调用模型的线程他不运行了
不知道为什么????
 
你的线程没有正常退出吧?把代码贴出来看看。
 
不可能,我也用过线程,好像没有你这样的问题。你的模型信息是不是每次都正确的传递给了线程?
 
//模型线程定义
class TModelThread :public TThread
{
private:
AnsiString Model_id ;
bool bmcc ;
void __fastcall RunUpdate(void);
protected :
void __fastcall Execute();
public :
__fastcall TModelThread(bool CreateSuspended) ;
//:TThread(CreateSuspended){}
} ;
//实现
void __fastcall TModelThread::RunUpdate(void)
{
Caculatemodel(Global_model_id);
//调用模型计算
}
void __fastcall TModelThread::Execute()
{
RunUpdate();
}
__fastcall TModelThread::TModelThread(bool CreateSuspended):TThread(CreateSuspended)
{
FreeOnTerminate = true;
}
 
//调用线程的窗体头文件
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TTimer *Timer1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
TProThead *Pt;
TModelThread *Tmod;
};
//实现
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled = true ;
Tmod = new TModelThread(false);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(Tmod)
Tmod->Terminate() ;
Action = caFree ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(ProgressBar1->Position < ProgressBar1->Max)
{
ProgressBar1->StepIt();
}
else
{
Timer1->Enabled = false ;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ProgressBar1->Position = 0 ;
ProgressBar1->Step = 10 ;
Timer1->Interval = 3000;
}
//---------------------------------------------------------------------------
 
我用的是BCB,
大概想法是在点击按钮后,启动定时器和模型计算线程,现在我发现第一次计算
是可以的,退出窗体后再进入后点击按钮,模型计算线程不能启动了。
不知道这是为什么?
 
没有看到你的Caculatemodel,不过从贴出来的代码看,
看不出Caculatemodel过程什么时候执行完了。
 
我现在可以保证Caculatemodel算完的时候进度条已经走完了,
Caculatemodel调用的是一个用ATL封装的模型,代码太多了,所以
就没有贴上去。
 
FreeOnTerminate = true;
不是就是再线程算完后自动销毁线程吗?
 
这是你的线程类的构造器吧:
__fastcall TModelThread::TModelThread(bool CreateSuspended):TThread(CreateSuspended)
{
FreeOnTerminate = true;
}
在Delphi中,都应该有一句:inherited Create(CreateSuspended);
在BCB中也应该有类似的处理吧。
 
TThread(CreateSuspended)
这个就是了
 
从贴出来的代码看不出什么问题,估计还是Caculatemodel的问题,
你自己仔细查一查,或者换一个简单点的过程作测试,Caculatemodel
过程中应该没有访问VCL的代码吧。
 
可以把FreeOnTerminate = true;这一句放在
Execute方法中RunUpdate();的前面试试。
 
Caculatemodel中纯粹是调用模型计算,不会调用任何VCL对象
 
TThread的构造器调用CreateThread API函数创建线程,如果其dwCreationFlags参数
为0(即CreateSuspended为False)则立即执行线程,即调用线程的Execute方法,
所以构造器中的FreeOnTerminate = true;这一句根本没有执行。
 
TCOMInterface 是不是VCL对象?
 
我在Caculatemodel中用到了他!
 
TCOMInterface 是不是VCL对象,我还真有点迷惑,
不过它应该至少不属于Delphi 的VCL对象。
 
他也属于delphi的vcl对象吧
 
如果TCOMInterface 确实是VCL对象,在线程中调用要用Synchronize执行,
有没有把FreeOnTerminate = true;这一句放在Execute方法中试试?
 
顶部