Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Synchronisieren von hauptthread und Teilthread

  Alt 10. Mär 2008, 09:41
Zitat von zorro08:
Ich habe versucht, den Code in der Timerroutine bzw. beim Aufbau der Anzeige des Hauptthreads mit CriticalSection.enter / Leave solange auszusperren, bis der thread_a mit der Berechnung fertig ist.
Ist (neben dem Syncronize aus der VCL) die einfachste Variante und sollte zuverlässig funktionieren, solange man überall dasselbe Handle verwendet.
Zitat von zorro08:
Aber dies klappt offensichtlich nicht. Der Code im Hauptthread hinter dem "cs.enter" wurde immer ausgeführt. Darin besteht mein Problem.
hmmm, da hst du etwas falsch gemacht.

Zitat von zorro08:
o Im Hauptthread kann man mehrmals dasselbe criticalSection.enter aufrufen.
Jep, da wird nur ein Zähler hochgezählt, deswegen immer in einen finally-Block um das "leave" setzen.
Zitat von zorro08:
o Der thread_a bleibt beim ersten cs.enter stehen und läuft beim nächsten cs.Leave aus dem Hauptthread wieder weiter.
Wenn der Zähler wieder bei 0 ist.
Zitat von zorro08:
o N x cs.enter erfordern auch N x cs.leave, damit thread_a wieder läuft
Ja, Windows kann ja nicht erraten, was es sonst machen sollte.
Zitat von zorro08:
o Es gibt einen Totalstillstand, wenn zuerst cs.leave ohne vorheriges cs.enter aufgerufen wird
Aha! Sowas macht man aber auch nicht. Du sollst ja die Abschnitte auch so kurz wie möglich halten. Und das sollte man überblicken.


Zitat von zorro08:
1. Das Sperren des Hauptthreads klappt mit WaitForSingleObject(Event_0,INFINITE). Und zwar so gut, dass er bei falscher Anwendung niemals wieder ans Laufen kommt.
Sowas schafft man mit allen Syncro-möglichkeiten. Deswegen ist es eben günstiger die Schnittstelle so dünn wie möglich zu machen, und eben am besten gar kein Datenaustausch während der Threadabarbeitung zu machen. Ansonsten möglichst nur eine Syncronisationsart wählen.

Zitat von zorro08:
a) Entweder wurde nicht organisiert, dass mindestens ein Event, z.B. von einem Thread, kommt.
Verstehe ich nicht.
Zitat von zorro08:
b) Oder mitten in die TimerRoutine platzt dann ein BtnClickEvent, ...
Wie machst du denn das? Wenn beide Ereignisse im selben Thread laufen, dann wird doch der Timer nicht vom Button unterbrochen.

Zitat von zorro08:
Die (für mich) richtige Anwendung wäre:
...
Es gibt viele schöne Konzepte. Hier kommt es sehr stark auf den Anwendungsfall an, welches am günstigsten ist.



Zitat von zorro08:
o Der Thread führt diese Routine per Synchronize() aus.
In deinem Codebeispiel (vor allem mit mehren Threads) komme ich nicht ganz mit. Aber egal. Aber du mischst hier zwei Syncronisationsmethoden. Achte darauf, dass die eine vollständig abgeschlossen ist, bevor die nächste startet.



Noch kurz was zum Code:
Delphi-Quellcode:
while TRUE do
  begin
    sleep(1);

    if Terminated then
    begin //warum hier ein begin-end-Block?
      exit
    end
Das geht doch insgesamt auch mit (vorrausgesetzt die Reihenfolge mit dem sleep ist unwichtig)
Delphi-Quellcode:
while not terminated do
  begin
    sleep(1);
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat