![]() |
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:
Programm A empfängt den Dateinamen, übergibt diesen an den neu erzeugten Thread und wartet dann so lange,
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; 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:
Ich habe jetzt zwei Fragen:
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; 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 |
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.
|
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