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