Firemonkey - Indy UDP 广播
Firemonkey - Indy UDP broadcast
给定的 class 带有 TIDUDPServer 实例:
unit udpbroadcast_fm;
TUDPBC_FM = class( TObject )
protected
IdUDPServer: TIdUDPServer;
Timer: TTimer;
...
procedure IdUDPServerUDPRead( AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle );
procedure TimerOnTimer( Sender: TObject );
public
constructor Create;
function SendDiscover: integer;
properties
...
end;
function TUDPBC_FM.SendDiscover: integer;
begin
...
IdUDPServer.Broadcast( udpDiscovery, BCport );
...
end;
我正在使用此 class 发送 UDP 广播消息。我的问题是我如何 'signal' 从 'Timer'(定义为TUDPBC_FM字段)?
计时器的间隔设置为 2000 毫秒,因此所有设备有两秒的时间来响应广播,然后我想向表单或 class 实例发送信号。
在我的 VCL 应用程序中,我为此使用消息,但现在我在 firemonkey 上。
也许唯一的办法就是使用另一种方法?例如,将计时器作为表单的字段?)。
unit mstcc_fm;
Tmstcc = class(TObject)
protected
Fudpbc : TUDPBC_FM;
...
public
function msts_Discover: integer;
...
end;
function Tmstcc.msts_Discover: integer;
begin
...
Fudpbc.SendDiscover;
...
end;
表格单位:
unit main_fm;
...
procedure TfrmMain.btnDiscoverClick(Sender: TObject);
begin
mstcc.msts_Discover;
...
end;
how can i 'signal' back to a form/custom class instance from the onTimer event handler ('TimerOnTimer') of 'Timer' (defined as TUDPBC_FM field)?
您可以使用TThread.Queue()
,例如:
procedure TUDPBC_FM.NotifyProc;
begin
// do something...
end;
procedure TUDPBC_FM.TimerOnTimer(Sender: TObject);
begin
TThread.Queue(NotifyProc);
end;
procedure TUDPBC_FM.TimerOnTimer(Sender: TObject);
begin
TThread.Queue(
procedure
begin
// do something...
end
);
end;
或TIdNotify
:
procedure TUDPBC_FM.NotifyProc;
begin
// do something...
end;
procedure TUDPBC_FM.TimerOnTimer(Sender: TObject);
begin
TIdNotify.NotifyMethod(NotifyProc);
end;
type
TMyNotify = class(TIdNotify)
protected
procedure DoNotify; override;
end;
procedure TMyNotify.DoNotify;
begin
// do something...
end;
procedure TUDPBC_FM.TimerOnTimer(Sender: TObject);
begin
TMyNotify.Create.Notify;
end;
给定的 class 带有 TIDUDPServer 实例:
unit udpbroadcast_fm;
TUDPBC_FM = class( TObject )
protected
IdUDPServer: TIdUDPServer;
Timer: TTimer;
...
procedure IdUDPServerUDPRead( AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle );
procedure TimerOnTimer( Sender: TObject );
public
constructor Create;
function SendDiscover: integer;
properties
...
end;
function TUDPBC_FM.SendDiscover: integer;
begin
...
IdUDPServer.Broadcast( udpDiscovery, BCport );
...
end;
我正在使用此 class 发送 UDP 广播消息。我的问题是我如何 'signal' 从 'Timer'(定义为TUDPBC_FM字段)?
计时器的间隔设置为 2000 毫秒,因此所有设备有两秒的时间来响应广播,然后我想向表单或 class 实例发送信号。
在我的 VCL 应用程序中,我为此使用消息,但现在我在 firemonkey 上。
也许唯一的办法就是使用另一种方法?例如,将计时器作为表单的字段?)。
unit mstcc_fm;
Tmstcc = class(TObject)
protected
Fudpbc : TUDPBC_FM;
...
public
function msts_Discover: integer;
...
end;
function Tmstcc.msts_Discover: integer;
begin
...
Fudpbc.SendDiscover;
...
end;
表格单位:
unit main_fm;
...
procedure TfrmMain.btnDiscoverClick(Sender: TObject);
begin
mstcc.msts_Discover;
...
end;
how can i 'signal' back to a form/custom class instance from the onTimer event handler ('TimerOnTimer') of 'Timer' (defined as TUDPBC_FM field)?
您可以使用TThread.Queue()
,例如:
procedure TUDPBC_FM.NotifyProc;
begin
// do something...
end;
procedure TUDPBC_FM.TimerOnTimer(Sender: TObject);
begin
TThread.Queue(NotifyProc);
end;
procedure TUDPBC_FM.TimerOnTimer(Sender: TObject);
begin
TThread.Queue(
procedure
begin
// do something...
end
);
end;
或TIdNotify
:
procedure TUDPBC_FM.NotifyProc;
begin
// do something...
end;
procedure TUDPBC_FM.TimerOnTimer(Sender: TObject);
begin
TIdNotify.NotifyMethod(NotifyProc);
end;
type
TMyNotify = class(TIdNotify)
protected
procedure DoNotify; override;
end;
procedure TMyNotify.DoNotify;
begin
// do something...
end;
procedure TUDPBC_FM.TimerOnTimer(Sender: TObject);
begin
TMyNotify.Create.Notify;
end;