谁有空啊,近来。 (100分)

  • 主题发起人 主题发起人 zhaohai9
  • 开始时间 开始时间
Z

zhaohai9

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么button1一按,label1就停了?
unit Unit1;

interface

uses
; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
; Dialogs, StdCtrls;

type
; TForm1 = class(TForm)
; ; Label1: TLabel;
; ; Label2: TLabel;
; ; Button1: TButton;
; ; procedure Button1Click(Sender: TObject);
; ; procedure FormCreate(Sender: TObject);
; private
; ; { Private declarations }
; public
; ; { Public declarations }
; end;
; type
; TMyThread = class(TThread)
; private
; ; { Private declarations }
; protected
; ; procedure Execute; override;
; end;


var
; Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i:longint;
e:string;
begin
for i:=0 to 100000000 do
e:=floattostr(i*pi);
label2.Caption:=e;
end;

{ TMyThread }

procedure TMyThread.Execute;
begin
; inherited;
repeat form1.label1.Caption:=timetostr(time) until//sorry,刚才打错了。
terminated;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
TMyThread.Create(false);
end;

end.


怎么button1一按,label1就停了?
 
什么叫“label1就停了”,是不是不显示变化?那是因为CPU忙于你的循环,没有时间显示
label1的Caption,你试着在循环中加入Application.ProcessMessage应该就可以了吧。
另外,用线程也可以。
 
在线程中访问VCL部件,应该使用Syno....进行和主线程的同步。
在按下Button1之前,主线程没有任务,因此即使没有进行同步仍然可以写Form1.Caption,
在按下它之后,主线程有工作了,就顾不上你的线程了,具体请参看Delphi的Help
 
for i:=0 to 100000000 do
begin
; e:=floattostr(i*pi);
; application.ProcessMessages;
end;
label2.Caption:=e;
 
又看了一下,你的代码里没有要Label1显示的内容啊?

to creation-zy:在线程中只有多个线程同时访问一个VCL对象时才需要Synchronize,否则
不需要。
 
我知道Application.ProcessMessage方法,我只是想学习一下多线程。
 
麻烦再讲一下,用线程如何实现?
 
for i:=0 to 100000000 do
begin
; e:=floattostr(i*pi);
; label2.Caption:=e;
; update;
end;
 
for i:=0 to 100000000 do
begin
; e:=floattostr(i*pi);
; label2.Caption:=e;
end;
 
像你这样只多建一个线程就不需要用TThread类了,直接用BeginThread还简单一点!!
 
zhaohai9:刚才吃饭去了,所以没回答你的问题,上面的老兄们都已经回答完了。
 
大家知道,这段程序没任何意义,我只是想学习多线程,我是想若不用Application.ProcessMessage
上面这段demo能否实现多线程控制?
 
给你一个线程的测试例子你就明白了
在Form上有2组一样的控件,每组都有一个Edit和两个Button
一个Button开始一个线程,另一个结束这个线程

同时在另一组中也同时可以进行这样的操作
调用一个线程类

unit Unit1;

interface

uses
; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
; StdCtrls;

type
; TTest = class(TThread)
; public
; ; edt: TEdit;
; ; procedure Execute;override;
; end;

; TForm1 = class(TForm)
; ; Button1: TButton;
; ; Edit1: TEdit;
; ; Button2: TButton;
; ; Edit2: TEdit;
; ; Button3: TButton;
; ; Button4: TButton;
; ; procedure Button1Click(Sender: TObject);
; ; procedure Button2Click(Sender: TObject);
; ; procedure Button3Click(Sender: TObject);
; ; procedure Button4Click(Sender: TObject);
; private
; ; { Private declarations }
; ; t1,t2: TTest;

; public
; ; { Public declarations }
; end;

var
; Form1: TForm1;

implementation

{$R *.DFM}


{ TTest }

procedure TTest.Execute;
var
; I: Integer;
begin
; for I := 0 to 1000000 do
; begin
; ; edt.Text := IntToStr(I);
; end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
; t1 := TTest.Create(true);
; //降低优先级,否则两个线程一起快速运行时容易死锁
; t1.Priority := tpLower;
; t1.edt := Edit1;
; t1.Resume;//开始
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
; t1.Suspend;//停止
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
; t2 := TTest.Create(true);
; t2.Priority := tpLower;
; t2.edt := Edit2;
; t2.Resume;//开始
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
; t2.Suspend;//停止
end;

end.
 
大家都说完了/
 
在子线程直接修改主线程vcl的东西,主线程空闲的时候还好办,忙的时候,出错的机会很大
 
多人接受答案了。
 
后退
顶部