![]() |
System.Messaging.TMessageManager Asynchron?
Funktioniert
System.Messaging.TMessageManager.SendMessage Asynchron? Ja ich hätte es auch ausprobiern können, aber ich kann das auf IOS nicht kurzfristig testen und ich muss wissen ob es Auf Win32, Android und IOS asnychron läuft! Bzw. Wenn nicht. gibt es ne andere Möglichkeit Asnychron zu Messagen ohne die Lösung von ![]() oder @Uwe Raabe zu benutzern? Ja ich habe im Moment ne "eigene" "Lösung" im Einsatz...mir geht es vor allem um das asynchrone ausfühen von code. In diesem zusammen hang. Wieso hat Application.Processmessages einen Effekt in Android Apps? Gibt es die normale Message queue in Android apps? |
AW: System.Messaging.TMessageManager Asynchron?
1) Nein.
2) Diverse Task- und Threadlösungen die in den gewünschten Threadkontext synchronisieren. |
AW: System.Messaging.TMessageManager Asynchron?
Delphi-Quellcode:
unit System.Messaging.Extended;
interface uses System.SysUtils, System.Classes, System.Messaging, System.Threading; type TMessageManagerHelper = class helper for TMessageManager procedure SendMessageToQueue(const Sender: TObject; AMessage: TMessage; ADispose: Boolean = True); procedure SendMessageAsync(const Sender: TObject; AMessage: TMessage; ADelayMS: Cardinal = 0; ADispose: Boolean = True); overload; procedure SendMessageAsync(const Sender: TObject; AMessage: TMessage; ADispose: Boolean = True); overload; end; implementation { TMessageManagerHelper } procedure TMessageManagerHelper.SendMessageAsync(const Sender: TObject; AMessage: TMessage; ADelayMS: Cardinal; ADispose: Boolean); begin TTask.Run( procedure begin if ADelayMS > 0 then begin Sleep(ADelayMS); end; TThread.Queue(nil, procedure begin Self.SendMessage(Sender, AMessage, ADispose) end) end); end; procedure TMessageManagerHelper.SendMessageAsync(const Sender: TObject; AMessage: TMessage; ADispose: Boolean); begin SendMessageAsync(Sender, AMessage, 0, ADispose); end; procedure TMessageManagerHelper.SendMessageToQueue(const Sender: TObject; AMessage: TMessage; ADispose: Boolean = True); begin TThread.Queue(nil, procedure begin Self.SendMessage(Sender, AMessage, ADispose) end); end; end. |
AW: System.Messaging.TMessageManager Asynchron?
Ja So ein ähnliches System benutze ich bereits. Nur eben nicht für Messages sondern für TThreadMethods.
Delphi-Quellcode:
Procedure QueueMethod(aThreadMethod:TThreadMethod; QueueType:TQueueType=qtNone; Sender:TObject = nil ); implementation type TQThread = Class(TThread) Public ThreadMethod:TThreadMethod; Procedure Execute;Override; end; Procedure QueueMethod(aThreadMethod:TThreadMethod; QueueType:TQueueType=qtNone; Sender:TObject = nil ); var aThread:TQThread; Begin case QueueType of qtNone: aThreadMethod; //direkt ausführen qtThread,qtIdle: Begin//Vom CPU Scheduler verzögern lassen if (MainThreadID = TThread.Current.ThreadID) then Begin aThread := TQThread.Create(true); aThread.FreeOnTerminate := True; aThread.ThreadMethod := aThreadMethod; aThread.Resume; end else Begin {$o-} TThread.ForceQueue(nil,aThreadMethod); {$o+} End; End; end; End; { TQThread } procedure TQThread.Execute; begin {$o-} TThread.ForceQueue(nil,ThreadMethod); {$o+} end; |
AW: System.Messaging.TMessageManager Asynchron?
Wozu der Thread, wo doch ForceQueue "richtig" arbeitet?
Damals beim Queue war es ja so, dass es im Hauptthread aufgerufen sofort ausgeführt wurde, anstatt später. |
AW: System.Messaging.TMessageManager Asynchron?
Zitat:
Tatsächlich würde das hier ausreichen?
Delphi-Quellcode:
bzw.
Procedure QueueMethod(aThreadMethod:TThreadMethod; QueueType:TQueueType=qtNone);
implementation Procedure QueueMethod(aThreadMethod:TThreadMethod; QueueType:TQueueType=qtNone); var aThread:TQThread; Begin case QueueType of qtNone: aThreadMethod; //direkt ausführen qtThread,qtIdle: Begin//Vom CPU Scheduler verzögern lassen {$o-} TThread.ForceQueue(nil,aThreadMethod); {$o+} End; end; End; Könnt man auch direkt
Delphi-Quellcode:
machen ?
{$o-}
TThread.ForceQueue(nil,DoCloseFormAndOpenNextForm); {$o+} |
AW: System.Messaging.TMessageManager Asynchron?
mal den anktuellen stand dokumentieren
Delphi-Quellcode:
Das ist die Lösung mit der ich Momentan glücklich bin.
Procedure QueueMethod(aThreadMethod:TThreadMethod);
Begin // Abgeschaut aus UNIT FMX.FORMS // procedure ReleaseForm(const AForm: TCommonCustomForm); // Wir müssen das immer so machen wie die das dort auch machen. // Unter der Annahme dass die FMX Bibliotheken fehlerfrei sind.... {$IFDEF ANDRODID} TThread.CreateAnonymousThread( Procedure Begin TThread.CurrentThread.Queue(nil,AthreadMethod); end; ); {$ELSE} TThread.CurrentThread.ForceQueue(nil,aThreadMethod); {$ENDIF} end; Man darf nur Appplication.Processmessages möglichst nirgends benutzen...Weil die Threadsynchronisation an der Messagequeue hängt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz