在应用程序窗口中加个定时器,那么定时器和应用程序是同一线程吗?  如果是同一线程,当主应用程序打开模式对话框时,定时器仍能收到  消息并执行;  如果是两个线程,那我在定时器中做个死循环,主程序也死了。请高手支招。
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Self.Timer1.Enabled := false;
  while (1=1) do
  begin
   sleep(500);
  end;end;

解决方案 »

  1.   

    To sleep是让整个进程睡眠
    ?    你是说单线程应用中,现在我是按多线程中写To 楼主要搞明白进程和线程是不一样的!!!
    K,这我还不明白,看清我的题意。高手来呀
      

  2.   

    是多线程的
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Self.Timer1.Enabled := false;
      while (1=1) do
      begin
        application.ProcessMessages;
        sleep(50);
      end;
    end;
    看看还死不死
      

  3.   

    单线程的
    showmodal看上去死不了是因为showmodal中另外建立了一个消息处理循环. 此时application中主消息处理循环已经block了
      

  4.   

    是单线程的,定时器(TTimer)是靠消息触发的."如果是同一线程,当主应用程序打开模式对话框时,定时器仍能收到  消息并执行;"这没什么不对,也不能说明是多线程,因为主应用程序打开模式对话框时,Application的消息循环依然在正常运行中,还可收到定时消息的。
      

  5.   

    如果按楼上的说法
    1、那定时器的定时处理函数是不可能与主程序同时执行了(可是我的定时处理函数中和主程序中都用到了同一个adoquery组件,  有时会出现adoquery已经关闭的提示,我认为是定时器处理函数打开刚要用,主程序又将其关掉的问题)
    2、如果定时器消息来到时,主程序在执行其它费时的操作,只有在此费时操作完成后,定时器的消息处理函数才能处理此消息,  那么定时器接收的消息有可能不是按规定的时间(有可能晚来)
      

  6.   

    你去Extctrls单元里看看TTimer是怎么写的不就知道了。
      

  7.   

    to 楼主:1. 不错,定时器的定时处理函数不可能与主程序同时执行,并且定时消息优先级还比较低,程序忙的时候,经常会丢掉定时消息的。你的adoquery的问题可能是由于其他原因造成的。2. 是的,同上。3. 如果定时器定时为1秒,结果定时器的消息处理函数执行时间为1秒多,下一个消息(不仅是定时器消息,所有的消息都等着。不信你故意Sleep(10000)看看,界面都没响应了。一般TTimer对于简单的定时可以用用,要比较高的精度,可以用多媒体定时器(是在内部的单独线程中运行的,要注意线程同步),不过,无论怎样定时,在事件内进行比较长的处理都是不可取的,如果一定要这样,可以考虑这样写,更健壮一些:
    Timer1Timer(...)
    {
      Timer1->Enabled=false;
      //...处理...处理...处理
      Timer1->Enabled=true;
    }