关于进度条的问题(20分)

  • 主题发起人 windthunder
  • 开始时间
W

windthunder

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在程序中加入一进度条,现在我的程序是与硬件通信的,向芯片写东西的那种,所以响应很慢。
常常是在执行写芯片的同时,进度条窗口根本显示不出来,所以也看不出是不是同步的,
想问一问有没有不用多线程解决的办法,如果单线程不行,多线程也可以
 
用多个进程条进行处理!主、次....
 
如果能把它回进去也行,
Application.ProcessMessages ;
否则把你写硬件的那个做到一个线程里,这样不影响主线程。
 
在循环里面加入以下一行代码
Application.ProcessMessages;
系统会响应,还可以加入ProgressBar1.Refresh;
试一试
行了也别谢了,给我分就是了
 
对,力奇兄说得可能有道理,windthunder你去试试,如果行的话,给力奇分吧!
顺便给我一点点! ^_^
 
能具体解释一下
Application.ProcessMessages
ProgressBar1.Refresh
这样是不是多线程的!!
 
这不是多线程,Application.ProcessMessages是让你的程序响应系统消息。
 
这句该怎么加呀,加在哪呢?
拜托,具体一点!!
 
如果你的程序是单线程且有timer控件,我建议你别用application.processmessage
你可以专门建一个查询进度状态的线程来更新进度显示。
 
我到底该怎么办,谁能给我一个相对详细清楚的回答!!
 
贴出你使程序无法响应系统消息的那段代码!
 
无新颖见解 不过很支持采用application.processmessage 试一下 本人
导入导出数据时 在窗体上加了一个label 当导入导出数据时 使label.caption
为正在导入导出数据 开始显示不出 有application.processmessage能够显示了
呵呵
 
还有好的见意吗?也给我发一条,谢谢了!!![:)]
 
用Application.ProcessMessage是取巧的办法,如果这个时候用户按了主窗口的关闭按钮怎么办?这也不是多线程的程序。
最好还是把耗时的代码放到一个线程中去做,这样符合规范
 
NoSound的看法很有道理
 
给你一个完整的例子, 包括了线程处理的一般方法(自定义消息,通过消息传递数据):
当然,你也定义通过使用引用或指针来共享数据对象,引用是Delphi里的好东东:)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
const
// 自定义一个线程结束消息
WM_MYTHREAD_DONE = WM_USER + 1024;
type
TMyThread = Class(TThread)
private
// 窗口句柄
FOwnerHandle: HWND;
// 传入的进度条控件
FBar: TProgressBar;
// 进度
FPos: Integer;
// 初始化进度条
procedure InitStatus;
// 更新进度条
procedure UpdateStatus;
// 线程结束后向窗口发送消息
procedure FinalAct(Sender: TObject);
protected
procedure Execute;
override;
public
constructor Create(const OwnerHandle: HWND;
pBar: TProgressBar);
end;

TForm1 = class(TForm)
ProgressBar1: TProgressBar;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
TestThread: TMyThread;
// 接受线程终止发出的消息
procedure ThreadDone(var Msg: TMessage);
message WM_MYTHREAD_DONE;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyThread }
constructor TMyThread.Create(const OwnerHandle: HWND;
pBar: TProgressBar);
begin
FOwnerHandle := OwnerHandle;
FBar := pBar;
OnTerminate := FinalAct;
FreeOnTerminate := True;
inherited Create(False);
end;

procedure TMyThread.Execute;
begin
Synchronize(InitStatus);
// 初始化进度条
while (not Terminated) and (FPos < 100)do
begin
sleep(500);
// 这里放置你的业务代码....
Inc(FPos);
Synchronize(UpdateStatus);
// 更新进度条
end;
end;

procedure TMyThread.FinalAct(Sender: TObject);
begin
PostMessage(FOwnerHandle, WM_MYTHREAD_DONE, FPos, 0);
end;

procedure TMyThread.InitStatus;
begin
FBar.Max := 100;
FBar.Position := 0;
end;

procedure TMyThread.UpdateStatus;
begin
FBar.Position := FPos;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TestThread := TMyThread.Create(Handle, ProgressBar1);
(Sender as TButton).Enabled := False;
Button2.Enabled := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(TestThread) then
TestThread.Terminate;
(Sender as TButton).Enabled := False;
end;

procedure TForm1.ThreadDone(var Msg: TMessage);
begin
Button1.Enabled := True;
ShowMessage(Format('线程终止,已经执行了%d次操作.', [Msg.WParam]));
end;

end.
 
不能调用ProcessMessage,因为ProcessMessage是通过PeekMessage来实现的。我曾经用过vclZip控件,在压缩时调用了ProcessMessage 结时出现很多与消息有关的错误。
 
创建一个多线程,用这个次线程去控制这个ProgressBar,当执行主程序的查询时,调动这个
次线程,当主线程查询结束时,终止次线程。Just so so
 
顶部