在我的线程类中声明:Procedure aaa(var Msg:Tmessage);Message 8888;可是不管你怎样对这个线程运用sendmessage函数就是无法触发这个事件!Form1:
Button1Click(sender : tobject);
begin
sendMessage(Thread1.handle,8888,0,0);
end;为什么?我一定需要线程能够接收到消息的!
Button1Click(sender : tobject);
begin
sendMessage(Thread1.handle,8888,0,0);
end;为什么?我一定需要线程能够接收到消息的!
解决方案 »
- Delphi控制Word,add文档后,连续增加文档提示powerword.dot无法保存。
- 关于图片存储、取出、打印的问题
- 设置挂钩的时候下面这段代码的作用是什么
- 请问如何动态改变精灵位图的大小
- 江湖救急,一个ADO的问题!
- winexec('rundll32.exe rnaui.dll,RnaDial 163',SW_SHOWNORMAL);
- 散分了.
- 请教一个极简单的问题:ADO怎么和带密码的ACCESS数据库相联,不用DSN的方式,
- 怎样判断一个小数是不是两位小数啊?
- treeview 这样的速度快吗?
- 请问在Delphi中左对齐和右对齐应该用什么语句。
- dll中创建窗口的问题(高分等待)
必须有窗体接收消息
TThread根本没有办法接收消息
const WM_MyMessage = wm_user+$200
发送这个消息看看
因为8888有可能在0-WM_User之间,这样的话肯定不能
接收的时候,同样接收这个消息处理
Procedure aaa(var Msg:Tmessage);Message WM_MyMessage;
要实现消息通讯的话用TEvent;
MyEvent:= TEvent.Create(nil,True,False,'dsalfjaslfjakl');
MyEvent.ResetEvent;
MyEvent.SetEvent;
MyEvent.WaitFor
就几个简半日的用法
----------------
在线程中响应消息
----------------
TMyThread=class(TThread)
private
FOwner:TControl;
FOwnerProc:TWndMethod;
FMessage:TMessage;
FEvent :TSimpleEvent;
procedure ThreadWndProc(var Message:TMessage);
constructor Create(AOwner:TControl);
destructor Destroy;
protect
procedure Execute;override;
end;
constructor TMyThread.Create(AOwner:TControl);
begin
inherited Create(True);
FOwner:=AOwner;
if Assigned(FOwner) then
begin
FOwenrProc:=AOwner.WindowProc;
FOwner.WindowProc:=ThreadWndProc;
end;
FEvent:=TSimpleEvent.Create;
end;
destroy TMyThread.Destroy;
begin
if Assigned(FOwner) then
FOwner.WindowProc:=FOwnerProc;
FEvent.Free;
inherited Destroy;
end; procedure TMyThread.ThreadWndProc(var Message:TMessage);
begin
if Message.Msg=WM_DESTROY then
begin
FOwner.WindowProc:=FOwnerProc;
FOwnerProc:=nil;
FOwner:=nil;
end;
if Message.Msg=所要处理的消息 then
begin
FMessage:=Message;
FEvent.SetEvent;
end
else if Assigned(FOwnerProc) then FOwnerProc(Message);
end;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
FEvent.WaitFor(INIFILE);
FEvent.ResetEvent;
....//根据FMessage处理消息
end
end;
BOOL PostThreadMessage(
DWORD idThread, // thread identifier
UINT Msg, // message to post
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
应该可以吧
要在PeekMessage or GetMessage来取得当前线程消息。而别的线程是通过PostThreadMessage(Thread.ThreadID, WM_USER, 0, 0)来进行线程间的消息传递的。看看这三个API函数的help吧
Thread: TMyThread;Button1.OnClick
Thread := TmYThread.Create;Button2.OnClick
PostThreadMessage(Thread.ThreadID, WM_CLOSE, 0, 0);TMyThread = class(TThread)
Event: THandle;procedure TMyThread.Execute;
var
msg: TMsg;
begin
PeekMessage(msg, 0, 0, 0, PM_NOREMOVE);
Event := CreateEvent(nil, False, False, nil);
try
while True do
case MsgWaitForMultipleObjects(1, Event, False, INFINITE, QS_ALLINPUT) of
WAIT_OBJECT_0:
begin
// 有地方调用了SetEvent函数
end;
WAIT_OBJECT_0 + 1:
begin
// 有地方用PostThreadMessage发消息过来
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
case Msg.message of
WM_CLOSE, WM_QUIT:
break;
else
DispatchMessage(Msg);
end;
end;
end;
finally
CloseHandle(Event);
end;
end;