我有一个小的客户端服务器应用程序,其中服务器使用命名管道向客户端发送一些消息。客户端有两个线程-主GUI线程和一个“接收线程”,它不断通过命名管道接收服务器发送的消息。现在每当接收到某个消息时,我想触发一个自定义事件-但是,该事件应该在主GUI线程上处理,而不是在调用线程上处理-我不知道如何做到这一点(以及是否可能)。
以下是我目前所拥有的:
现在我想能够创建TForm1类的事件处理程序成员,例如:
这段文字的大意是:
“这个事件不会在接收线程中执行,而是在主 UI 线程中执行。我特别希望接收线程只触发事件并继续执行,而不需要等待事件处理程序方法的返回(基本上我需要像 .NET Control.BeginInvoke 方法一样的东西)。
我真的是个初学者(几个小时前我还试图学习如何定义自定义事件),所以我不知道它是否可能或者我是否做错了什么,所以非常感谢您的帮助。”
以下是我目前所拥有的:
tMyMessage = record
mode: byte;
//...some other fields...
end;
TMsgRcvdEvent = procedure(Sender: TObject; Msg: tMyMessage) of object;
TReceivingThread = class(TThread)
private
FOnMsgRcvd: TMsgRcvdEvent;
//...some other members, not important here...
protected
procedure MsgRcvd(Msg: tMyMessage); dynamic;
procedure Execute; override;
public
property OnMsgRcvd: TMsgRcvdEvent read FOnMsgRcvd write FOnMsgRcvd;
//...some other methods, not important here...
end;
procedure TReceivingThread.MsgRcvd(Msg: tMyMessage);
begin
if Assigned(FOnMsgRcvd) then FOnMsgRcvd(self, Msg);
end;
procedure TReceivingThread.Execute;
var Msg: tMyMessage
begin
//.....
while not Terminated do begin //main thread loop
//.....
if (msgReceived) then begin
//message was received and now is contained in Msg variable
//fire OnMsgRcvdEvent and pass it the received message as parameter
MsgRcvd(Msg);
end;
//.....
end; //end main thread loop
//.....
end;
现在我想能够创建TForm1类的事件处理程序成员,例如:
procedure TForm1.MessageReceived(Sender: TObject; Msg: tMyMessage);
begin
//some code
end;
这段文字的大意是:
“这个事件不会在接收线程中执行,而是在主 UI 线程中执行。我特别希望接收线程只触发事件并继续执行,而不需要等待事件处理程序方法的返回(基本上我需要像 .NET Control.BeginInvoke 方法一样的东西)。
我真的是个初学者(几个小时前我还试图学习如何定义自定义事件),所以我不知道它是否可能或者我是否做错了什么,所以非常感谢您的帮助。”