进度条与进程的同步(马上给分) 我设计了一个进度条,用计时器控制,当一个进程在执行时,进度条同步显示它的进度,如何实现?多谢各位大虾!!!!!!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在Thread的Execute() 中加入 Synchronize(ShowProgress);procedure ShowProgress();begin //此处插入进度条位置更新end; 有,但是不是很好的当一个进程每次执行一步时,就使“进度”增加,然后调用“进度”.Update()更新视图(窗体) 这样会影响进程的执行速度。还是用Thread的好。 你也可以用时钟来控制Update()更新视图(窗体) 楼上说的都可以最好好还是用wengj() 说的! wengi,线程我不会用,能否详细说明?不胜感谢!!!!! 在子线程中可以向主线程连续的发送消息,当主线程中接收到该消息后就相应,刷新进度条。例如:主线程:const WM_ProgressChange = WM_User + 100;TForm1 = class(TForm)private procedure WMProgressChange(var Message: TMessage); message WM_ProgressChange;procedure TForm.WMProgressChange(var Message: TMessage);begin if Message.msg = WM_ProgressChange begin // 刷新进度条 end;end;end;子线程:procedure TThread1.Execute;var i: Integer;begin for i := 1 to 100 do SendMessage(Form1.handle, WM_ProgressChange, 0, 0);end;大概就是这样了,一段时间没有写过pascal代码了,没有调试过,基本思想是这样的。 unit ThreadTest;interfaceuses Classes, ComCtrls;type TTestThread = class(TThread) private FPosition: Integer; Fpb: TProgressBar; FMax :Integer; procedure DoShowProgress; public constructor CreateIt(pb: TProgressBar; Min: Integer; Max: Integer); procedure Execute(); override; end;implementation{ TTestThread }constructor THintThread.CreateIt(pb: TProgressBar; Min, Max: Integer);begin Inherited Create(False); if (not Assigned(Fpb)) or (Max<Min) then raise Exception.Create('参数有误。'); FreeOnTerminate :=True; Fpb :=pb; Fpb.Min :=Min; Fpb.Max :=Max; FMax := Max; Fpb.Position := Min;end;procedure THintThread.DoShowProgress;begin Fpb.Position :=FPosition;end;procedure THintThread.Execute;var Index:Integer;begin inherited; Index:=0; while True do begin if Terminated then//这个判断非常重要!!!!! Break; //想做的事情在此写(下) //此处不要写Application.HandleMessage 危险!!!! //每Index=10000时Position+1; Inc(Index); if Index=10000 then begin Index:=0; FPosition :=FPosition+1; if FPosition=FMax then Break else Synchronize(DoShowProgress); end; //想做的事情在此写(上) end;end;end.使用: ... TTestThread.CreateIt(pb,0,10); ... 如还有其他的问题,请发邮件到 [email protected] ftp问题.. delphi隐藏图标 发展国内软件,免费发手机短信! 动态链接库问题??急用?? 在线等待:如果我要用Possmessage传递一个字符串,如何做................ sql语法有什么错误? 窗体重绘在切换窗口和鼠标事件时变成窗体背景色 多线程问题 (关于自定义线程数量去处理N个任务) (多线程的精华讨论) (100分) 数据库文件格式 如何用modem直接向call机发数字信息? 关于DBEDIT的一个小问题 画直线抢大分:
Synchronize(ShowProgress);procedure ShowProgress();
begin
//此处插入进度条位置更新
end;
这样会影响进程的执行速度。
还是用Thread的好。
不胜感谢!!!!!
主线程:
const
WM_ProgressChange = WM_User + 100;
TForm1 = class(TForm)
private
procedure WMProgressChange(var Message: TMessage);
message WM_ProgressChange;
procedure TForm.WMProgressChange(var Message: TMessage);
begin
if Message.msg = WM_ProgressChange
begin
// 刷新进度条
end;
end;
end;
子线程:
procedure TThread1.Execute;
var
i: Integer;
begin
for i := 1 to 100 do
SendMessage(Form1.handle, WM_ProgressChange, 0, 0);
end;
大概就是这样了,一段时间没有写过pascal代码了,没有调试过,基本思想是这样的。
Classes, ComCtrls;type
TTestThread = class(TThread)
private
FPosition: Integer;
Fpb: TProgressBar;
FMax :Integer;
procedure DoShowProgress;
public
constructor CreateIt(pb: TProgressBar; Min: Integer; Max: Integer);
procedure Execute(); override;
end;implementation{ TTestThread }constructor THintThread.CreateIt(pb: TProgressBar; Min, Max: Integer);
begin
Inherited Create(False);
if (not Assigned(Fpb)) or (Max<Min) then
raise Exception.Create('参数有误。');
FreeOnTerminate :=True;
Fpb :=pb;
Fpb.Min :=Min;
Fpb.Max :=Max;
FMax := Max;
Fpb.Position := Min;
end;procedure THintThread.DoShowProgress;
begin
Fpb.Position :=FPosition;
end;procedure THintThread.Execute;
var
Index:Integer;
begin
inherited;
Index:=0;
while True do
begin
if Terminated then//这个判断非常重要!!!!!
Break;
//想做的事情在此写(下)
//此处不要写Application.HandleMessage 危险!!!! //每Index=10000时Position+1;
Inc(Index);
if Index=10000 then
begin
Index:=0;
FPosition :=FPosition+1;
if FPosition=FMax then
Break
else
Synchronize(DoShowProgress);
end;
//想做的事情在此写(上)
end;
end;end.
使用:
...
TTestThread.CreateIt(pb,0,10);
...