【问题标题】:Delphi XE7 Android Indy IRCDelphi XE7 Android Indy IRC
【发布时间】:2014-09-18 14:47:01
【问题描述】:

加入频道后,应用程序将在几秒钟后自行终止。程序在真正的电话 LG L65(无签名)上运行,我有一个事件 IdIRC1Raw。有什么建议吗?

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

【问题讨论】:

  • 我的建议是停止在android平台上使用delphi ... logcat中有任何日志吗?也许 indy 组件使用了错误的线程
  • 我在真机上运行这个apk,没有登录
  • 在模拟器中能正常工作吗?
  • 我不使用模拟器(电脑太慢)
  • 官方的安卓模拟器总体来说比较慢。使用其他模拟器,如 BlueStacks 或 Genymotion。它们的速度要快得多。

标签: android delphi indy


【解决方案1】:

AIn 参数为真时,OnRaw 事件处理程序将在TIdIRC(由AContext 参数表示)内部运行的工作线程的上下文中调用。当AIn 为假时,OnRaw 将在您发送命令的任何线程的上下文中被调用(并且AContext 为零)。

因为OnRaw并不总是在主UI线程的上下文中运行,你必须与主UI线程同步才能安全地更新备忘录,例如:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 2020-01-29
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2015-03-17
    相关资源
    最近更新 更多