据我所知,delphi窗口都是单线程的,无论parent是mainform还是application,消息接收都是单线程的。也就是说,一个程序由始至终都是只能由一个线程处理消息。不过接收消息就是单线程,但处理接收到的消息内容你可以放在多线程里完成啊,这样可以在相当程度下实现每个线程自己处理自己的消息啦。有个delphi自带的控件,叫TApplicationEvents,放上去就可以自己写自己的消息处理啦,超级方便。哪用好像VC那么麻烦,而且实现的效果是和VC一样的。
解决方案 »
- [考题]关于SetLength
- 50分求转2句C的代码,关于指针的.
- 请教达人解救!!不懂
- Screen.Cursors[crHand] := LoadCursor(hInstance, 'FR_HAND')这句什么意思?
- [求助]第一次编DLL文件,编译通过,但不能运行
- 还是一个关于Word中生成文本框的问题
- 用TDBGRID控件只允许修改表,不允许添加表,如何实现?
- 一个字符串的问题
- 类型转换的问题
- 一个好重要的问题!!!!!
- 如何在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(木石三) 对了