大家有没有做过用线程来代替一些TIMER的操作呀,若有请说明一下,或者EMAIL给我.
我的EMAIL:  [email protected]

解决方案 »

  1.   

    线程替代Timer???有时用多线程还是可能用Timer啊!!
      

  2.   

    线程代替Timer???有时多线程照样得用timer!!!!
      

  3.   

    就象下面这样,TIMER1的间隔为最好越小越好,但是如果过小,通过手机号码来查询其姓名的话,有可能在这么短的时间里无法完成,要是用线程应如何解决.大家可以给个例子出来吗?拜托了
    procedure TMainForm.Timer1Timer(Sender: TObject);
    var
      RecMsg:pchar;
    begin
       GetMem(RecMsg,256);
       if GetMsg(ComX, RecMsg) then 
       begin
          Memo1.Lines.Append('收到:'+Trim(String(RecMsg)));
          ADOQuery9.Close;   
          ADOQuery9.SQL.Clear;
          ADOQuery9.SQL.Add('select 联系人,手机 from 通讯录');
          ADOQuery9.SQL.Add('where Trim(手机)='+#39+copy(RecMsg,1,11)+#39);
          ADOQuery9.Open;
          if ADOQuery9.RecNo>0 then
              Memo1.Lines.Append('姓名为:'+ADOQuery9.FieldByName('联系人').AsString);
          else
              Memo1.Lines.Append('姓名为: NIL ');
       end;
    end;
      

  4.   

    你的意思是查询没完,timer又被触发了
      

  5.   

    Timer1Timer()没有执行完之前不会再次出WM_TIMER消息,这是肯定的。只是不明白楼主为什么将数据查询放在定时器里面。
       另外定时器的时间分辨率大约是55ms,将其定时间隔设的过小没有意义。
      

  6.   

    楼上似乎说得不对,
    我开始也是你那么认为的,可我做了试验发现我错了。
    我的timer的时间间隔设为10s,在ontime里写了如下语句:
    sleep(30000);
    showmessage("adadfasdfasdfasd");
    结果sleep执行完后,showmessage就没弹出,有跳到ontime里了
    不知道我这种测试方法对不对楼主,线程使用的方法还是找书看看吧,我水平低,我是说不清楚的。
      

  7.   

    新建一个线程类mythread,将数据库查询的程序放在mythread的onexecute()内,
    在timer1timer()中,创建一个mythread的实例就可以了,剩下的事情交给mythread去做。
      

  8.   

    TO redwoodnymph(new)在Timer1Timer()中加上如下代码再测试!
    begin
       memo1.Lines.Add('dasfsdafsdf');
       sleep(10000);
       application.ProcessMessages;
    end;
      

  9.   

    你在delphi中选new other其中有一个Thread object,然后在Execute中写个过程,具体如下
    unit Unit1;interfaceuses
      Classes, Windows, Messages;type
      TMyThread = class(TThread)
      private
        { Private declarations }
        procedure MessageMyBox;
      protected
        procedure Execute; override;
      end;implementation
    { TMyThread }procedure TMyThread.Execute;
    begin
      { Place thread code here }
      Synchronize(MessageMyBox);
    end;procedure TMyThread.MessageMyBox;
    var
      RecMsg:pchar;
    begin
       GetMem(RecMsg,256);
       if GetMsg(ComX, RecMsg) then 
       begin
          Memo1.Lines.Append('收到:'+Trim(String(RecMsg)));
          ADOQuery9.Close;   
          ADOQuery9.SQL.Clear;
          ADOQuery9.SQL.Add('select 联系人,手机 from 通讯录');
          ADOQuery9.SQL.Add('where Trim(手机)='+#39+copy(RecMsg,1,11)+#39);
          ADOQuery9.Open;
          if ADOQuery9.RecNo>0 then
              Memo1.Lines.Append('姓名为:'+ADOQuery9.FieldByName('联系人').AsString);
          else
              Memo1.Lines.Append('姓名为: NIL ');
       end;
    end;
    end.
      

  10.   

    TO  lynew(死循环-开始) ( ) 信誉:99 请说出具体的解决办法好吗?有例子的话就更好。
    我的EMAIL: [email protected]
      

  11.   

    TO  lynew(死循环-开始) ( ) 信誉:99 请说出具体的解决办法好吗?有例子的话就更好。
    我的EMAIL: [email protected]
      

  12.   

    进入 OnTimer 事件后,如果不退出,不会再进入 OnTimer 程序,除非在其中有 Application.ProcessMessages 之类的消息检测语句,且该语句正好检测到新的 Timer 消息。Sleep(30000) 后,如果不是 ShowMessage,而是其它语句,则你会发现不会再进入 OnTimer 事件。因为 ShowMessage 中是有消息检测的,30秒后,10秒的定时器消息早排在消息队列中了,所以 ShowMessage 时,会再次进入 OnTimer 事件。
      

  13.   

    可以看看DELPHI深度研究这本书
      

  14.   

    谢谢: hiflower(花) 
    谢谢: Fangyuanshan(远山) 
    谢谢: 楼主!