求助:Timer控件使用中碰到的问题 ( 积分: 40 )

  • 主题发起人 主题发起人 孤云
  • 开始时间 开始时间

孤云

Unregistered / Unconfirmed
GUEST, unregistred user!
在程序中
procedre TForm1.Timer1Timer(Sender: TObject);
begin
IF 条件1 THEN
BEGIN
Timer1.Enabled:=False;
DoingScan1; //这个过程的执行时间大于Timer1的时间间隔
Timer1.Enabled:=True;
END;

IF 条件2 THEN
BEGIN
Timer1.Enabled:=False;
DoingScan2; //这个过程的执行时间大于Timer1的时间间隔
Timer1.Enabled:=True;
END;

IF 条件3 THEN
BEGIN
Timer1.Enabled:=False;
DoingScan3; //这个过程的执行时间大于Timer1的时间间隔
Timer1.Enabled:=True;
END;
//这三个条件不会同时满足
end;

其中DoingScan1,DoingScan2,DoingScan3是一个不断进行扫描的过程
procedure DoingScan1;
begin
sleep(v1); //要等待一段时间后开始进行扫描,其中V1是变量,根据计算得到
//基准时刻T1,扫描时间长度MaxScanT都是变量
WHILE SecondsBetween(T1,Now)<=MaxScanT DO //这个地方用SecondsBetween是不是
BEGIN //可行
FOR i:=1 TO n DO
BEGIN
.....//判断
.....//计算
.....//数据库读写操作
.....//等等
END;
END;
end;
问题在于执行这段程序的时候,主界面像死了一样!请问有什么问题或者有什么好的解决方法
 
你在你的执行函数内加上Application.ProcessMessages
procedure DoingScan1;
begin
sleep(v1); //要等待一段时间后开始进行扫描,其中V1是变量,根据计算得到
//基准时刻T1,扫描时间长度MaxScanT都是变量
WHILE SecondsBetween(T1,Now)<=MaxScanT DO //这个地方用SecondsBetween是不是
BEGIN //可行
FOR i:=1 TO n DO
BEGIN
.....//判断
.....//计算
.....//数据库读写操作
.....//等等
Application.ProcessMessages //加上这句
END;
END;
end;

我写的小例子
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
procedure xxx;
public
iTemp: integer;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if iTemp= 0 then
begin
Timer1.Enabled:= false;
xxx;
iTemp:= 1;
Timer1.Enabled:= true;
end;
end;

procedure TForm1.xxx;
var
i: integer;
begin
for i:= 0 to 100000 do
begin
Edit1.Text:= inttostr(i);
Application.ProcessMessages;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:= true;
end;
end.
或者你不要在主线程中执行扫描函数,把扫描函数放到一个线程去处理,写的小例子如下:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
private

public
iTemp: integer;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
procedure xxx(Sender: TObject);
var
i: integer;
begin
if form1.Timer1.Enabled then
begin
for i:= 0 to 100000 do
form1.Edit1.Text:= IntToStr(i);
form1.Timer1.Enabled:= false;
end;
end;
var
iThreadID: Cardinal;
begin
Timer1.Enabled:= true;
CreateThread(nil,0,@xxx,nil,0,iThreadID);
end;

end.
两个小例子在我的机子上都试过,没问题,你参考下。。。
 
接受答案了.
 
后退
顶部