据我所知,delphi窗口都是单线程的,无论parent是mainform还是application,消息接收都是单线程的。也就是说,一个程序由始至终都是只能由一个线程处理消息。不过接收消息就是单线程,但处理接收到的消息内容你可以放在多线程里完成啊,这样可以在相当程度下实现每个线程自己处理自己的消息啦。有个delphi自带的控件,叫TApplicationEvents,放上去就可以自己写自己的消息处理啦,超级方便。哪用好像VC那么麻烦,而且实现的效果是和VC一样的。
解决方案 »
- 请教高手,怎样动态的设置adoconnection的connectionstring
- 请问如何通过函数取得某个日期格式的年份,月份??
- 用ResHacker更改图标的问题
- 一个着急的问题,精通fastreport的同学救命啊!
- dxGrid,cxGrid有什么不同,个有什么优缺点,欢迎大家来发贴!!!
- 看GIF控件
- 为什么今天我的程序的grid运行的时候老是不能输入数据,我没有设置什么只读属性呀
- 求一控件,可根据用户需求任意定制报表字段,且可打印,打印预览
- delphi Excel如何在sheet中新增一个sheet,并且将前一个sheet的内容格式复制到这个sheet中呢?
- 坚难的开始,一个关于自动累加的问题(一定进来看看)
- 如何在DELPHI中访问其它计算机上的MYSQL的数据库啊?求助啊!!!
- 各位高手,*.vsd文件用什么软件才能打开?十万火急!!!尽快回答,万分感谢!!!!!!!
在接收线程中必须调用USER或GDI的函数才能建立消息队列。
给你一个已经工作良好的例子:unit ClassNotifyCenter;{*******************************************************}
{ Description: }
{ Notify Center }
{ Developper: }
{ Yao Yong }
{ Release: }
{ 2001-07-17 }
{*******************************************************}
interfaceuses
Classes,SysUtils,SyncObjs,Windows,Messages;type
TNotifyProc = procedure (const Source:IDispatch) of object;
TNotifyCenter = class(TThread)
private
FEventHandler: TNotifyProc;
protected
procedure Execute; override;
public
property OnEvent: TNotifyProc read FEventHandler write FEventHandler;
end;implementation{ TNotifyCenter }procedure TNotifyCenter.Execute;
var
Msg: TMSG;
begin
repeat
WaitMessage;
GetMessage(Msg,0,0,0);
if Msg.Message=WM_USER then
begin
if Assigned(FEventHandler) then
FEventHandler(IDispatch(Msg.lParam));
SetEvent(Msg.wParam);
end;
until Msg.Message=WM_QUIT;
end;end.
消息队列,顾名思义是一个队列,实现了特定的队列存取规则,windows的消息队列也是如此,
你要的是一个自定义消息队列,又何必用peekmessage来作一个跟系统相关的呢?而且会跟系统消息有冲突。 自定义消息队列可以用stringlist来实现,只是存取的时候要进行必要的同步!
GetMessage(Msg,0,0,0);这些不都是API函数么?只有这两行才是关键,不知你是不是误解了?
我猜测你彻底混淆了“线程消息队列”与“窗口消息队列”,线程消息队列对于各个线程都是独立的,由系统维护,一般只用于各个线程间通信,哪里来的“系统消息”?既然是彼此独立的,何来“冲突”?
其实线程消息队列与窗口消息队列是完全不同的概念,仅仅是实现的机制相同罢了。
PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);
^^^no remove就是要创建队列
是不是这原因
eDRIVE(EncoreUneFois) 其实已经答了你的问题了,怪不得我回家试来试去都没事。
是copy_paste(木石三) 对了