有个工控的仿真软件有30多个单元,每个单元有20~300页不等,每页有几十至几百个运算模块,每页可设定一个循环运行时间(100~500毫秒),我现在想仿做这个软件,但不知每页这个循环时间是怎么设定的,如果每页设一个时钟,那不是有几千个时钟?还要是多线程的。那位帮我想想用什么方法实现?以下是我暂时想到的测试代码,但运行起来很慢,显示都会卡
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyThread = class(TThread)
private
iMaxNum:Integer;
FTimer:TTimer;
protected
procedure Execute; override;
procedure TimerProc(Sender: TObject);
end;var
Form1: TForm1;
editm:array[0..40] of tedit;i,iX,iy:Integer;
MyThread:array[0..40] of TMyThread;
implementation{$R *.dfm}procedure TMyThread.Execute;
var
i: Integer;Msg: TMsg;
begin
FreeOnTerminate := True; {这可以让线程执行完毕后随即释放}
FTimer:=TTimer.Create(nil);
try
FTimer.Enabled:=True;
FTimer.Interval:=1000 ;
FTimer.OnTimer:=TimerProc;
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg)
end;
Terminate;
finally
FTimer.Free;
end;
end;
procedure TMyThread.TimerProc(Sender: TObject);
var i:Integer;
begin
for i := 0 to 1000 do
begin
editm[iMaxNum].Text :=IntToStr(i); end;end;
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
for i:=0 to 40 do
begin
MyThread[i].Resume;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ix:=0;iy:=0;
for i:=0 to 40 do
begin
if iX>10 then
ix:=0;
editm[i]:=tedit.Create(self);
editm[i].Parent:=form1;
editm[i].Width:=120;
editm[i].Height:=20;
editm[i].Left:=ix*120;
editm[i].Top:=trunc(iy/5)*25;
editm[i].Name:= 'edit'+inttostr(i);
editm[i].Text:= 'edit'+inttostr(i);
editm[i].Visible:=true;
Inc(iX);
Inc(iy);
MyThread[i] := TMyThread.Create(True);
MyThread[i].iMaxNum:=i;
end;
end;
//挂起线程
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
begin
for i:=0 to 40 do
begin
MyThread[i].Suspend;
end;
end;
//结束线程
procedure TForm1.Button3Click(Sender: TObject);
var i:Integer;
begin
for i:=0 to 40 do
begin
MyThread[i].Terminate;
end;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Button2.Click;
Button3.Click;
end;end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyThread = class(TThread)
private
iMaxNum:Integer;
FTimer:TTimer;
protected
procedure Execute; override;
procedure TimerProc(Sender: TObject);
end;var
Form1: TForm1;
editm:array[0..40] of tedit;i,iX,iy:Integer;
MyThread:array[0..40] of TMyThread;
implementation{$R *.dfm}procedure TMyThread.Execute;
var
i: Integer;Msg: TMsg;
begin
FreeOnTerminate := True; {这可以让线程执行完毕后随即释放}
FTimer:=TTimer.Create(nil);
try
FTimer.Enabled:=True;
FTimer.Interval:=1000 ;
FTimer.OnTimer:=TimerProc;
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg)
end;
Terminate;
finally
FTimer.Free;
end;
end;
procedure TMyThread.TimerProc(Sender: TObject);
var i:Integer;
begin
for i := 0 to 1000 do
begin
editm[iMaxNum].Text :=IntToStr(i); end;end;
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
for i:=0 to 40 do
begin
MyThread[i].Resume;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ix:=0;iy:=0;
for i:=0 to 40 do
begin
if iX>10 then
ix:=0;
editm[i]:=tedit.Create(self);
editm[i].Parent:=form1;
editm[i].Width:=120;
editm[i].Height:=20;
editm[i].Left:=ix*120;
editm[i].Top:=trunc(iy/5)*25;
editm[i].Name:= 'edit'+inttostr(i);
editm[i].Text:= 'edit'+inttostr(i);
editm[i].Visible:=true;
Inc(iX);
Inc(iy);
MyThread[i] := TMyThread.Create(True);
MyThread[i].iMaxNum:=i;
end;
end;
//挂起线程
procedure TForm1.Button2Click(Sender: TObject);
var i:Integer;
begin
for i:=0 to 40 do
begin
MyThread[i].Suspend;
end;
end;
//结束线程
procedure TForm1.Button3Click(Sender: TObject);
var i:Integer;
begin
for i:=0 to 40 do
begin
MyThread[i].Terminate;
end;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Button2.Click;
Button3.Click;
end;end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货