Zitat von
Michael_Bayer:
Hmm..würde das so funktionieren, dass ich ein globales Array aufbaue und dem Thread mitgebe, er soll in Array[1] die Lösung stecken, wenn er fertig ist?
Ja, aber nicht ohne Exclusion-Objects (s.o.). Bzw. wenn es ein Integerarray ist, kannst du die Interlocked*-Funktionen verwenden.
Zitat von
Michael_Bayer:
Oder nochbesser: Kann ich dem Thread sagen, es soll die Lösung in eine Procedure als Parameter übergeben, und die Procedure ändert dann die
VCL?
Da du diese Prozedur ja vom 2. Thread aus aufzurufen scheinst kann das keine Lösung sein. Denn die Prozedur läuft dann im Kontext dieses Threads.
Zitat von
Michael_Bayer:
Oder muss ich das so machen, dass ich eine globale Variable Editable mache, die ich auf false setze, wenn ein Thread gerade ein
VCL-Element ändert?
Selbst das ist nur mit Interlocked*-Funktionen sicher, da ansonsten ein Thread die Variable auslesen könnte, obwohl du in einem anderen schon "Bla := False" gesagt hast. Wohlgemerkt, das ist hypothetisch (in der Praxis wird es auf einem Uniprocessor-System quasi nie zu Problemen kommen).
Versuchen wir mal die Vorstellungskraft zu forcieren (ein besseres Beispiel fiel mir nicht ein):
Stell dir den Code (jede Seite ein Zeitscheibenintervall ausgeführten Codes) als ein Buch vor und die Daten (jede Seite eine beliebige komplexe Datenstruktur - eine Datenstruktur kann natürlich auch mehrere Seiten umfassen) als ein anderes.
Hast du einen Prozessor, so kann im Codebuch nur eine Seite gleichzeitig aufgeschlagen sein. Bei mehreren Prozessoren entspricht die maximale Anzahl gleichzeitig aufgeschlagener ("ausgeführter") Seiten der Anzahl Prozessoren. Nun ist es so, daß in dem Datenbuch auch mehrere Seiten existieren. Eine Seite stellt dabei eine komplexe Datenstruktur dar.
Da wir aber mit mehreren parallelen oder quasi-parallelen Threads arbeiten, kann es passieren, das Thread#1 auf Seite#1 schreibt. Nun sagt das Zeitscheibenprinzip, daß Thread#1 irgendwann eingefroren wird und Thread#2 an der Reihe ist. Leider passiert aber das Einfrieren, während Thread#1 nur etwa 1/3 der Seite#1 geschrieben hat. Thread#2 ist nun also an der Reihe. Da Thread#2 auch an Seite#1 interessiert ist, versucht es dorthin zu schreiben - natürlich vom Anfang der Seite#1. Da Thread#2 etwas optimaler kodiert ist, kann Thread#2 vor dem Einfrieren ganze 50% der Datenstruktur schreiben. Nun ist Thread#3 an der Stelle, welcher die Daten aus Seite#1 gern auslesen möchte. Tut er auch. Nun die Quizfrage: was steht auf Seite#1? Was steht nach einem 2ten Durchgang auf Seite#1? Ist dies das gewünschte Verhalten?
Nun kannst du dir ein Ausschlußobjekt so vorstellen, daß Thread#2 und #3 zwar an die Reihe kommen, jedoch sehen, daß Seite#1 gerade beschrieben wird. Deshalb warten Sie weiter und geben die Kontrolle direkt wieder ab. Statt Threads kannst du auch Prozesse annehmen und statt einer Buchseite eine einzelne Datei - aber bei Dateien gibt es andere Ausschlußmechanismen.