我在写一个定时多任务提醒工具。大致流程是:
1、将要提醒的时间、标题、内容、完成情况 字段存在数据库中。
2、然后能过查询出未完成的提醒
3、用循环的方式一个个判断是否到期。有则提醒下面我这样的写法效率怎么样?procedure JsCxTx;  //首先在窗体创建事件中进行查询
begin
     with DtM.QryTiXingCheck do  //查询定时提醒内容
   begin
     EnableControls;   //先连接
     Close;
     SQL.clear;
     SQL.Add('select * from TiXing where Tx_wc=0 and Tx_date>:Tx_date');
     Parameters.ParamByName('Tx_date').value:=Now;
     open;
     DisableControls;  //查询后断开控制(不知道用这句是不是能解决反复从数据库中获取值的问题)
   end;
end;procedure TFormMain.tmrTxTimer(Sender: TObject); //窗体创建后每0.5秒执行一次
var
  TxDate:TDateTime;
  i:Integer;
  TxBt,TxLr:string;  
begin
           with DtM.QryTiXingCheck do
        begin
              First;          for i := 0 to RecordCount-1 do
          begin
              TxDate:=FieldByName('Tx_date').AsDateTime; //提醒时间
              Txbt:=FieldByName('Tx_bt').AsString;   //提醒标题
              TxLr:=FieldByName('Tx_Lr').AsString; //提醒内容
              Pzh:=FieldByName('Pzh').AsString; //任务编号                 //如果有时间到期就提醒
                   if  (0<SecondsBetween(now,TxDate))and(2>SecondsBetween(now,TxDate)) then
                   begin
                     dtm.JsExec('update TiXing set Tx_Wc=1 where Pzh=:pzh',[Pzh]);                     Application.CreateForm(TFtiXing,FtiXing); //显示提醒界面
                     FtiXing.ShowModal;
                     FtiXing.Free;                     JsCxTx; //重新查询提醒任务到 QryTiXingCheck
                   end;
                         Next;
          end;        end;
end;

解决方案 »

  1.   

    在tmrTxTimer执行开始,先将定时器置为不可用,否则0.5秒,你的执行未完成,下一个执行又开始了,容易出错,查询完毕,在将定时器置为可用
      

  2.   

    JsCxTx; //重新查询提醒任务到 QryTiXingCheck
    这句话的位置不对,应该放在for之外,,另外,你的timer每0.5秒执行一次,如果执行时间超了0.5s就会重复执行,这样容易死锁,应该在timer事件中第一句timer.enable:=false最后一句为true