Einzelnen Beitrag anzeigen

Ironarrow

Registriert seit: 23. Mär 2004
Ort: Kerpen
16 Beiträge
 
Delphi 7 Professional
 
#1

Probleme mit String-Deklarationen in Threads

  Alt 6. Apr 2004, 12:53
Hallo zusammen.

Ich bin zwar kein Anfänger im Bereich Delphi-Programmierung, jedoch beabsichtige ich in einem Programm nun
Threads zu verwenden und habe das bisher noch nie gemacht.

Kurz eine Erläuterung was ich vorhabe:

Programm A bekommt über TCP/IP einen Dateinamen XY genannt, worauf hin die Programm diese Datei
abarbeiten soll. Für die Abarbeitung dieser Datei wird ein Programm B mit der Datei XY als
Parameter gestartet. (WinExecAndWait)

Treffen nun mehrere Anfragen zeitgleich ein, so wird durch die Verwendung von WinExecAndWait
immer eine Datei nach der anderen abgearbeitet. Ziel ist es jedoch mehrere Dateien "parallel"
zu bearbeiten.

Daher soll der Aufruf von Programm B in einem Thread erfolgen.

Hier das Ereigniss der TCP-IP Serve-Komponente innerhalb von Programm A.

Delphi-Quellcode:
procedure Tfrm_startup.TCP_ServerData(Sender: TObject; Socket: Integer);
  var
   ScreenDatei   : String;
   AWThread   : TAWThread;

  begin
   ScreenDatei := TCP_Server.Read(Socket);   // Dateiname empfangen
   AWThread.Create(Screendatei,tpNormal);   // Auswertung starten

   while not AWThread.Terminated do
      Application.ProcessMessages;

   AWThread.Free;

   TCP_Server.Write(Socket, 'Fertig' + Chr(0));   { Dateiname zurücksenden incl. End-Zeichen #0 }
  end;
Programm A empfängt den Dateinamen, übergibt diesen an den neu erzeugten Thread und wartet dann so lange,
bis der Thread fertig ist. Anschließend wird der Text "Fertig" zurück über TCP-IP gesendet, um zu signalisieren,
dass die Datei XY abgearbeitet wurde.

Der Thread sieht jetzt wie folgt aus:

Delphi-Quellcode:
interface

uses
  Classes, Windows;

type
   TAWThread = class (TThread)
   private
      FDateiname   : String;
   protected
      Terminated : boolean;
      procedure Execute; override;
   public
      constructor Create(Dateiname : String; ThreadPriority: TThreadPriority);
   end;

implementation

uses
  IniFiles, NameDev, Type_Dev, Global ;

constructor TAWThread.Create(Dateiname : String; ThreadPriority: TThreadPriority);
  begin
   inherited Create(False);      { Thread als aktiv und nicht als Suspended starten }
   Priority := ThreadPriority;
   Terminated := False;      { Thread wurde beendet }
(1)   FDateiname := Dateiname;
  end;

procedure TAWThread.Execute;
  var
   IniFile   : TIniFile;
   sProgDir   : String;
   sProg   : String;

  begin
//.....
//..... INI-Dateien lesen und Strings aufbereiten

   WinExecAndWait(sProgDir + sProg, SW_SHOWMAXIMIZED);   { Datei abrarbeiten }
   Terminate;               { Thread beenden }
   Terminated := True;            { Thread wurde beendet }
  end;
Ich habe jetzt zwei Fragen:
Zum einen: Warum kann ich bekomme ich immer eine Zugriffsverletzung beim Befehl (1) (String-Zuweisung)
Zum anderen: Ist der Rest des Programms richtig ??

Ich meine: Wird der Programmteil Executed automatisch nach dem Create aufgerufen ?? Und ist die Art und Weise
wie ich versuche Festzustellen, ob der Thread durchlaufen ist, richtig ??

Ich hoffe, ich habe mein Problem halbwegs nachvollziehbar erklärt und Ihr könnt mir helfen.

Vielen Dank schon mal.

mfg.

Rainer
  Mit Zitat antworten Zitat