![]() |
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? |
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.
|
AW: Datei in eigenem Thread schreiben
Zitat:
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/...) |
AW: Datei in eigenem Thread schreiben
Zitat:
|
AW: Datei in eigenem Thread schreiben
Zitat:
Allgemeiner kann ich das nicht schreiben :mrgreen: |
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:
|
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? |
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.
|
AW: Datei in eigenem Thread schreiben
Zitat:
Delphi-Quellcode:
erzeugt wird - und bei Delphi 6 wird der Thread dann mit
CreateSuspended = True
Delphi-Quellcode:
angestossen (IMHO gibt es da noch kein
Resume
Delphi-Quellcode:
).
Start
Wir haben hier aber eh einen anderen Ansatz:
Delphi-Quellcode:
Generell ist hierbei zu sagen, dass jeder Zugriff immer im Thread-Kontext des Aufrufers erfolgt.
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; Wird also vom MainThread aus
Delphi-Quellcode:
aufgerufen, so wird dieses auch komplett im Thread-Kontext des MainThreads ausgeführt.
TMyThread.Create
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. |
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 06:33 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