![]() |
Prgramm hängt trotz Thread.
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.
Ich habe ein Problem und zwar habe ich volgenden Code:
Delphi-Quellcode:
Der Tread:
unit uMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, mtTelnetThread; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private Telnet : TTelnetThread; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Telnet := TTelnetThread.create; Telnet.Connect('xtain.net', 1338); end; end.
Delphi-Quellcode:
Nunja das Problem ist klar das Das Programm troz eigenem tread hängt. Hat wer ne Idee?
UNIT mTTelnetThread;
interface uses classes, sysUtils, Dialogs; type public constructor create; virtual; function Connect(Host: String; Port: Integer): boolean; virtual; end; implementation constructor TTelnetThread.create; begin inherited create(true); freeOnTerminate := true; end; function TTelnetThread.Connect(Host: String; Port: Integer): boolean; begin sleep(9999999); end; [edit=Luckie]Rechtschreibfehler im Titel korrigiert. Mfg, Luckie[/edit] [edit=mkinzler]Rechtschreibfehler konsequent im Titel korrigiert :zwinker: Mfg, mkinzler[/edit] |
Re: Prgramm hängt troz Tread.
Du hast keinen Thread sondern du rufst ja Sleep direkt auf. Das was in einem TThread Nachfahren parallel abläuft ist alles was in der Methode Execute drin steht. Und diese muss überschrieben werden - mal abgesehen von anderen Unzulänglichkeiten in deinen kleinen Codeschnipseln...
|
Re: Prgramm hängt troz Tread.
Also ich habe das ganze mal so gemacht wie su sagtest.
für einen Sleep funktioniert das sogar. Das problem ist das ich damit eigentlich eine Telnetverbindung herstellen möchte ohne das bei offner verbindung das formular hängt. wenn ich das also so mache hängt das form:
Delphi-Quellcode:
Ne idee?
procedure TTelnetThread.execute;
begin IdTelnet1.Host := Host; IdTelnet1.Port := Port; try IdTelnet1.Connect(); // IsConnect := True; except // IsConnect := False; end; end; Verbindung kommt aber beim Server an ;) Wenn ich dann Disconnecte dann läst sich das Form auch wieder bewegen |
Re: Prgramm hängt troz Tread.
Zeig mal kompletten Code.
|
Re: Prgramm hängt troz Tread.
Zitat:
*Danach* soll eine Telnet-Verbindung gestartet werden und während dieser Zeit soll eine Sanduhr angezeigt werden, damit der Benutzer weiss, dass das Programm noch arbeitet. Um dieses Verhalten zu erreichen brauchst du keinen Thread! Leider hat ein Formular nicht das Event OnAfterShow. Aber dem kann man nachhelfen. Falls ich dich überzeugt habe, dass ein Thread hier nicht angebracht ist, kriegst du mehr Infos dazu. |
Re: Prgramm hängt troz Tread.
Die Telnetverbindung soll aber den ganzen Programmablauf über geöffnet sein.
Solange dies der Fall ist hängt das Formular. Hier der ganze Code:
Delphi-Quellcode:
Der Thread:
procedure TForm1.Button1Click(Sender: TObject);
begin Telnet := TTelnetThread.create; Telnet.SetVars('xtain.net', 3118); Telnet.Resume; //Telnet.Disconnect; //Telnet.Resume; end;
Delphi-Quellcode:
UNIT mTTelnetThread;
interface uses classes, sysUtils, windows, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdTelnet; type TTelnetThread = CLASS(TThread) private IdTelnet1: TIdTelnet; Host: String; Port: Integer; protected procedure execute; override; public constructor create; virtual; procedure Disconnect; virtual; procedure Send(Value: String); virtual; procedure SetVars(fHost: String; fPort: Integer); virtual; end; implementation constructor TTelnetThread.create; begin inherited create(true); freeOnTerminate := true; IdTelnet1 := TIdTelnet.Create(nil); end; procedure TTelnetThread.execute; begin IdTelnet1.Host := Host; IdTelnet1.Port := Port; try IdTelnet1.Connect(); // IsConnect := True; except // IsConnect := False; end; end; procedure TTelnetThread.Send(Value: String); begin IdTelnet1.WriteLn(Value); end; procedure TTelnetThread.SetVars(fHost: String; fPort: Integer); begin Host := fHost; Port := fPort; end; procedure TTelnetThread.Disconnect; begin IdTelnet1.Disconnect(); end; end. |
Re: Prgramm hängt troz Tread.
Nebenbei bemerkt, das Ding nett sich Thread und nicht Tread.
|
Re: Prgramm hängt troz Thread.
ohhh,
xD |
Re: Prgramm hängt troz Thread.
abgesehn davon ist der Thread so total sinnlos, da abgesehn vom dTelnet1.Connect(); alles außerhalb des Threads abläuft, welcher sich sogar nach dem Connect sofort wieder beendet.
und bezüglich dem String über SetVar ... Strings sind nicht threadsicher, also sollte man den String nicht einfach so in einen Thread hineinreichen. |
Re: Prgramm hängt troz Thread.
ähm ja gut.
Die Frage ist erstmal wie erreiche ich es das bei einer Offenen Telnet Verbindung das Main Form nicht hängt PS: Gibt es iwo ne Gutes Tut für Threads. Ich arbeite nich noch nich solange damit. |
Re: Prgramm hängt troz Thread.
soweit ich das weiß benutzt doch die TidTelnet Komponente von Hause aus Threads.
Oder man kann sie so konfigurieren das sie es tut. Es ist also in keinster Weise notwendig Deine Telnet Session in einen eigenen Thread auszulagern. Ausserdem ist Telnet Ereignis gesteuert. Du kannst Daten im Ereignis OnDataAvailable auslesen. Btw. welche Indy Version nutz Du? Grüße Klaus |
Re: Prgramm hängt troz Thread.
Ahh es hat sich erledigt :P
Man musste nur die Option TreadesEvent auf true stellen |
Re: Prgramm hängt troz Thread.
also so dürfte alles im Thread ablaufen ... glaub ich :angel2:
Delphi-Quellcode:
UNIT mTTelnetThread;
interface uses Classes, SysUtils, Windows, Dialogs, SyncObjs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdTelnet; type TTelnetThread = CLASS(TThread) private FHost: String; FPort: Integer; FTelnet: TIdTelnet; FCSection: TCriticalSection; FSend: String; protected procedure Execute; override; public constructor Create(const Host: String; Port: Integer); destructor Destroy; override; procedure Send(Value: String); end; implementation constructor TTelnetThread.Create(const Host: String; Port: Integer); begin inherited Create(true); FHost := Host; FPort := Port; FSend := ''; UniqueString(FHost); FTelnet := TIdTelnet.Create(nil); FTelnet.Host := FHost; FTelnet.Port := FPort; FCSection := TCriticalSection.Create; Resume; end; destructor TTelnetThread.Destroy; begin FCSection.Free; FTelnet.Free; end; procedure TTelnetThread.Execute; var S: String; begin FTelnet.Connect; repeat FCSection.Enter; try S := FSend; FSend := ''; finally FCSection.Leave; end; if S <> '' then FTelnet.WriteLn(S) else Sleep(50); // CPU-Last im Leerlauf senken until Terminated; FTelnet.Disconnect; end; procedure TTelnetThread.Send(Value: String); begin while Value <> '' do begin FCSection.Enter; try if FSend = '' then begin FSend := Value; UniqueString(FSend); Value := ''; else Sleep(50); // CPU-Last der Schleife senken finally FCSection.Leave; end; end; end; end.
Delphi-Quellcode:
aber wenn es (so wie Klaus01 meint) auch ohne Thread geht, dann würde ich es auch ohne machen.
Telnet := TTelnetThread.Create('xtain.net', 3118);
... Telnet.Send('...'); ... Telnet.Terminate; Tutorials ... da finden sich unmassen an Threads in der DP und soweit ich weiß, steht sehr viel in der OH und Delphi hat sogar eine Threaddemo mit an Board. |
Re: Prgramm hängt troz Thread.
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 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