我的一个通讯进程在后台 循环处理数据库数据。我的托盘需要处理双击的消息。现在好象无法处理。因为系统一直都在循环处理主要工作。怎么解决这个问题呢?

解决方案 »

  1.   

    在循环体内添加Application.ProcessMessages;对了,你的程序是基于Application的吧?
      

  2.   

    另外相关源程序如下:    // 消息和处理的定义 前者是托盘的 后者是应用窗口的
        procedure WMMYTrayIconCallback( var Msg : TMessage );
        Message WM_MYTRAYICONCALLBACK;    procedure WMSysCommand(var Message:TMessage);
        message WM_SYSCOMMAND;
    // 最小化窗口时,进入托盘 并从任务栏不可见
    procedure TfmAccount.WMSysCommand(var Message:TMessage);
    begin
      if (Message.WParam = SC_ICON) then
      begin
        Visible := false;
        Shell_NotifyIcon(NIM_ADD, @MyTrayIcon );
      end
      else
      begin
        DefWindowProc(Handle,Message.Msg,Message.WParam,message.LParam);
      end;
    end;// 只是在双击时候 显示应用窗口
    procedure TfmAccount.WMMyTrayIconCallback( var Msg:TMessage );
    var
      CursorPos : TPoint;
    begin  case Msg.LParam of
        WM_LBUTTONDBLCLK:
          begin        //SetWindowLong( Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW );
            //Application.ShowMainForm := TRUE;
            Application.MainForm.Visible := TRUE;        Shell_NotifyIcon( NIM_DELETE, @MyTrayIcon );
          end;
        WM_RBUTTONDOWN:
          begin
            ;
          end;
        WM_LBUTTONDOWN:
          begin
            ;
          end;
      end;
    end;
      

  3.   

    这里的重点不是你的消息响应如何处理,而是哪里会使你的程序长期循环停止响应外部消息。比如有一个循环:  for I := 1 to 10000 do
      begin
        Caption := IntToStr(I);
      end;在循环结束前,是没办法响应消息的(除非用多线程)。你可以写成这样:  for I := 1 to 10000 do
      begin
        Caption := IntToStr(I);
        Application.ProcessMessages;
      end;那么在循环的同时也可以响应消息了。
      

  4.   

    Application.ProcessMessages 要花时多少,我的循环有几万次 我现在的速度是30分钟两万笔的处理。如果这个响应速度太慢,我就不能采取这个办法了。