如何在线程里动态创建TTimer 这个ontimer该怎么调用啊 ??  紧急~~~谢谢各位大侠

解决方案 »

  1.   

    需要自己写一个OnTimer函数,名为timetimer。timer:=TTimer.create(application);
    timer.name:='timer1';
    timer.interval:=1000;
    timer.ontime:=self.timetimer;
      

  2.   

    谢谢  Timer:TTimer;在哪定义啊,在type里定义的话 线程看不到。
    在别的里面定义有用不了;
      

  3.   

    ..
    type
      MyThread = Class(Thread)
      priavate
        FTimer : TTimer;
      public 
        Procedure Execute; 
      end;這樣的。一般我建議你自己建立一個消息循環來維護TIMER的消息隊列。
      

  4.   

    值得注意的是
    1.
    如果使用VCL封装的线程类的话,创建TTimer时一定要在其Execute中创建,不能在线程Create中创建!
    从API的角度来说,Timer应该创建至ThreadFunc中,否则WM_TIMER消息将会被投掷到主线程的消息队列中
    2.
    在线程中维护一个消息队列,用来接收WM_TIMER消息以及退出TIMER计时器
      

  5.   

    还是不行啊   都看不到TTimer这个类啊  怎么办
      

  6.   


    uses
      ExtCtrls
      

  7.   

    我现在在Execute中都创建不出来Timer 别的就先不说了  
      

  8.   

    type
    Tmythread = class(Tthread)
     priavate
    timer: TTimer;//写在这  在线程里能看到TTimer 但是编译的时候 提示错误
    protected
    procedure Execute;override;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     tmythread.Create(false);
    end;{ Tmythread }procedure Tmythread.Execute;
    var i:integer;
    begin
      inherited;
    freeonterminate:=true;
    timer:=TTimer.Create(/这里该写什么/);
      

  9.   


    不是同你說了嗎,TIMER如果放在線程裏,消息的隊列應該由自己來維護,不要交給主線程,那不亂套,還有什麼線程可言。
      

  10.   

    晕  打错字了  private  
      

  11.   


    type
      readcomm=Class(TThread)
      private
        com:string;//对应的串口号
        hd:THandle;//对应的串口句柄
        msg:AnsiString;//接收到的所有未处理的报文
        bw:string;//一条完整的报文
        id:Integer;//序号
        header,code,Len_bw,mss:string;
        time:TTimer;
      protected
        procedure execute;override;
        procedure showbw;
      public
        function resolveheader:Boolean;
        function resolvecode:Boolean;
        function resolvemsg:Boolean;
    end;
    procedure readcomm.execute;
    var
      s:string;
      inbuff:array[1..2048] of Char;
      nBytesRead,dwError,lrc: LongWORD;
      cs:TCOMSTAT;
      i:Integer;
    begin
      time:=TTimer.Create(Application);
      time.Name:='timer1';
      ................
    end;
      

  12.   

    starluck 谢谢你  能给出点代码看看嘛  不懂你说的
      

  13.   

    大家看看这个代码  为什么就是没效果呢? 谢谢了unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure timeron(Sender:Tobject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
    implementation{$R *.dfm}
    type
    Tmythread = class(Tthread)
     private
    timer: TTimer;
    protected
    procedure Execute;override;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     tmythread.Create(false);
    end;{ Tmythread }procedure Tmythread.Execute;
    var i:integer;
    begin
      inherited;
    freeonterminate:=true;
    timer:=TTimer.Create(Application);
    timer.Enabled:=true;
    timer.OnTimer:=form1.timeron;
    for i:=0 to 500000 do
    begin
    with form1.Canvas do
    form1.Canvas.Lock;
    form1.Canvas.TextOut(10,10,inttostr(i));
    form1.Canvas.Unlock;
    end;
    end;procedure TForm1.timeron(Sender: Tobject);
    begin
    showmessage('dfdf');
    end;end.
      

  14.   

    //看来白说了
    1.Thread Classunit Unit2;interfaceuses
      Classes,ExtCtrls,dialogs,Windows;type  TMyTest = class(TThread)
      private
        FTimer:TTimer;
        procedure TimerProc(Sender: TObject);  protected
        procedure Execute; override;
      public
        constructor create;
        destructor Destroy; override;
      end;implementation
    constructor TMyTest.Create;
    begin
      Inherited Create(true);
    end;destructor TMyTest.Destroy;
    begin  inherited;
    end;procedure TMyTest.Execute;
    var
      Msg: TMsg;
    begin
       FTimer:=TTimer.Create(nil);
       try
         FTimer.Enabled:=True;
         FTimer.Interval:=5000 ;
         FTimer.OnTimer:=TimerProc;
         while GetMessage(Msg, 0, 0, 0) do begin
            TranslateMessage(Msg);
            DispatchMessage(Msg)
          end;
          Terminate;
       finally
         FTimer.Free;
       end;
      { Place thread code here }
    end;procedure TMyTest.TimerProc(Sender: TObject);
    begin
       //to do 
       showmessage('ok');
    end;end.2.调用 Myclassprocedure TForm1.btn1Click(Sender: TObject);
    var
      Mytest:TMyTest;
    begin
      Mytest:=TMyTest.create;
      Mytest.Resume;
    end;
      

  15.   

    procedure Tmythread.Execute; 
    var i:integer; 
    begin 
      inherited; 
    freeonterminate:=true; 
    timer:=TTimer.Create(Application); 
    timer.Enabled:=true; 
    timer.OnTimer:=form1.timeron; 
    for i:=0 to 500000 do 
    begin 
    with form1.Canvas do 
    form1.Canvas.Lock; 
    form1.Canvas.TextOut(10,10,inttostr(i)); 
    form1.Canvas.Unlock; 
    end; 
    end; 
    1. 如果你想創建一個主線程來維護的TIMER你就直接在線程的 Create  裏建立這個TIMER;2 .如果你想這個TIMER屬於你剛建立的這個線程的話,就建立在EXCUTE下,在VCL線,線程的Execute  是真正由線程來執行的。
        
       如果你選擇第二個就用 liangPei2008 的方法。
       但我不知道你為什麼一定要線程跟UI掛上關系。
      

  16.   

    是要控制30多个设备  所以必须写30多个线程 然后每个线程里要处理的事 还必须要timer  觉得好难  然后工期还紧 愁死了