Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Threads / Synchronize - zeitkritisch? (https://www.delphipraxis.net/9042-threads-synchronize-zeitkritisch.html)

APP 17. Sep 2003 11:03


Threads / Synchronize - zeitkritisch?
 
Hallo,


ich habe eine Verständnisfrage :shock: :


Folgendes Problem:

Code:
THREAD (WatchDir)   // überwache LW mit ReadDirectoryChangesW
        |
        |
  z.B. |
  wenn n=1 dann,     // n = Anzahl der Zeilen in Liste
  Synchronize(Liste) // Änderungen am LW werden in Liste geschrieben,
                      // nach n Änderungen wird Liste an MainThread übergeben

Code:
MainThread (Hauptprogramm) // von hier aus wird auch Thread (WatchDir) gestartet
        |
        |
        |
  Ändere(Liste)          // Liste wird verarbeitet, z.B. mit AVL-Tree verglichen
                          // und weggespeichert
Meine Frage ist nun, was passiert, wenn z.B. n=1 ist und diese eine Zeile der
Liste an den MainThread weitergegeben wird.

Was geschieht, wenn die Verarbeitung der Liste [Ändere(Liste)] länger dauert,
und inzwischen vom Thread eine neue Listen-Änderung kommt. Geht diese Änderung nun
verloren, oder übernimmt das MessageSystem von Windows die korrekte Abwicklung?

Falls das MessageSystem die korr. Abwicklung übernimmt, gibt es mögliche Grenzen?

Mit anderen Worten, ist das Ändere(Liste) zeitkritisch, oder kann ich noch einen
Suchbaum bearbeiten und die Daten wegspeichern?

neolithos 17. Sep 2003 11:08

Re: Threads / Synchronize - zeitkritisch?
 
Synchronize verwendet PostMessage und solange wie du keine Nachrichten wärend der Änderungen abfragst geht es seinen gang.

APP 17. Sep 2003 11:40

Re: Threads / Synchronize - zeitkritisch?
 
Hallo neolithos,

Zitat:

Zitat von neolithos
Synchronize verwendet PostMessage und solange wie du keine Nachrichten wärend der Änderungen abfragst ...

meinst Du mit "Nachrichten", die Messageque von Windows?

Ich möchte schon, dass mein Thread per PostMessage() etwas (anderes)
an einen anderen Thread versendet.

Kann es nicht außerdem sein, dass div. Kompos nicht auch Nachrichten mit PostMessage() senden/empfangen?


Zitat:

Zitat von neolithos
...geht es seinen gang.

Gibt es Grenzen, z.B. ein Timeout, wenn "etwas zu Lange dauert"?

neolithos 17. Sep 2003 11:43

Re: Threads / Synchronize - zeitkritisch?
 
Zitat:

Zitat von APP
Hallo neolithos,

Zitat:

Zitat von neolithos
Synchronize verwendet PostMessage und solange wie du keine Nachrichten wärend der Änderungen abfragst ...

meinst Du mit "Nachrichten", die Messageque von Windows?

Ja!

Zitat:

Zitat von APP
Gibt es Grenzen, z.B. ein Timeout, wenn "etwas zu Lange dauert"?

Es gibt kein TimeOut da PostMessage die Nachricht hinten an stellt und das wars auch schon.

APP 17. Sep 2003 11:49

Re: Threads / Synchronize - zeitkritisch?
 
Hallo neolithos,

vielen Dank für Deine Antworten und Deine Geduld, aber eine Frage hätte ich noch :mrgreen: :
Zitat:

solange wie du keine Nachrichten wärend der Änderungen abfragst
bedeutet das, dass wenn mein Thread per PostMessage() etwas (anderes)
an einen anderen Thread versendet dann die MessageQue "zerstört" wird?.

neolithos 17. Sep 2003 11:53

Re: Threads / Synchronize - zeitkritisch?
 
Nein!

Ich meinte damit:
Du darfst nicht in der Änderungsroutine Nachrichten von der Messageque abholen, solange deine Änderung erfolgt. Sonsts könnte es probleme geben, da schon wieder Änderung aufgerufen wird obwohl die erste noch nicht abgeschlossen.

APP 17. Sep 2003 12:12

Re: Threads / Synchronize - zeitkritisch?
 
Vielen Dank neolithos,

ich glaube, jetzt hab ich es *fast* begriffen! :cry:

1) Solange ich in meiner Änderungsroutine die Liste abarbeite, wird sie
nicht vom Thread nicht verändert (auch wenn schon wieder neue Daten
da sind), erst wenn ich fertig, bin wird die Liste neu gefüllt?

2) Oder muß ich nun die Liste in der Änderungsroutine Locken
(CriticalSection, TThreadList,...), damit sie verarbeitet werden kann, ohne das der
Thread zwischenfunkt?
Und wenn ich sie Unlocke wird das, was in der MessageQue steht
weiterverarbeitet und meine List gegebenenfalls neubefüllt.

p.s.
Nach mehrmaligen durchlesen denke ich die 2. Annahme stimmt eher ....

neolithos 17. Sep 2003 12:53

Re: Threads / Synchronize - zeitkritisch?
 
Das hängt von den Zugriffen der Daten ab. Änders du die Daten nur im Hauptthread oder auch im anderen Thread.


Nur Hauptthread:
Locken ist unnötig.

beim zweiten fall kann man sich Synchronize sparen und nur mit dem Locken arbeiten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 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