2015-04-22 2 views
0

данного класса с экземпляром TIdUDPServer:FireMonkey - Indy UDP вещания

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; 

Im используя этот класс, чтобы отправить сообщение UDP вещания. Мой вопрос заключается в том, что, как я могу «сигнал» обратно в форме/пользовательский экземпляр класса из обработчика событий OnTimer («TimerOnTimer„) из“Таймера» (определяется как TUDPBC_FM поля)?

Интервал таймера был установлен в 2000 мсек, поэтому для всех устройств, отвечающих за широковещательную передачу, требуется две секунды, тогда я хочу отправить сигнал в экземпляр формы или класса.

В моем приложении VCL я использовал сообщения для этого, но теперь im на 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; 

ответ

1

как я могу 'сигнал' обратно в форме/пользовательский экземпляр класса из обработчика событий OnTimer ('TimerOnTimer') из «Таймер» (определяется как поле TUDPBC_FM)?

Вы можете использовать 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; 
Смежные вопросы