procedure TSysChatMainForm.TTestNetTimer(Sender: TObject);
begin
  if InternetGetConnectedState(nil, 0) = false then
  begin
    Data.UserOff('[脱机]',false);
    bsTrayIcon.ShowBalloonHint('网络异常','由于网络异常,程序掉线!',bsbitInfo);
  end;
end;
对多线程不了解,想请教下:如何把上面用Timer控件做的定时检测改成多线程形式?每3秒执行一次程序关闭应如何释放此线程等?

解决方案 »

  1.   

    方法很多,用getticketcount,sleep或者CreateWaitableTimer
    很久以前研究过,差不多都忘了,百度吧
    不过这些都不是精确方法,只是一个概念时间
      

  2.   

    简单的做法是
    执行线程程序前,将timer的Enable=false
    线程程序执行完后,timer的Enable=true至于释放的问题,和你用timer前一样。
    但存在一个问题,如楼上所说,不是太精确,但基本上还可以。比如设10秒,一般不会变成20秒,呵呵。
      

  3.   

    你这个用timer足以了,如果用线程,TThread,以及api的创建线程等都可以,具体自己搜去吧
      

  4.   


    //先写一个函数 用来检测
    function myThread(p:pointer):boolean;stdcall;
    begin
      while ( 终止条件) do
      begin
        sleep(3000);
        {检测代码}
      end;
    end; 
     {然后创建这个线程}
    CreateThread(nil,0,@myThread,nil,0,id);在窗体destroy 里面 把终止条件写上,等待线程结束 退出程序
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TSysChatMainForm = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        FTestNetThread: TThread;
      public
        { Public declarations }
      end;var
      SysChatMainForm: TSysChatMainForm;implementation{$R *.dfm}type
      TTestNetThread = class(TTHread)
        procedure Execute; override;
        procedure RefreshUIInMainThread;
      end;{ TTestNetThread }procedure TTestNetThread.RefreshUIInMainThread;
    begin
      bsTrayIcon.ShowBalloonHint('网络异常','由于网络异常,程序掉线!',bsbitInfo);
    end;procedure TTestNetThread.Execute;
    begin
      inherited;
      FreeOnTerminate := True;  while (not Terminated) and (not InternetGetConnectedState(nil, 0)) then
      begin
        Data.UserOff('[脱机]',false);
        Synchronize(RefreshUIInMainThread);    Sleep(3000)
      end;
    end;{ TSysChatMainForm }procedure TSysChatMainForm.FormCreate(Sender: TObject);
    begin
      FTestNetThread := TTestNetThread.Create(False);
    end;procedure TSysChatMainForm.FormDestroy(Sender: TObject);
    begin
      FTestNetThread.Terminate;
    end;end.
      

  6.   

    在最后FTestNetThread.Terminate;之后最好还加上FTestNetThread.WaitFor