AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datei in eigenem Thread schreiben

Ein Thema von iphi · begonnen am 29. Nov 2011 · letzter Beitrag vom 30. Nov 2011
Antwort Antwort
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#1

Datei in eigenem Thread schreiben

  Alt 29. Nov 2011, 20:38
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?
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Datei in eigenem Thread schreiben

  Alt 29. Nov 2011, 21:08
mir ist nichts gegenteiliges bekannt, verbindlich kann ich es Dir für Streams sagen, die ich ohnehin bevorzugen würde.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Datei in eigenem Thread schreiben

  Alt 29. Nov 2011, 21:32
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/...)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Datei in eigenem Thread schreiben

  Alt 29. Nov 2011, 22:05
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Datei in eigenem Thread schreiben

  Alt 29. Nov 2011, 22:15
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Datei in eigenem Thread schreiben

  Alt 29. Nov 2011, 22:55
Jupp, drum nochmal erwähnt, nicht daß er nur auf die Datei achtet und die ander Seite übersieht
$2B or not $2B
  Mit Zitat antworten Zitat
iphi

Registriert seit: 13. Feb 2009
262 Beiträge
 
Delphi 7 Personal
 
#7

AW: Datei in eigenem Thread schreiben

  Alt 30. Nov 2011, 06:04
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?
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: Datei in eigenem Thread schreiben

  Alt 30. Nov 2011, 07:13
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.
Jens
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Datei in eigenem Thread schreiben

  Alt 30. Nov 2011, 08:34
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 CreateSuspended = True erzeugt wird - und bei Delphi 6 wird der Thread dann mit Resume angestossen (IMHO gibt es da noch kein 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 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Datei in eigenem Thread schreiben

  Alt 30. Nov 2011, 19:07
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:27 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