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

  • 主题发起人 wangsangwu
  • 开始时间
如果是这样的话,线程执行的时候先执行模型线程完,然后再执行的进度条,
不知道这是为什么?
 
这是线程没有同步好吧,我的做法一般是在线程中发一个自定义的消息到主线程,
由主线程响应消息去更新进度条。
 
to thx1180,如果是这样,那怎么实现那》??
麻烦了
 
1你用Timer,根本不能确定TThread执行完毕
应该在你的TThread中加入一个函数 Update进度条
然后在
Caculatemodel(Global_model_id);
//调用模型计算
的循环中 Sychunzie(那个函数)
2
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled = true ;
Tmod = new TModelThread(false);
}
改为
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled = true ;
if(Tmod==NULL)
{
Tmod = new TModelThread(false);
}
else
{
Tmod->Terminate=true;//中断线程
WaitFor( )//如果线程中断时撤销 可以waitfor 线程的handle
//或waitfor 固定的时间
....//然后再做你的工作
}
}
 
1.构造函数里的FreeOnTerminate = true;没起预期的作用。试试这样行不行:
__fastcall TModelThread::TModelThread(bool CreateSuspended)
:FreeOnTerminate(true),TThread(CreateSuspended)
{}
很久没用C++不知道BCB中类的属性是否可以用初始化表的方式初始化。
2.VCL的线程安全是由于在子线程访问VCL时主线程也有可能同时访问(如:消息循环,绘制界面)所以需要同步(Synchronize)。所以如果不能确定ATL是否只被一个线程访问,那么就需要用Synchronize。
以上论点未经验证。
 
同意spidertong说的观点, 不过如果你的模型计算只有一步,那也只有使用定时器模拟进度了, 你这个线程的实现仅仅是不让界面死掉而已, 赫赫, 我也这么用过(不得以).
另外, 再次调用之前请确定线程已经结束, 或者没有冲突.
 
要确定线程结束而自己又没有办法
可以用WaitForSingleObject(线程的Handle,,,)
并给他一个事件,由系统在线程结束时通知你,这样就可以确保线程结束了。
 
在线程的OnTerminate事件中PostMessage(form的handle, 自定义的线程结束消息, 附加参数, 附加参数), 然后再form中处理该消息就可以了。
 
多人接受答案了。
 
顶部 底部