2014-09-18 15 views
0

После того, как приложение канала соединения закончится через несколько секунд. Программа работает на реальном телефоне LG L65 (без подписки), у меня есть одно событие IdIRC1Raw. Любое предложение?Delphi XE7 Android Indy IRC

procedure THeaderFooterwithNavigation.IdIRC1Raw(ASender: TIdContext; AIn: Boolean; const AMessage: string); 
begin 
    Memo1.Lines.Add(AMessage) 
end; 
+0

Мое предложения прекратить использование Дельф андроида платформы ... любые журналы в LogCat? Может быть, компонент indy, использующий неправильные потоки – Selvin

+0

Я запустил этот apk на реальном телефоне, no loggin – mca64

+0

Правильно ли он работает в эмуляторе? – mjn

ответ

1

Когда параметр AIn верно, то обработчик события OnRaw вызывается в контексте рабочего потока выполняется внутри TIdIRC (представлено параметром AContext). Когда AIn является ложным, OnRaw вызывается в контексте любого потока, в который вы посылаете команду (и AContext - ноль).

Поскольку OnRaw не всегда выполняется в контексте основного потока пользовательского интерфейса, необходимо синхронизировать с основным потоком пользовательского интерфейса для того, чтобы обновить Memo безопасно, например:

procedure THeaderFooterwithNavigation.IdIRC1Raw(ASender: TIdContext; AIn: Boolean; const AMessage: string); 
begin 
    TThread.Synchronize(nil, 
    procedure 
    begin 
     Memo1.Lines.Add(AMessage); 
    end 
); 
end; 

Однако, имейте в виду, что до XE7, TThread.Synchronize() was broken in FireMonkey, хотя есть простой обходной путь доступен (упомянутый в приведенной выше ссылке):

procedure THeaderFooterwithNavigation.Timer1Timer(Sender: TObject); 
begin 
    CheckSynchronize; 
end; 
+0

спасибо. Проблема исправлена. – mca64