怎么程序执行大量计算的同时显示进程?
怎么显示程序执行进程?
想法是用户在主界面点一个按钮后,程序进行大量计算,同时用showmodal()弹出一个form窗体,这个窗体的edit控件不断显示程序执行到哪个阶段,程序执行结束后新的对话矿自动消失!
问题点数:20、回复次数:8Top
1 楼lluunn007(书生)回复于 2003-12-04 11:17:06 得分 5
在大量计算的循环中加入响应外部消息的一句:
for example:
for(;;;)
{
Application->ProcessMessages();//加上此句
.....
}
===============
同步显示执行过程;
你自己在执行的过程动态修改该窗体的显示就行了。Top
2 楼ljianq(泉深水清)回复于 2003-12-04 11:21:41 得分 1
不能使用showmodal()方法;Top
3 楼jiangchun_xn(GrayMemory)(再回头·灯火依旧·人不见·潸然泪下)回复于 2003-12-04 11:39:14 得分 0
你必须把大量计算放到ShowModal的fOrm里面才行。
用线程把。Top
4 楼lluunn007(书生)回复于 2003-12-04 11:42:58 得分 1
显示进程状况的窗体也不能使用ShowModal()模式,最好还是Show()吧。Top
5 楼heng2003(哼哼)回复于 2003-12-04 12:14:34 得分 10
用线程吧
在显示执行进度的窗口生成的时候开启线程
线程的简单代码我写一点示范
mythread.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
FreeOnTerminate = true;
Count = 0;
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
//---- Place thread code here ----
while(!Terminated && Count<100){
Synchronize(Loop);
Count++;
::Sleep(100);
}
Synchronize(LoopEnd) ;
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Loop()
{
if(Form2!=NULL){
Form2->ProgressBar1->StepIt();
Form2->Label1->Caption = Form2->ProgressBar1->Position;
}
}
void __fastcall TMyThread::LoopEnd()
{
if(Form2!=NULL){
Form2->Label1->Caption = "Thread end.";
}
}
mythread.h
//---------------------------------------------------------------------------
#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TMyThread : public TThread
{
private:
protected:
void __fastcall Execute();
void __fastcall Loop();
void __fastcall LoopEnd();
int Count;
public:
__fastcall TMyThread(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
线程一启动,就每秒钟将Form2 的progressbar Step 一下,label 也跟着变更
在线程计数count到100 后,线程终止,label 的caption 也改为"Thread end."
这个只是一段很简单的代码
思路应该跟你的要求差不多,你看看自己在自己的代码中采用线程就可以了
Top
6 楼yangguo_god(狂学java....)回复于 2003-12-04 12:44:36 得分 1
Application->ProcessMessages();//响应消息,
最好用线程Top
7 楼yjy1001(蓝鲸--优秀得郁闷的鱼)回复于 2003-12-04 13:15:57 得分 1
Application->ProcessMessages();//加上此句
交出 CPU控制权 来让CPU响应其他显示语句的操作
Top
8 楼yhz(耗子)回复于 2003-12-04 19:07:03 得分 1
在子线程中处理计算任务。
这样主线程可以显示进度条,也可以相应其它的操作。
这是最合适的解决方法。Top




