![]() |
Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
Hallo DP,
ich habe eine Anwendung geschrieben die Ordner durchsucht. Auf einen Mehrkerner, ohne Multi-/Dualthreading, muss ich jedes mal "Application.ProcessMessages" aufrufen, damit der Benutzer den Vorgang abbrechen kann. Soweit geht das, aber wenn ich (für Testzwecke), alles rausnehme, wass Parallelisiert werden könnte, dann habe ich immerhin fast eine halbierung der Dauer. Also möchte ich gerne einen zweiten Thread erstellen, der den Ordner durchsucht. An sich kein Problem, außer das ich gerne im Hauptfenster die aktuelle Datei anzeigen möchte, die er einliest. Und deshalb müsste ich einen String von dem Thread zum Fenster schicken. Um aber da nicht so viel Zeit zu vergeuden (^^), möchte ich das möglichst effizient machen, so dass er nur Anhält zum reinschreiben. Wie würdet ihr das realisieren? MfG xZise |
Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
Ich würde eine Fenster-Nachricht an das Hauptformular schicken.
|
Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
ich würde im thread alle 500ms oder 1sec die aktuelle datei ins hauptfomular schreiben
|
Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
Ein Feld in der Thread-Klasse, auf das synchronisiert zugegriffen wird und alle x Sekunden vom Hauptform per Timer ausgegeben wird wäre wahrscheinlich die sauberste Lösung.
|
Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
Zitat:
Zitat:
Zitat:
Hätte dann aber eine zirkuläre Referenz ... Oder nicht? Und ich finde zirkuläre Refernzen sollte man vermeiden, oder denke ich da falsch? MfG xZise |
Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
Delphi-Quellcode:
type
TMyThread = class(TThread) private fCS: TCriticalSection; fFile: String; function GetFile: String; procedure SetFile(file: String); public property File: String read GetFile; procedure FindFiles; end; function TMyThread.GetFile: String; begin fCS.Enter; Result := fFile; fCS.Leave; end; procedure TMyThread.SetFile(file: String); begin fCS.Enter; fFile := file; fCS.Leave; end; property TMyThread.FindFiles; begin ... SetFile(currentFile); ... end; |
Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
Ich hoffe, du hast nichts gegen unsaubere Lösungen, die funktionieren...
Delphi-Quellcode:
Diese Technik hat den Vorteil, dass deine Thread-Funktion fast überhaupt nicht aufgehalten wird. Wenn dir Sauberkeit wichtig ist, kannst du auch SendMessage verwenden und brauchst dann die Referenzzählung nicht zu manipulieren.
//In der Thread-Funktion:
String(PointerVar) := StringVar; //Referenzzähler erhöhen - unser String darf nicht gelöscht werden! PointerVar := nil; PostMessage(Form1.Handle, WM_MYMESSAGE, 0, Integer(StringVar)); //Im Formular: procedure TForm1.RecvMyMessage(var Message: TMessage); var Lok: string; begin Pointer(Lok) := Pointer(Message.LParam); //Referenzzähler nicht erhöhen, das ist in der Thread-Funktion getan worden Label1.Caption := Lok; //Referenzzähler wird automatisch dekrementiert end; @Roter Kasten: Dax, wie langweilig. 8) |
Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
Zitat:
|
Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
Also ich wäre dann aber eher für saubere Programmierung ;)
Kann die CriticalSection mir dann auch sagen, ob ich überhaupt entern dürfte? Also ich lese gerade die Daten aus, dass ich gucke: Kann ich rein? Wenn nein, dann setze ich Files nicht neu, und mache weiter, ansonsten, setzte File und mache weiter. Ansonsten bleibt er aufrufende Thread im ".Enter" hängen oder? MfG xZise PS: Meine Hilfe funktioniert gerade nicht: Welche Unit ist CriticalSection? |
Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
Genau das ist der Sinn der Critical Sections: man kommt erst dann rein, wenn alle anderen draussen sind - in der Zwischenzeit wartet man darauf, reinzukommen. Bei meinem Beispiel sind die Zeiten innerhalb der CS allerdings so kurz, dass man sich darum keine Gedanken machen muss :)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 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 by Thomas Breitkreuz