AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung System.Messaging.TMessageManager Asynchron?
Thema durchsuchen
Ansicht
Themen-Optionen

System.Messaging.TMessageManager Asynchron?

Ein Thema von QuickAndDirty · begonnen am 4. Mai 2018 · letzter Beitrag vom 17. Okt 2018
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.925 Beiträge
 
Delphi 12 Athens
 
#1

System.Messaging.TMessageManager Asynchron?

  Alt 4. Mai 2018, 11:11
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 https://francois-piette.blogspot.de/...ndows-and.html
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?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 4. Mai 2018 um 11:16 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: System.Messaging.TMessageManager Asynchron?

  Alt 4. Mai 2018, 11:22
1) Nein.
2) Diverse Task- und Threadlösungen die in den gewünschten Threadkontext synchronisieren.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: System.Messaging.TMessageManager Asynchron?

  Alt 4. Mai 2018, 11:28
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.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.925 Beiträge
 
Delphi 12 Athens
 
#4

AW: System.Messaging.TMessageManager Asynchron?

  Alt 7. Mai 2018, 12:45
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;
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.016 Beiträge
 
Delphi 12 Athens
 
#5

AW: System.Messaging.TMessageManager Asynchron?

  Alt 7. Mai 2018, 12:48
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.925 Beiträge
 
Delphi 12 Athens
 
#6

AW: System.Messaging.TMessageManager Asynchron?

  Alt 7. Mai 2018, 12:57
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.
Evolution. Es war vormals tatsächlich nur Queue. Ich hab es dann auf ForceQueue umgesetzt ohne alles noch mal zu durch denken.

Tatsächlich würde das hier ausreichen?
Delphi-Quellcode:
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;
bzw.
Könnt man auch direkt
Delphi-Quellcode:
{$o-}
  TThread.ForceQueue(nil,DoCloseFormAndOpenNextForm);
{$o+}
machen ?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 7. Mai 2018 um 13:05 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.925 Beiträge
 
Delphi 12 Athens
 
#7

AW: System.Messaging.TMessageManager Asynchron?

  Alt 17. Okt 2018, 17:54
mal den anktuellen stand dokumentieren

Delphi-Quellcode:
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;
Das ist die Lösung mit der ich Momentan glücklich bin.
Man darf nur Appplication.Processmessages möglichst nirgends benutzen...Weil die Threadsynchronisation an der Messagequeue hängt.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz