在主程序中做一段循环,在这之前建一个子线程对一个数进行累加,
现发现在主程序循环的时候子线程不进行累加
如何处理在主程序循环的时候子线程也进行累加
现发现在主程序循环的时候子线程不进行累加
如何处理在主程序循环的时候子线程也进行累加
解决方案 »
- 最近才发现Boolean原来是ByteBool
- 关于线程动态创建VCL组件的问题
- adoquery动态查询问题
- 谈谈各地薪水
- 请问如何返回当前dbGrid的行号?
- 高手请进!嵌入网页中的Activex如何获取加载它的浏览器对象?谢谢!
- 文件判断
- 大家好,那位大侠有播放Gif文件的控件
- x度空间,麻烦你关注一下http://www.delphibyte.com/download/softview.php?softid=426
- 请问,要如何才能把ListView和数据库联系到一起,即用ListView显示数据库中的内容?
- 主程序与子线程的问题
- 学RAVE一周,不得入门。学FastReport两天,已经能做出想要的报表了。
建议在主线程中循环时sleep一下看子线程能否执行。
也许子线程已经结束或根本没起来。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;type
TSplash = class(TThread)
protected
procedure SetProgress;
procedure Execute; override;
end;
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
aSplash :TSplash;
end;var
Form1: TForm1;implementation{$R *.dfm}{ TSplash }procedure TSplash.Execute;
var
iBegin:Integer;
begin
inherited;
FreeOnTerminate:=true;
while true do
begin
iBegin := GetTicKCount;
while GetTickCount-iBegin <500 do
begin
;
end;
Synchronize(SetProgress);
end;
end;procedure TSplash.SetProgress;
begin
Form1.ProgressBar1.StepBy(8);
if Form1.ProgressBar1.Position > 95 then
Form1.ProgressBar1.Position := 20;
end;procedure TForm1.Button1Click(Sender: TObject);
var
iBegin :Integer;
begin
iBegin := GetTicKCount;
while (GetTickCount-iBegin<4000) do
begin
;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
aSplash := TSplash.Create(false);
end;end.
------------------------------
程序运行后按Button2,这时ProgressBar1是会响应一直动的,但按了
Button1后,ProgressBar1就不动了,直到Button1完成后ProgressBar1才
继续响应;现希望不改动Button1的代码,在Button1里的代码运行时
ProgressBar1也在响应
那么麻烦;然后,
procedure TForm1.Button1Click(Sender: TObject);
var
iBegin :Integer;
begin
iBegin := GetTicKCount;
while (GetTickCount-iBegin<4000) do
begin
;
end;
end;你省略的不知道是什么,最后叫上 Application.ProcessMessage;
var
iBegin :Integer;
begin
iBegin := GetTicKCount;
aSplash.WaitFor;
end;
Synchronize就是同步,把程序交给主线程执行
要是不用Application.ProcessMessage的话,用Sleep也可以,就是利用中断了