AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Synchronize oder ForceQueue ohne Messages

Ein Thema von QuickAndDirty · begonnen am 17. Jun 2021 · letzter Beitrag vom 18. Jun 2021
Antwort Antwort
QuickAndDirty

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

Synchronize oder ForceQueue ohne Messages

  Alt 17. Jun 2021, 15:57
Aus reiner Neugierde:
Gibt es ein Synchronize oder ForceQueue das nicht das Message System (Sendmessage, Postmessage) der Anwendung benutzt?
Es geht mir darum Deadlocks durch TCriticalSection in Kombination mit Synchronize zu vermeiden.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Synchronize oder ForceQueue ohne Messages

  Alt 17. Jun 2021, 18:24
Egal ob es was Anderes gäbe, das ist vollkommen egal.

Synchronize/Queue nutzt man, um den Code im Hauptthread auszuführen.
Und egal wann/wie/wo das gemacht wird ... wenn durch irgendwas der Hauptthread hängt war's das.


Repariere die Straße (das, was den Deadlock verursacht), anstatt nur ein anderes Fahrzeug (Synchro/Queue oder sonstwas) benutzen zu wollen.
Mit einem Boller auf der Staße kommt weder Trabbi noch Porsche durch.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
QuickAndDirty

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

AW: Synchronize oder ForceQueue ohne Messages

  Alt 18. Jun 2021, 10:21
Naja ich habe keinen deadlock.
Aber um den Singlethread Zugriff sicherzutsellen, habe ich alle Datenbankzugriffe (SQLITE) in einer TCriticalsection eingerahmt.
Wie es scheint kommt es auch immer nur zu zugriffen aus einem einzigen thread heraus zur selben zeit aber naturlich aus verschiedenen anonymen threads wenn es länger dauert.
In der Zeit(wenn es länger dauert) sperre ich die Oberfläche mit nem halbdurchsichtigen Lockscreen mit Fortschrittsanzeige.
So das auch wirklich kaum weitere Ereignisse auf der Oberfläche ausgelöst werden können die wieder so eine Datenbank interaktion auslösen.

Außer timer, Application Lifecycleevents und NFC-Events.

So wie ich das verstanden habe ist der einzige Teil der im Hauptthread ständig so ne Art Spinwait durchführt die MessageQueue. Deswegen arbeiten Synchronize und ForceQueue wohl auch mit Messages um dem Hauptthread zu sagen das was ausgeführt werden soll, wenn er mal wieder dran ist.
Ist das wirklich die einzige Möglichkeit?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty (18. Jun 2021 um 10:27 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 05:59 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