AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Multi/Dualthreading - Laufzeit: Strings Thread -> VCL
Thema durchsuchen
Ansicht
Themen-Optionen

Multi/Dualthreading - Laufzeit: Strings Thread -> VCL

Ein Thema von xZise · begonnen am 20. Mär 2008 · letzter Beitrag vom 20. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

Multi/Dualthreading - Laufzeit: Strings Thread -> VCL

  Alt 20. Mär 2008, 17:55
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

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

  Alt 20. Mär 2008, 17:57
Ich würde eine Fenster-Nachricht an das Hauptformular schicken.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#3

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

  Alt 20. Mär 2008, 18:24
ich würde im thread alle 500ms oder 1sec die aktuelle datei ins hauptfomular schreiben
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

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

  Alt 20. Mär 2008, 18:36
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.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#5

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

  Alt 20. Mär 2008, 18:40
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 von Apollonius:
Ich würde eine Fenster-Nachricht an das Hauptformular schicken.
Wie macht man das am besten

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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

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

  Alt 20. Mär 2008, 18:49
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;
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

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

  Alt 20. Mär 2008, 18:59
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)
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#8

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

  Alt 20. Mär 2008, 19:01
Zitat von Apollonius:
@Roter Kasten: Dax, wie langweilig. 8)
Ich werde mich nicht für die korrekte Lösung des Problems entschuldigen
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

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

  Alt 20. Mär 2008, 19:05
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?
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#10

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

  Alt 20. Mär 2008, 19:09
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 von xZise:
PS: Meine Hilfe funktioniert gerade nicht: Welche Unit ist CriticalSection?
SyncObjs glaub ich heisst die...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 Uhr.
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