Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Multi/Dualthreading - Laufzeit: Strings Thread -> VCL (https://www.delphipraxis.net/110607-multi-dualthreading-laufzeit-strings-thread-vcl.html)

xZise 20. Mär 2008 17:55


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

Apollonius 20. Mär 2008 17:57

Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
 
Ich würde eine Fenster-Nachricht an das Hauptformular schicken.

gsh 20. Mär 2008 18:24

Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
 
ich würde im thread alle 500ms oder 1sec die aktuelle datei ins hauptfomular schreiben

Dax 20. Mär 2008 18:36

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.

xZise 20. Mär 2008 18:40

Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
 
Zitat:

Zitat von Dax
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.

Synkronisiert von der Hauptanwendung auf den Thread zugreifen?

Zitat:

Zitat von Apollonius
Ich würde eine Fenster-Nachricht an das Hauptformular schicken.

Wie macht man das am besten :mrgreen:

Zitat:

Zitat von gsh
ich würde im thread alle 500ms oder 1sec die aktuelle datei ins hauptfomular schreiben

Also eine Prozedur per "Syncronize" aufrufen?
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

Dax 20. Mär 2008 18:49

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;

Apollonius 20. Mär 2008 18:59

Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
 
Ich hoffe, du hast nichts gegen unsaubere Lösungen, die funktionieren...
Delphi-Quellcode:
//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;
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.

@Roter Kasten: Dax, wie langweilig. 8)

Dax 20. Mär 2008 19:01

Re: Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
 
Zitat:

Zitat von Apollonius
@Roter Kasten: Dax, wie langweilig. 8)

Ich werde mich nicht für die korrekte Lösung des Problems entschuldigen ;)

xZise 20. Mär 2008 19:05

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?

Dax 20. Mär 2008 19:09

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:

Zitat von xZise
PS: Meine Hilfe funktioniert gerade nicht: Welche Unit ist CriticalSection?

SyncObjs glaub ich heisst die...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz