AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung FMX unbekannten Thread synchronisieren
Thema durchsuchen
Ansicht
Themen-Optionen

FMX unbekannten Thread synchronisieren

Ein Thema von friedt99 · begonnen am 4. Nov 2021 · letzter Beitrag vom 5. Nov 2021
Antwort Antwort
friedt99

Registriert seit: 17. Mär 2010
45 Beiträge
 
#1

FMX unbekannten Thread synchronisieren

  Alt 4. Nov 2021, 20:46
Hallo Zusammen,

habe folgendes Problem (D11, FMX, IOS):

Delphi-Quellcode:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  System.Notification, FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    NotificationCenter1: TNotificationCenter;
    procedure Button1Click(Sender: TObject);
    procedure NotificationCenter1PermissionRequestResult(Sender: TObject;
      const AIsGranted: Boolean);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
uses FMX.DialogService;

{$R *.fmx}



procedure TForm1.Button1Click(Sender: TObject);
begin
  if NotificationCenter1.AuthorizationStatus <> TAuthorizationStatus.Authorized then
  begin
    NotificationCenter1.RequestPermission;
  end;
end;

procedure TForm1.NotificationCenter1PermissionRequestResult(Sender: TObject;
  const AIsGranted: Boolean);
begin
  if not AIsGranted then
  begin
    TDialogService.ShowMessage
      ('Die App kann Dir keine Nachrichten senden, da die erforderliche Berechtigung dazu nicht erteilt wurde.');
  end;
end;

end.
Wenn man "nicht zulassen" auswählt bei der Abfrage auf dem Smartphone, wird NotificationCenter1PermissionRequestResult aufgerufen.
Das crasht dann mit "Im Projekt Project1 ist eine Exception der Klasse Exception mit der Meldung 'Meldungen müssen im Haupt-UI-Thread angezeigt werden.' aufgetreten."

Das kommt vom TDialogService.ShowMessage.

Kann ich, und wenn ja, wie, den "unbekannten" Thread der NotificationCenter1PermissionRequestResult aufruft, mit dem Mainthread synchronisieren ?

Wenn nein, unter VCL hätte ich jetzt mit einem PostMessage gearbeitet. Gibt es in FMX ein eine äquivalente Möglichkeit dazu ?


Vielen Dank schon mal

Thomas

Geändert von friedt99 ( 4. Nov 2021 um 21:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#2

AW: FMX unbekannten Thread synchronisieren

  Alt 4. Nov 2021, 20:56
Nur so aus der Hüfte:
Delphi-Quellcode:
TThread.Synchronize(nil,
  procedure
  begin
    TDialogService.ShowMessage('Die App kann Dir keine Nachrichten senden, da die erforderliche Berechtigung dazu nicht erteilt wurde.');
  end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
friedt99

Registriert seit: 17. Mär 2010
45 Beiträge
 
#3

AW: FMX unbekannten Thread synchronisieren

  Alt 4. Nov 2021, 21:14
Du hättest mit deinen Schüssen aus der Hüfte Billy the Kid erledigt....

Bis auf eine fehlende ) war es perfekt.

So klappt es:

Delphi-Quellcode:
procedure TForm1.NotificationCenter1PermissionRequestResult(Sender: TObject;
  const AIsGranted: Boolean);
begin
  if not AIsGranted then
  begin
    TThread.Synchronize(nil,
      procedure
      begin
        TDialogService.ShowMessage('Die App kann Dir keine Nachrichten senden, da die erforderliche Berechtigung dazu nicht erteilt wurde.');
      end);
  end;
end;

Vielen Dank.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#4

AW: FMX unbekannten Thread synchronisieren

  Alt 5. Nov 2021, 07:22
Nur so aus der Hüfte:
TThread.Synchronize(nil,

Ich mache das gerne so wie unten, mit ForceQueue statt mit Synchronize,
um noch mehr auf der sicheren Seite zu sein.
Das würde es in allen Thread/NichtTread Fällen gut abkapsel, und man muss sich weniger sorgen machen.

In dem Fall mit der Nutzereingabe ist das Timing o.ä. sowieso völlig irrelevant,
ob es eine ms mehr oder weniger braucht.

Delphi-Quellcode:
TThread.ForceQueue(nil,
  procedure
  begin
    TDialogService.ShowMessage('Die App kann Dir keine Nachrichten senden, da die erforderliche Berechtigung dazu nicht erteilt wurde.');
  end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: FMX unbekannten Thread synchronisieren

  Alt 5. Nov 2021, 09:31
Bei Queue/ForceQueue mußt du nur aufpassen, wenn du übergreifende Variablen verwendest, dass deren Inhalt (Objekte, Zeiger und bedingt auch dynamische Arrays) zur Ausführungszeit noch vorhanden ist. (oder für den Aufruf vorher kopiert werden)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#6

AW: FMX unbekannten Thread synchronisieren

  Alt 5. Nov 2021, 09:50
Bei Queue/ForceQueue mußt du nur aufpassen, wenn du übergreifende Variablen verwendest, dass deren Inhalt (Objekte, Zeiger und bedingt auch dynamische Arrays) zur Ausführungszeit noch vorhanden ist. (oder für den Aufruf vorher kopiert werden)
Dankesehr für den Hinweis, himitsu.

Das ist richtig, und das mache ich standardmässig so nach dem Schema wie unten,
und kopiere mir die Variablen lokal, mit dem gleichen Namen, nur mit "A" und "L" unterschiedlich benannt.

Delphi-Quellcode:
procedure TForm.PressIt( AParam : TMyParameter );
var
  LParam : TMyParameter;
begin
  LParam := AParm;

  TThread.ForceQueue(nil,
      procedure
      begin
          TDialogService.ShowMessage( LParam.Message );
      end );

end;
Mit dieser Konfiguration gab es noch nie Probleme (Toi, Toi, Toi),
und ich kann das nur empfehlen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.007 Beiträge
 
Delphi 12 Athens
 
#7

AW: FMX unbekannten Thread synchronisieren

  Alt 5. Nov 2021, 10:37
Das geht aber auch nur, wenn TMyParameter keine Klasseninstanz ist, die direkt nach dem Aufruf von PressIt freigegeben wird. Auch eine nachträgliche Änderung des Inhalts von Message könnte sich manchmal in der Anzeige wiederfinden.
Zitat von Primož Gabrijelčič:
Parallel programming is hard.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#8

AW: FMX unbekannten Thread synchronisieren

  Alt 5. Nov 2021, 11:06
Ja ein bischen aufpassen muss man schon noch ...
und notfalls einen Clone lokal erzeugen.
Deshalb das auch besser noch mit Interfaces benutzen,
aber ich glaube wir driften schon etwas ab.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: FMX unbekannten Thread synchronisieren

  Alt 5. Nov 2021, 11:51
Jupp, gerade in dem Beispielcode aus Post #6 ist es egal, da LParam und AParam genau gleich behandelt werden.

Aber wie schon genannt, kommt es teilweise auf den jeweiligen Anwendungsfall an, wo die Lösungen auch unterschiedlich ausfallen können.



Beispiel: wieder der Code aus #6, aber mit noch einem CONST am Parameter, welcher zufällig ein Record mit mehr als 8 Byte ist.
Der Speicher, auf welchen AParam zeigt, der könnte bei Aufruf der Funktion bereits verschwunden oder neu befüllt sein.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Nov 2021 um 11:54 Uhr)
  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 23:37 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