Ich habe gerade angefangen mit Threads zu arbeiten, benutze das onexecute Event mit Delphi 2009, indy IdTCPServer1. Ich habe eine sehr einfache Anwendung zum Testen geschrieben und erhalte eine Zugriffsverletzung beim Beenden. Die Anwendung läuft gut und macht alles, was ich will, aber ich denke, dass ich "Threads läuft" beim Beenden lassen werde. Ich habe keine Erfahrung mit Threads, also würde jede Hilfe geschätzt werden.Delphi 2009, IDTCPServer1 Zugriffsverletzung beim Beenden
Heres mein Code
unit FT_Communicator_pas;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp, IdContext, IdTCPServer,
INIFiles, ExtCtrls, ComCtrls, adscnnct,
DB, adsdata, adsfunc, adstable, Wwdatsrc, Grids, Wwdbigrd, Wwdbgrid,
IdBaseComponent, IdComponent, IdCustomTCPServer;
type
TfrmMain = class(TForm)
IdTCPServer1: TIdTCPServer;
PgMain: TPageControl;
TsMain: TTabSheet;
tsConfig: TTabSheet;
Label1: TLabel;
Label2: TLabel;
txtServer: TEdit;
txtPort: TEdit;
Panel1: TPanel;
Panel3: TPanel;
tsLog: TTabSheet;
mnolog: TMemo;
Button1: TButton;
Button3: TButton;
procedure IdTCPServer1Connect(AContext: TIdContext);
procedure IdTCPServer1Execute(AContext: TIdContext);
procedure Button3Click(Sender: TObject);
procedure IdTCPServer1Disconnect(AContext: TIdContext);
procedure Logit(const Logstr: String);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.Button1Click(Sender: TObject);
begin
IdTCPServer1.Active:=FALSE;
application.Terminate;
end;
procedure TfrmMain.Button3Click(Sender: TObject);
begin
IdTCPServer1.Active:=true;
end;
procedure TfrmMain.FormShow(Sender: TObject);
begin
PgMain.ActivePage:=tsMain;
EnableMenuItem(GetSystemMenu(handle, False),SC_CLOSE, MF_BYCOMMAND or MF_GRAYED);
end;
procedure TfrmMain.IdTCPServer1Connect(AContext: TIdContext);
begin
mnoLog.lines.Add ('Connected from: ' + AContext.Connection.Socket.Binding.PeerIP);
end;
procedure TfrmMain.IdTCPServer1Disconnect(AContext: TIdContext);
begin
mnoLog.lines.Add ('Disconnected from: ' + AContext.Connection.Socket.Binding.PeerIP);
end;
procedure TfrmMain.IdTCPServer1Execute(AContext: TIdContext);
var
myReadln,mySendln,sqlqry:string;
begin
sleep(10);
myReadln:=AContext.Connection.IOHandler.ReadLn();
mnolog.Lines.Add(AContext.Connection.Socket.Binding.PeerIP + '>' + myReadln);
mySendln:= AContext.Connection.Socket.Binding.PeerIP + ' Sent me ' + myReadln;
AContext.Connection.IOHandler.WriteLn(mySendln);
try
except
on E:Exception do
begin
logit('Error occured During execute function ' + #13#10 + e.message);
end;
end;
end;
procedure TfrmMain.logit(const logstr:String);
var
curdate,Curtime:string;
StrGUID:string;
begin
StrGUID:=FormatDateTime('YYYYMMDDHHnnsszzz', Now())+'_ ';
mnolog.lines.add(StrGUID +logstr);
end;
end.
Ihre Try/außer Block nichts drin hat. Daher kann es nichts fangen. Was ist sein Sinn? –
Können Sie eine [mcve] bereitstellen. Ich vermute, dass viel mehr passiert, Einstellungen in der .dfm-Datei, die wichtig sind. Und vermutlich das andere Ende der Kommunikation. Stellen Sie kein GUI-Programm zur Verfügung. Es ist ein Schmerz, zu versuchen, dass das hier läuft. Stellen Sie eine saubere [mcve] in Form einer Konsolen-App bereit. –
Ich bin Autodidakt, also weiß ich nicht einmal, wie man eine Konsolen-App macht, aber ich werde es versuchen. Auch für die Fehlersuche habe ich den Code entfernt, der im Versuch war, außer wenn ich irgendwo gelesen habe, ein Versuch/außer im Execute-Ereignis kann verhindern, dass das Steuerelement seine eigenen Ausnahmen behandelt. Vielen Dank für die Antwort – John