Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit String-Deklarationen in Threads (https://www.delphipraxis.net/19639-probleme-mit-string-deklarationen-threads.html)

Ironarrow 6. Apr 2004 12:53


Probleme mit String-Deklarationen in Threads
 
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

Luckie 6. Apr 2004 12:57

Re: Newbie versucht sich an Threads
 
Was soll denn das jetzt? Du hast doch schon einen Thread mit identischen Topic aufgemacht. Bitte bennen um und gib ihnen sinnvolle Titel. Danke.

Ironarrow 6. Apr 2004 13:13

Re: Probleme mit String-Deklarationen in Threads
 
Sorry Lucky.

Habe ausversehen bei der Eingabe Alt + S gedrückt gehabt. Die ESC-Taste kam wohl auch zu spät.

Habe mir Dein Tutorial schon heruntergeladen und lasse es gerade ausdrucken.

Ich weiß aber (noch) nicht, ob es mir bei meinem Problem helfen wird.

I hope so.

Gruß,

Rainer


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