我做了个主界面,上面放了计时器,当计时器到整点时触发一个线程
让他给我检索数据库中数据。
结果是当线程在检索数据库时,计时器也停了,直到线程检索完毕。
请教高手

解决方案 »

  1.   

    Timer1.Enabled:=False;
    {
    开始你的线程操作
    }
    Timer1.Enabled:=True;
      

  2.   

    //界面程序
    unit uMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, uTDataManagerThread;type
      TForm1 = class(TForm)
        CurTimer: TTimer;
        edtCurTime: TEdit;
        RunTimer: TTimer;
        edtRunTime: TEdit;
        procedure CurTimerTimer(Sender: TObject);
        procedure RunTimerTimer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CurTimerTimer(Sender: TObject);
    var
     stime : string;
    begin
      DateTimeToString(stime,'yyyy-mm-dd hh:nn:ss',Now);
      edtCurTime.Text := stime;
    end;procedure TForm1.RunTimerTimer(Sender: TObject);
    var
     stime : string;
    begin
      DateTimeToString(stime,'yyyy-mm-dd hh:nn:ss',Now);
      if stime=edtRunTime.Text then
        DMT := TDataManagerThread.Create(False,'runDB');
    end;end.//运行线程
    unit uTDataManagerThread;interfaceuses
      Classes;type
      TDataManagerThread = class(TThread)
      private
        { Private declarations }
        DataManager: TDataManager;
        procedure Run();
      protected
        procedure Execute; override;  public
         constructor Create(Suspended:Boolean; Param:string);  end;implementation
     uses
       uMain;constructor TDataManagerThread.Create(Suspended: Boolean; Param: string);
    begin
      inherited Create(Suspended);
      if Param = 'runDB' then
        Flag := 1
      DataManager := TDataManager.Create(nil) ;
      FreeOnTerminate:=false;end;procedure TDataManagerThread.Run;
    begin
      if flag=1 then
      begin
        //检索数据库;
      end;
    end;procedure TDataManagerThread.Execute;
    begin
      { Place thread code here }
      Synchronize(Run);
    end;end.
      

  3.   

    为什么要用Synchronize(Run);?直接run不行吗?我记得Synchronize是到主线程中去运行的.恩应该是的,再去查查.如果要同步的话用同步变量就行了.
      

  4.   

    我要检索3个表,可能时间上会同时进行,我用4个定时器
    一个是走当前时间,另外3个纪录下次运行时间,如果当前时间
    与3个中某一个相等,就调用线程,根据flag的不同来区别。
    数据库很大,有1000万以上的纪录。
      

  5.   

    能详细点吗,你的意思是把数据库连接和检索再写一个线程?
    我现在的方法是写了一个数据库连接和检索的类。
    procedure TDataManagerThread.Run;
    begin
      if flag=1 then
      begin
        //调用检索函数;
      end;
    end;
      

  6.   

    我的想法是:在线程类中生成一个数据库链接控件。这样就不用Synchronize(run),而直接用run就可以了。