![]() |
Re: Thread: Direkt auf die Form zugreifen?
Zitat:
Zitat:
Zitat:
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. |
Re: Thread: Direkt auf die Form zugreifen?
nebenbei bemerkt: Ich hätt da oben ein kleines Problem
|
Re: Thread: Direkt auf die Form zugreifen?
Zitat:
Zitat:
Zitat:
Übrigens: Synchronize() führt den Code im Hauptthread des Prozesses aus (zumindest war dies mindestens bis Delphi 5 so). TThread ist eigentlich relativ ungeeignet für Multithread-Anwendungen. Allerdings ist die VCL mindestens bis Delphi 6 auch nicht multithread-safe gewesen ;) ... die aktuellen Versionen kenne ich nicht. Es gibt ja aber auch noch F1 :lol: |
Re: Thread: Direkt auf die Form zugreifen?
aber ich hab doch nur einen Thread und keine Multi-thread-Anwendung
und wie mach ich das mit der ListView? wie erzeug ich sie wo am besten auf? |
Re: Thread: Direkt auf die Form zugreifen?
Häh? :shock:
Ich sehe doch da ein TThread-abgeleitetes Objekt in deinem Code? Dir ist schon bewußt, daß jeder Prozess mindestens einen (Haupt-)Thread hat? Wieviel hat dein Prozess, wenn du noch einen hinzufügst? Würdest du deine Behauptung, daß 2 Threads nicht multi-threaded sind noch aufrecht erhalten wollen? ;) |
Re: Thread: Direkt auf die Form zugreifen?
ist ja alles schön und recht das mit dem Multi-Threads ja oder nein
aber ich wollt das eigentlich alles ned wissen Ich wollt nur das mit der ListView wissen irgendwie werden gerade zwei themen zusammen geschmissen, die normalerweise zwei (DP-)Threads sind. Bleiben wir bitte nur bei einem Thema - also der ListView |
Re: Thread: Direkt auf die Form zugreifen?
Zitat:
|
Re: Thread: Direkt auf die Form zugreifen?
und wie dann?
der einer sagt: ja, es geht, der andere sagt: nein - zu gefährlich was jetzt? |
Re: Thread: Direkt auf die Form zugreifen?
Zitat:
Also wie ich das verstanden habe, muss man vor dem kritischen Bereich (dem Ändern eines VCL-Objektes) die "critical section" "entern" und danach wieder "leaven". Meine Frage nun: Wenn ich die critical section betrete, woher wissen dann die anderen Threads, welches Objekt sie nicht anfassen dürfen? (Dass die Threads dann komplett stillstehen, kann ja nicht sein) EDIT: Ahhhh verstanden :bounce2: - Wenn ich eine CriticalSection betrete, dann bin nur ich darin und alle, die auch etwas "kritisches" machen wollen, müssen warten. So muss ich überall, wo etwas zusammenhauen könnte, die CriticalSection benutzen. Allerdings kommt mir das etwas.. naja.. ineffektiv vor. Ich muss ja dann auch bei Leseoperationen auf ein Objekt, dass woanders geschrieben werden könnte, eine CriticalSection benutzen - so werden ja auch Leseoperationen serialisiert...muss das sein? EDIT2: Aber das Problem könnte ich ja minimieren, wenn ich für JEDES Objekt eine eigene CriticalSection erstelle. So sitze ich dann zum Schluss vielleicht mit 20 CS rum, aber gehen sollte das. (Gibts eine logische Grenze für CriticalSections?) |
Re: Thread: Direkt auf die Form zugreifen?
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz