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.