一个基本的消息问题 如何在一个进程处理的同时 ,处理消息?

clark_x 2002-10-25 02:37:14
我的一个通讯进程在后台 循环处理数据库数据。我的托盘需要处理双击的消息。现在好象无法处理。因为系统一直都在循环处理主要工作。怎么解决这个问题呢?
...全文
63 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
clark_x 2002-10-28
  • 打赏
  • 举报
回复
而且调用这个方法后,好象所以现有的数据库数据集都断掉了。这个问题怎么解决呢?
wjlsmail 2002-10-25
  • 打赏
  • 举报
回复
Study
clark_x 2002-10-25
  • 打赏
  • 举报
回复
Application.ProcessMessages 要花时多少,我的循环有几万次 我现在的速度是30分钟两万笔的处理。如果这个响应速度太慢,我就不能采取这个办法了。
windofsun 2002-10-25
  • 打赏
  • 举报
回复
这里的重点不是你的消息响应如何处理,而是哪里会使你的程序长期循环停止响应外部消息。比如有一个循环:

for I := 1 to 10000 do
begin
Caption := IntToStr(I);
end;

在循环结束前,是没办法响应消息的(除非用多线程)。你可以写成这样:

for I := 1 to 10000 do
begin
Caption := IntToStr(I);
Application.ProcessMessages;
end;

那么在循环的同时也可以响应消息了。
clark_x 2002-10-25
  • 打赏
  • 举报
回复
另外相关源程序如下:

// 消息和处理的定义 前者是托盘的 后者是应用窗口的
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;



clark_x 2002-10-25
  • 打赏
  • 举报
回复
对 这个语句你建议在那里做比较好 我的循环是5分钟一次 每次可能有几千笔数据需要逐笔发送 我担心用户乱按 导致消息队列乱了
windofsun 2002-10-25
  • 打赏
  • 举报
回复
在循环体内添加

Application.ProcessMessages;

对了,你的程序是基于Application的吧?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧