W wangsangwu Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-05 #21 如果是这样的话,线程执行的时候先执行模型线程完,然后再执行的进度条, 不知道这是为什么?
T thx1180 Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-05 #22 这是线程没有同步好吧,我的做法一般是在线程中发一个自定义的消息到主线程, 由主线程响应消息去更新进度条。
W wangsangwu Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-10 #23 to thx1180,如果是这样,那怎么实现那》?? 麻烦了
S spidertong Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-11 #24 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你用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 固定的时间 ....//然后再做你的工作 } }
I ice_xq Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-17 #25 1.构造函数里的FreeOnTerminate = true;没起预期的作用。试试这样行不行: __fastcall TModelThread::TModelThread(bool CreateSuspended) :FreeOnTerminate(true),TThread(CreateSuspended) {} 很久没用C++不知道BCB中类的属性是否可以用初始化表的方式初始化。 2.VCL的线程安全是由于在子线程访问VCL时主线程也有可能同时访问(如:消息循环,绘制界面)所以需要同步(Synchronize)。所以如果不能确定ATL是否只被一个线程访问,那么就需要用Synchronize。 以上论点未经验证。
1.构造函数里的FreeOnTerminate = true;没起预期的作用。试试这样行不行: __fastcall TModelThread::TModelThread(bool CreateSuspended) :FreeOnTerminate(true),TThread(CreateSuspended) {} 很久没用C++不知道BCB中类的属性是否可以用初始化表的方式初始化。 2.VCL的线程安全是由于在子线程访问VCL时主线程也有可能同时访问(如:消息循环,绘制界面)所以需要同步(Synchronize)。所以如果不能确定ATL是否只被一个线程访问,那么就需要用Synchronize。 以上论点未经验证。
F feifeich Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-19 #26 同意spidertong说的观点, 不过如果你的模型计算只有一步,那也只有使用定时器模拟进度了, 你这个线程的实现仅仅是不让界面死掉而已, 赫赫, 我也这么用过(不得以). 另外, 再次调用之前请确定线程已经结束, 或者没有冲突.
同意spidertong说的观点, 不过如果你的模型计算只有一步,那也只有使用定时器模拟进度了, 你这个线程的实现仅仅是不让界面死掉而已, 赫赫, 我也这么用过(不得以). 另外, 再次调用之前请确定线程已经结束, 或者没有冲突.
S spidertong Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-19 #27 要确定线程结束而自己又没有办法 可以用WaitForSingleObject(线程的Handle,,,) 并给他一个事件,由系统在线程结束时通知你,这样就可以确保线程结束了。
F feifeich Unregistered / Unconfirmed GUEST, unregistred user! 2003-06-19 #28 在线程的OnTerminate事件中PostMessage(form的handle, 自定义的线程结束消息, 附加参数, 附加参数), 然后再form中处理该消息就可以了。