消息关闭
    暂无新消息!
有个工控的仿真软件有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.

7个回答

︿ 3
Timer控件使用的是消息处理的,你在线程中运行时钟是没意义的!全部用线程,然后用线程来模拟时钟就好,处理数据的放到后台,处理完了之后发送一个事件信号,然后前台刷新UI就好,合理运用Event来处理就可
︿ 3
TTimer控件,本身就是一个时间步进的独立线程。线程中不宜多使用TTimer控件,否则很慢的。如果在线程中记时的话,通过读取系统时间处理比较好。
︿ 2
先把循环消息那段去掉,成死循环了。刷新界面要在主线程中,所以操作edit写在一个过程中,用Synchronize方法调用。程序创建了41个线程,线程里创建计时器,线程完成时计时器立即释放,线程也销毁。计时器也不能持续发挥作用,没有必要这么用。整个程序最多的是刷新界面,这在主线程完成。也没有大量计算,看不出用多线程的必要性。
︿ 1
最近研究了爱因斯坦相对论,速度越快,时间会膨胀,时间也会变慢。
多线程比单进程速度更快,所以这个是正常的