在一些事务控制中会出现进度条的使用,所我们需要一个统一的进度条管理机制
比如:
1、可以满足普通进度条的功能(不要以为是很简单的问题,因为控件的使用不会出现在程序中,更多可能是使用一些函数)
2、进度取消的功能(取消按钮可以让当前的执行过程终止掉)所以本人在应用的过程中定义了一个类来使用进度条
问题就出现在上面的2个需求上。
可以使用一个开发的函数来进行进度的记录
如 process(....)各位有什么好的想法和经验拿出来吧,进度条使用时是否需要线程管理...
比如:
1、可以满足普通进度条的功能(不要以为是很简单的问题,因为控件的使用不会出现在程序中,更多可能是使用一些函数)
2、进度取消的功能(取消按钮可以让当前的执行过程终止掉)所以本人在应用的过程中定义了一个类来使用进度条
问题就出现在上面的2个需求上。
可以使用一个开发的函数来进行进度的记录
如 process(....)各位有什么好的想法和经验拿出来吧,进度条使用时是否需要线程管理...
线程内部需要管理操作的事件???有没有相关的代码可以看呀,多谢各位了
因为控件的使用不会出现在程序中----這是什麼意思?>>>2、进度取消的功能(取消按钮可以让当前的执行过程终止掉)
問題二用TThread對象完全可以實現.完全理解你的需求後我可以幫你試一試.或寫個測試單元
]在循环体内用
PeekMessage和PostMessage,同样能实现随时取消,而且能免去线程管理的复杂不过这样会影响一些些循环速度,你如果不是对速度的要求很高,也可这样处理
>>沒時間了, 下班了. 剛才寫了個簡單的演示. 代碼如下.unit uProgressBarManager;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ComCtrls;type TPBManagerThreadBase = class(TThread)
private
FEdit: TEdit;
FProgressBar: TProgressBar;
public
procedure Execute; override;
property Editor: TEdit read FEdit write FEdit;
property ProgressBar: TProgressBar read FProgressBar write FProgressBar;
end; {=========================================================}
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
BitBtn1: TBitBtn;
Edit1: TEdit;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
fthread: TPBManagerThreadBase;
public
end;var
Form1: TForm1;implementation{$R *.dfm}{ TPBManagerThreadBase }procedure TPBManagerThreadBase.Execute;
var
i: integer;
begin
inherited;
self.FProgressBar.Min := 0;
self.FProgressBar.Max := 10000;
for i := 0 to 10000 do
begin
FEdit.Text := inttostr(i);
FEdit.Update;
self.FProgressBar.Position := i;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
fthread := TPBManagerThreadBase.Create(true);
fthread.Editor := self.Edit1;
fthread.ProgressBar := self.ProgressBar1;
end;procedure TForm1.BitBtn1Click(Sender: TObject);
begin
self.fthread.Suspend;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
self.fthread.Resume;
end;end.
有點類似策略模式,其實可以說Execute方法是個模板方法!有興趣的朋友可以看看Classes單元內的源代碼
當你要實現某個不同的功能是,繼承TPBManagerThreadBase類,override .Execute方法.在Execute方法內寫代碼實現你的功能.
假設MyThread--->TPBManagerThreadBase(繼承);//實現copy記錄的進度
MyThreadA--->TPBManagerThreadBase(繼承); //實現cycle讀取某個數據.fthread:= MyThread.create;
fthread:= MyThreadA.create;
......
這能實現N個不同的功能.寫的不夠詳細. 請包涵.
m_bStop := true;在循环中:
ProgressBar.Position := ProgressBar.Position + 1;
Application.ProcessMessages();
if m_bStop then
begin
break;
end;
因為你的所有操作的代碼是寫在TThread.Execute方法內.
只要調用fthread.Suspend;方法就可以取消进程内的事件.>>>> 是否需要在线程内部在定义一个事件类型,以取消时使用???
不明白你的意思, 你將上面的代碼去運行一次,體驗一下怎樣使用線程.也許你有了新的靈感!
總之你的問題不難解決. 要看你領悟了多少!
只要調用fthread.Suspend;方法就可以取消进程内的事件.
进程内的事件是在外面的某个事件,那一定要有事件参数传入了,否则怎么知道外面的事件被取消了呢