Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Datei in eigenem Thread schreiben (https://www.delphipraxis.net/164786-datei-eigenem-thread-schreiben.html)

iphi 29. Nov 2011 19:38

Datei in eigenem Thread schreiben
 
Hallo,

da ich nicht sehr erfahren mit Multithreading bin, möchte ich sicherheitshalber noch mal nachfragen:

Ich möchte ein Datenfile von einem eigenen Threadobjekt schreiben lassen, um das Hauptprogramm nicht aufzuhalten.

Ist es sicher, mit assignfile, rewrite und writeln von einem TThread-Objekt aus in ein Textfile zu schreiben, wenn sichergestellt ist, dass nur dieser eine Thread auf das entsprechende File zugreift?

Bummi 29. Nov 2011 20:08

AW: Datei in eigenem Thread schreiben
 
mir ist nichts gegenteiliges bekannt, verbindlich kann ich es Dir für Streams sagen, die ich ohnehin bevorzugen würde.

Sir Rufo 29. Nov 2011 20:32

AW: Datei in eigenem Thread schreiben
 
Zitat:

Zitat von Bummi (Beitrag 1138487)
mir ist nichts gegenteiliges bekannt, verbindlich kann ich es Dir für Streams sagen, die ich ohnehin bevorzugen würde.

Das muss gehen, denn jede Anwendung arbeitet in einem Thread (MainThread).

Problematisch wird es ja nur, wenn mehr als ein Thread auf die gleiche Datei zugreifen möchte.
Die Zugriffsart (Streams, AssignFile,...) spielt da auch keine Rolle.

Wenn 2 und mehr Threads auf ein und dieselbe Ressource zugreifen möchten (lesend/schreibend) dann muss dieser Zugriff geregelt werden (Locks/CriticalSection/Mutex/...)

himitsu 29. Nov 2011 21:05

AW: Datei in eigenem Thread schreiben
 
Zitat:

Zitat von Sir Rufo (Beitrag 1138491)
Problematisch wird es ja nur, wenn mehr als ein Thread auf die gleiche Datei zugreifen möchte.
Die Zugriffsart (Streams, AssignFile,...) spielt da auch keine Rolle.

Wenn 2 und mehr Threads auf ein und dieselbe Ressource zugreifen möchten (lesend/schreibend) dann muss dieser Zugriff geregelt werden (Locks/CriticalSection/Mutex/...)

Das gilt nicht nur für das Ziel (die Datei), sondern auch für die Quelle, also das wo du die Daten herholst, welche in die Datei rein sollen.

Sir Rufo 29. Nov 2011 21:15

AW: Datei in eigenem Thread schreiben
 
Zitat:

Zitat von himitsu (Beitrag 1138493)
Zitat:

Zitat von Sir Rufo (Beitrag 1138491)
Problematisch wird es ja nur, wenn mehr als ein Thread auf die gleiche Datei zugreifen möchte.
Die Zugriffsart (Streams, AssignFile,...) spielt da auch keine Rolle.

Wenn 2 und mehr Threads auf ein und dieselbe Ressource zugreifen möchten (lesend/schreibend) dann muss dieser Zugriff geregelt werden (Locks/CriticalSection/Mutex/...)

Das gilt nicht nur für das Ziel (die Datei), sondern auch für die Quelle, also das wo du die Daten herholst, welche in die Datei rein sollen.

ist die Quelle nicht auch eine Ressource? ;)
Allgemeiner kann ich das nicht schreiben :mrgreen:

himitsu 29. Nov 2011 21:55

AW: Datei in eigenem Thread schreiben
 
Jupp, drum nochmal erwähnt, nicht daß er nur auf die Datei achtet und die ander Seite übersieht :angle:

iphi 30. Nov 2011 05:04

AW: Datei in eigenem Thread schreiben
 
Danke für die Hinweise. Dann liege ich ja nicht so falsch mit meiner Denke.

Zur Quelle (guter Punkt!!):

Ich habe vor, die Quelldaten in MyThread.Create in ein Thread-eigenes Feld zu kopieren.

Bleibt der Hauptthread während MyThread.Create stehen (in dem Falle würde ich in MyThread.Create keine critical sections benötigen) oder kann es passieren, dass der VCL Hauptthread schon weiterläuft, bevor MyThread.Create vollständig abgearbeitet ist?

Nersgatt 30. Nov 2011 06:13

AW: Datei in eigenem Thread schreiben
 
Der Thread wird erst gestartet, wenn Du myThread.Start aufrufst. Daher kannst Du einfach die Instanz der Threadklasse erstellen, die Daten die der Thread für seine Arbeit braucht über Properties mitgeben und dann erst den Thread starten.

Sir Rufo 30. Nov 2011 07:34

AW: Datei in eigenem Thread schreiben
 
Zitat:

Zitat von Nersgatt (Beitrag 1138518)
Der Thread wird erst gestartet, wenn Du myThread.Start aufrufst. Daher kannst Du einfach die Instanz der Threadklasse erstellen, die Daten die der Thread für seine Arbeit braucht über Properties mitgeben und dann erst den Thread starten.

Diese Aussage trifft nur für den Fall zu, wenn der Thread mit
Delphi-Quellcode:
CreateSuspended = True
erzeugt wird - und bei Delphi 6 wird der Thread dann mit
Delphi-Quellcode:
Resume
angestossen (IMHO gibt es da noch kein
Delphi-Quellcode:
Start
).

Wir haben hier aber eh einen anderen Ansatz:
Delphi-Quellcode:
type
  TMyThread = class( TThread )
  private
    fSource : TMySource;
  public
    constructor Create( CreateSuspended : Boolean; ASource : TMySource );
  end;

constructor TMyThread.Create;
begin
  fSource := ASource;
  inherited Create( CreateSuspended );
end;
Generell ist hierbei zu sagen, dass jeder Zugriff immer im Thread-Kontext des Aufrufers erfolgt.

Wird also vom MainThread aus
Delphi-Quellcode:
TMyThread.Create
aufgerufen, so wird dieses auch komplett im Thread-Kontext des MainThreads ausgeführt.

Also die direkte Übergabe als Parameter in TThread.Create ist also erst mal safe.

Ein kleines Problemen bleibt aber :)

Wenn man dem Thread ein Objekt übergibt, dann könnte dieses Objekt ja im MainThread (oder auch irgendeinem anderen Thread) verändert werden (bis hin zum Free). Aus diesem Grund würde es im Allgemeinen schon sinnvoll sein, das der Thread sich eine Kopie anlegt oder auch eine Kopie erhält.

himitsu 30. Nov 2011 18:07

AW: Datei in eigenem Thread schreiben
 
Wärend des Create bleibt der noch stehen, auch wenn Suspended = False wäre-
Er wird er nach dem Create erstellt.

Also, die schon genannten Parameter im Constructor, bzw. bis zum Resume/Start, wären threadsave.
Ob die Parameter nach der Übergabe threadsave sind, ist damit aber nicht gesagt, denn das hängt von den Parametern, bzw. ihren Inhalten ab, wie z.B. Objektzeiger und alles, was nicht direkt/komplett kopiert wird, bzw. welches nicht entsprechend abgesichert wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 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