和许多其他的Fire猴子开发人员一样,我需要一个通用的多平台解决方案来将消息从线程发送到主线程(以取代PostMessage)。我也需要它在iOS上工作。
弗朗索瓦·皮耶特(Fran Ois Piette )有一个解决方案,适用于安卓和Windows,但不适用于iOS:TMessagingSystem。
但是,我认为可以通过将“新”TMessageManager与TThread.Queue()结合使用来完成更简单的工作。但是,没有人使用这种方法发布过实际工作的代码(例如这是不完整的)。
您是否有希望与社区共享的经过测试的实现(或者只是建议如何正确地实现它)?
发布于 2014-10-30 15:15:45
好的,这是我的实现。我没有使用TMessagingSystem,因为它似乎只是增加了复杂性(至少对于我的情况而言)。到目前为止,这是可行的,但是如果有人有改进的建议,我会很乐意改进的。
我看了一下乌韦·拉比的解决方案,但我想让它在我要转换到FMX的大型代码库中更直观、更容易实现。使用下面的解决方案,我可以简单地将所有PostMessage()替换为gMessageHandler.PostMessage (删除win handle参数),并将表单中的消息函数添加到tMainForm.MessageCallBack中。
我创建了一个小单元,我可以在任何需要PostMessage函数的地方都包含它。这些地方不需要知道表格:
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.然后我将这些行添加到主表单单元中:
//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;https://stackoverflow.com/questions/26176545
复制相似问题