首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TMessageManager和TThread.Queue的防火墙消息处理

使用TMessageManager和TThread.Queue的防火墙消息处理
EN

Stack Overflow用户
提问于 2014-10-03 09:31:06
回答 1查看 3.1K关注 0票数 1

和许多其他的Fire猴子开发人员一样,我需要一个通用的多平台解决方案来将消息从线程发送到主线程(以取代PostMessage)。我也需要它在iOS上工作。

弗朗索瓦·皮耶特(Fran Ois Piette )有一个解决方案,适用于安卓和Windows,但不适用于iOS:TMessagingSystem

但是,我认为可以通过将“新”TMessageManager与TThread.Queue()结合使用来完成更简单的工作。但是,没有人使用这种方法发布过实际工作的代码(例如这是不完整的)。

您是否有希望与社区共享的经过测试的实现(或者只是建议如何正确地实现它)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-30 15:15:45

好的,这是我的实现。我没有使用TMessagingSystem,因为它似乎只是增加了复杂性(至少对于我的情况而言)。到目前为止,这是可行的,但是如果有人有改进的建议,我会很乐意改进的。

我看了一下乌韦·拉比的解决方案,但我想让它在我要转换到FMX的大型代码库中更直观、更容易实现。使用下面的解决方案,我可以简单地将所有PostMessage()替换为gMessageHandler.PostMessage (删除win handle参数),并将表单中的消息函数添加到tMainForm.MessageCallBack中。

我创建了一个小单元,我可以在任何需要PostMessage函数的地方都包含它。这些地方不需要知道表格:

代码语言:javascript
复制
unit MessageHandler
interface
tAllOSMessage = procedure(aMessageID, aData1, aData2: integer) of object;
tAllOSMessageHandler = class
private
  fOnMessage : tAllOSMessage;
public
  constructor Create(aMessageCallBack: tAllOSMessage);
  procedure PostMessage(aMessageID, aData1, aData2: integer; aSourceThread: TThread = nil);
end;

var
  gMessageHandler: tAllOSMessageHandler;

implementation

constructor tAllOSMessageHandler.Create(aMessageCallBack: tAllOSMessage);
begin
  fOnMessage := aMessageCallBack;
end;

procedure tAllOSMessageHandler.PostMessage(aMessageID, aData1, aData2: integer; aSourceThread: TThread);
begin
  if aSourceThread=nil then
    aSourceThread := TThread.CurrentThread;
  aSourceThread.Queue(nil, procedure
                           begin
                             if Assigned(fOnMessage) then
                               fOnMessage(aMessageID, aData1, aData2);
                           end  );
end;
end.

然后我将这些行添加到主表单单元中:

代码语言:javascript
复制
//Added to main form:
tMainForm = class(TForm)
...
procedure MessageCallBack(aMessageID, aData1, aData2: integer);

//Added to MainFormCreate
gMessageHandler := tAllOSMessageHandler.Create(MessageCallBack);

//Added to MainFormDestroy
FreeAndNil(gMessageHandler)

procedure tMainForm.MessageCallBack(aMessageID, aData1, aData2: integer);
begin
  case aMessageID of
    MyMessage1 :  MyFunction1(aData1,aData2);
    ...
  end;
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26176545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档