我要在循环语句中等待事件的发生用了application.processmessages,有人说用多线程,不知道哪个更好,如果是多线程又应该怎么做?具体来

时间:2022-11-21 23:43:53
我要在循环语句中等待事件的发生用了application.processmessages,有人说用多线程,不知道哪个更好,如果是多线程又应该怎么做?具体来点代码。

10 个解决方案

#1


用线程比较麻烦,你要考虑访问资源时,是否存在并发问题。还要考虑程序退出,线程正在执行该怎么办?
所以,如果原有代码就能完成,最好不用线程。

#2


多线程 是什么意思啊?

#3


//这个unit就是现成的定义
unit gothread;

interface

uses
  Classes,forms,windows;

type
  go = class(TThread)
  private
    fm:tform;
    step1:integer;
    { Private declarations }
  protected
    procedure Execute; override;
    procedure walk;
  public
    constructor create(form:tform;s1:integer);
  end;

implementation
{ Important: Methods and properties of objects in VCL can only be used in a
  method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure go.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ go }

constructor go.create(form:tform;s1:integer);
begin
    inherited create(false);
    fm:=form;
    step1:=s1;
    Priority:=tpIdle;
    freeonterminate:=true;
end;

procedure go.walk;
var i,j:integer;
begin
with fm do begin
  left:=0-width;
  visible:=true;
  j:=(screen.Width-width) div 2;
  i:=1;
  repeat
    left:=left+i;
    i:=i+step1;
    inc(step1);
    sleep(2*step1);
  until left+i>j;
end;
end;

procedure go.Execute;
begin
  { Place thread code here }
  synchronize(walk);
end;

end.

//在另一个form中USES GOTHREAD

procedure TForm3.FormCreate(Sender: TObject);
const logobmpfile='start.bmp';
VAR RUSH:GO;
begin
if FileExists(logobmpfile) then
begin
  image1.picture.loadfromfile(logobmpfile);
  width:=image1.Picture.Width;
  height:=image1.Picture.Height;
  left:=0-width;
  SetWindowRgn(handle,CreateEllipticRgn(width-clientwidth,height-clientheight,clientwidth,clientheight),true);
  rush:=go.create(self,1);
end
else
begin
    release;
    Application.CreateForm(TForm1, Form1);
end;

//form 的create事件中只有 rush:=go.create(self,1);这一句创建了线成并执
行,这个线成是用来控制一个form出现时从做到右加速跑到屏幕中心就停止

#4


我觉得使用多线程要好,但最好不要使用delphi自带的线程对象

#5


delphi自带的和用api createthread其实一样啊,delphi自带也是调用的api,用起来还是很方便的。

#6


主要看你的程序的作用是什么了.
如果你要是一个等待循环,必须得到返回值,那么就用application.processmessages,它是去处理了系统的其他消息.等于把对CPU的控制权交出去.
而如果你循环等待的东西与你循环完毕之后执行的内容毫无关系,就用多线程,你可以创建一个线程类,就如同 liuhelin(鹤林)说的那样,如果创建一个临时线程,可以直接用Delphi自己的函数,这样比较简单.

#7


我人为还是用application.processmessages比较好,简单。我在做数据导入的时候当时我用到的就是这个,当时我也准备用多线程,后来别人要我用这个方法,很简单的。

#8


以上各位谢谢了,下午给分

#9


只一个普通的大循环一PROCESS,如果要做别的事就最好是多线程

#10


用多线程查MSDN中SDK中的CreateThread() FUNCTION,如果是写类的话就查别的它里面说的够详细了.如果这还不够你就别用多线程了

#1


用线程比较麻烦,你要考虑访问资源时,是否存在并发问题。还要考虑程序退出,线程正在执行该怎么办?
所以,如果原有代码就能完成,最好不用线程。

#2


多线程 是什么意思啊?

#3


//这个unit就是现成的定义
unit gothread;

interface

uses
  Classes,forms,windows;

type
  go = class(TThread)
  private
    fm:tform;
    step1:integer;
    { Private declarations }
  protected
    procedure Execute; override;
    procedure walk;
  public
    constructor create(form:tform;s1:integer);
  end;

implementation
{ Important: Methods and properties of objects in VCL can only be used in a
  method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure go.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ go }

constructor go.create(form:tform;s1:integer);
begin
    inherited create(false);
    fm:=form;
    step1:=s1;
    Priority:=tpIdle;
    freeonterminate:=true;
end;

procedure go.walk;
var i,j:integer;
begin
with fm do begin
  left:=0-width;
  visible:=true;
  j:=(screen.Width-width) div 2;
  i:=1;
  repeat
    left:=left+i;
    i:=i+step1;
    inc(step1);
    sleep(2*step1);
  until left+i>j;
end;
end;

procedure go.Execute;
begin
  { Place thread code here }
  synchronize(walk);
end;

end.

//在另一个form中USES GOTHREAD

procedure TForm3.FormCreate(Sender: TObject);
const logobmpfile='start.bmp';
VAR RUSH:GO;
begin
if FileExists(logobmpfile) then
begin
  image1.picture.loadfromfile(logobmpfile);
  width:=image1.Picture.Width;
  height:=image1.Picture.Height;
  left:=0-width;
  SetWindowRgn(handle,CreateEllipticRgn(width-clientwidth,height-clientheight,clientwidth,clientheight),true);
  rush:=go.create(self,1);
end
else
begin
    release;
    Application.CreateForm(TForm1, Form1);
end;

//form 的create事件中只有 rush:=go.create(self,1);这一句创建了线成并执
行,这个线成是用来控制一个form出现时从做到右加速跑到屏幕中心就停止

#4


我觉得使用多线程要好,但最好不要使用delphi自带的线程对象

#5


delphi自带的和用api createthread其实一样啊,delphi自带也是调用的api,用起来还是很方便的。

#6


主要看你的程序的作用是什么了.
如果你要是一个等待循环,必须得到返回值,那么就用application.processmessages,它是去处理了系统的其他消息.等于把对CPU的控制权交出去.
而如果你循环等待的东西与你循环完毕之后执行的内容毫无关系,就用多线程,你可以创建一个线程类,就如同 liuhelin(鹤林)说的那样,如果创建一个临时线程,可以直接用Delphi自己的函数,这样比较简单.

#7


我人为还是用application.processmessages比较好,简单。我在做数据导入的时候当时我用到的就是这个,当时我也准备用多线程,后来别人要我用这个方法,很简单的。

#8


以上各位谢谢了,下午给分

#9


只一个普通的大循环一PROCESS,如果要做别的事就最好是多线程

#10


用多线程查MSDN中SDK中的CreateThread() FUNCTION,如果是写类的话就查别的它里面说的够详细了.如果这还不够你就别用多线程了