我有一个小型客户端-服务器应用程序,其中服务器使用命名管道向客户端发送一些消息。客户端有两个线程——主 GUI 线程和一个“接收线程”,不断接收服务器通过命名管道发送的消息。现在,每当收到一些消息时,我想触发一个自定义事件 - 但是,该事件不应该在调用线程上处理,而是在主 GUI 线程上处理 - 我不知道该怎么做(以及是否甚至有可能)。
这是我到目前为止所拥有的:
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方法之类的东西)
我真的是这方面的初学者(我试图在几个小时前学习如何定义自定义事件。),所以我不知道这是否可能或者我做错了什么,所以提前非常感谢你的帮助。