AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread execute wird nicht ausgeführt

Ein Thema von Lord_stelzer · begonnen am 16. Jul 2009 · letzter Beitrag vom 16. Jul 2009
Antwort Antwort
Seite 1 von 2  1 2      
Lord_stelzer

Registriert seit: 24. Okt 2006
Ort: Hannover
13 Beiträge
 
#1

Thread execute wird nicht ausgeführt

  Alt 16. Jul 2009, 13:00
Halli Hallo,
Ich möchte einen Clienten schreiben der Dauerhaft versucht auf einen Server zu connecten und dann evtl. auch was hinzuschicken.
Um Das Programm damit nicht langsamer zu amchen habe ich diesen Teil in einen Thread gepackt.
Weil ich mit Threads noch kine Erfahrungen gemacht habe habeich ein neues Programm erstellt um das ganze übersichtlich zu haben und es besser zu verstehen. Nun Wird aber Execute im Thread garnicht ausgeführt.
Könnt ihr mir vielleicht sagen wo mein Fehler steckt?

Main-Unit:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2, ExtCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdTCPClient1: TIdTCPClient;
    procedure FormCreate(Sender: TObject);
  private
    Main : TMain;
  public
    Time:string;
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Main := TMain.Create(tpnormal);
end;

end.
Thread-Unit:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Classes, ExtCtrls, WinSock, SysUtils, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

type
  TMain = class(TThread)
  IdTCPClient: TIdTCPClient;
  Timer1: TTimer;
  private

  protected
    procedure Execute; override;
    procedure Update;
  public
   constructor Create(ThreadPriority: TThreadPriority);
  end;

implementation
uses Unit1;

{ Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten dürfen
  nur in einer Methode namens Synchronize aufgerufen werden, z.B.

      Synchronize(UpdateCaption);

  und UpdateCaption könnte folgendermaßen aussehen:

    procedure Main.UpdateCaption;
    begin
      Form1.Caption := 'Aktualisiert in einem Thread';
    end; }


{ Main }

constructor TMain.Create(ThreadPriority: TThreadPriority);
Begin
inherited Create(false);
Priority:=ThreadPriority;
end;

procedure TMain.Execute;
begin
Timer1.Create(nil);
IdTCPClient.Create(nil);
with IdTCPClient do
Begin
ASCIIFilter:=false;
MaxLineLength:=16384;
ReadTimeOut:=0;
RecvBufferSize:=32768;
SendBufferSize:=32768;
end;
with Timer1 do
Begin
enabled:=true;
Interval:=1000;
end;
  try
  IdTCPClient.Connect(100);
  except
  end;

Synchronize(Update);
end;

procedure TMain.Update;
begin
  Form1.caption := '00:00:00';
end;

end.
also das Synchronize wird schon garnicht mehr ausgeführt...
Ich bin den Quellcode auch schon mit F7 durchgegangen aber ohne Fehler...
Danke für jede Antwort
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Thread execute wird nicht ausgeführt

  Alt 16. Jul 2009, 13:06
Objekte erzeugst du mit Objekt := TKlasse.Create, nicht mit Objekt.Create. Des weiteren wird zumindest der Timer im Thread nicht so ohne Weiteres funktionieren, da er auf eine Nachrichtenschleife angewiesen ist. Zuguterletzt möchte ich noch vor dem leeren Except-Block warnen; wenn du schon nichts tust, beschränke dich mit der on-Klausel auf bestimmte Exceptions, denn EOutOfMemory oder EStackOverflow kannst du nun mal nicht geeignet behandeln.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Thread execute wird nicht ausgeführt

  Alt 16. Jul 2009, 13:10
Zitat von Apollonius:
Des weiteren wird zumindest der Timer im Thread nicht so ohne Weiteres funktionieren, da er auf eine Nachrichtenschleife angewiesen ist.
Den er sich automatisch mit AlloceHWnd erzeugt wenn er keinen Owner/Parent hat. Den er sich immer selbst erzeugt und somit unabhängig ist.
  Mit Zitat antworten Zitat
Lord_stelzer

Registriert seit: 24. Okt 2006
Ort: Hannover
13 Beiträge
 
#4

Re: Thread execute wird nicht ausgeführt

  Alt 16. Jul 2009, 13:19
Okay danke erstmal,
klar: Objekt := TKlasse.Create

ich habe dort (nil) angegeben weil ich nicht wusste welcher Komponennte er sich nun eigentlich unterordnen soll... was könnte ich denn da nehmen?
mit dem leeren Except-Block was könnte man da denn reinmachen dass er nix tut xD
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Thread execute wird nicht ausgeführt

  Alt 16. Jul 2009, 13:25
@Muetze1: TTimer erzeugt sich doch keinen eigenen Thread. Er setzt auf der SetTimer-API auf, die wiederum Fensternachrichten verwendet.

@Lord_stelzer: Das mit dem nil ist durchaus in Ordnung; du musst nur daran denken, die Objekte in deinem Destruktor oder anderswo wieder freizugeben. Beim Except-Block solltest du dich einfach auf bestimmte Exceptions beschränken - dazu gibt es die "on ExceptionKlasse do"-Klausel.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Lord_stelzer

Registriert seit: 24. Okt 2006
Ort: Hannover
13 Beiträge
 
#6

Re: Thread execute wird nicht ausgeführt

  Alt 16. Jul 2009, 14:14
es geht weiter xD
habs erstmal geschafft, hat alles funktioniert nun kriege ich ne Zugriffsverletzung im Thread-Code
Ich bin den Code wieder mit F7 durchgegangen so finde ich meistens meine Fehler aber mit den Threads will das nicht... da meldet er beim Thread.Create den Fehler
Delphi-Quellcode:
unit Unit2;

interface

uses
  Classes, ExtCtrls, WinSock, SysUtils, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

type
  TMain = class(TThread)
  IdTCPClient: TIdTCPClient;
  Timer1: TTimer;
  procedure Timer1Timer(Sender: TObject);
  private

  protected
    procedure Execute; override;
    procedure Update;
  public
    hour1, min1, sek1, sekunden1, stime:real;
    Port, time1:integer;
    Host, S, nTime:string;
   constructor Create(ThreadPriority: TThreadPriority);
  end;

implementation
uses Unit1;

{ Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten dürfen
  nur in einer Methode namens Synchronize aufgerufen werden, z.B.

      Synchronize(UpdateCaption);

  und UpdateCaption könnte folgendermaßen aussehen:

    procedure Main.UpdateCaption;
    begin
      Form1.Caption := 'Aktualisiert in einem Thread';
    end; }


{ Main }

function SecondsToTime(wSeconds: Word): TDateTime;
var
  wHours, wMin: Word;
begin
  wHours := Trunc(wSeconds div 3600);
  wSeconds := wSeconds - (3600 * Trunc(wSeconds div 3600));
  wMin := Trunc(wSeconds div 60);
  wSeconds := wSeconds - (60 * Trunc(wSeconds div 60));
  Result := EncodeTime(wHours, wMin, wSeconds, 0);
end;

constructor TMain.Create(ThreadPriority: TThreadPriority);
Begin
inherited Create(false);
Priority:=ThreadPriority;
end;

procedure TMain.Execute;
begin
Timer1 := TTimer.Create(nil);
{IdTCPClient:=TIdTCPClient.Create(nil);
with IdTCPClient do
Begin
ASCIIFilter:=false;
MaxLineLength:=16384;
ReadTimeOut:=0;
RecvBufferSize:=32768;
SendBufferSize:=32768;
end;}

with Timer1 do
Begin
Interval:=1000;
enabled:=true;
end;
Synchronize(Update);
end;

procedure TMain.Timer1Timer(Sender: TObject);

Begin
S := FormatDateTime('hh:nn:ss', Time);
hour1:=strtoint(copy(S, 1, 2));
min1:=strtoint(copy(S, 4, 2));
sek1:=strtoint(copy(S, 7, 2));
sekunden1:=hour1*3600+min1*60+sek1;
time1:=Trunc(sekunden1-sTime);
nTime:=timetostr(secondstotime(time1));



{  try
  IdTCPClient.Connect(100);
  except
  end; }

End;

procedure TMain.Update;
begin
  Form1.caption := nTime;
end;

end.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Thread execute wird nicht ausgeführt

  Alt 16. Jul 2009, 14:18
Zitat von Apollonius:
@Muetze1: TTimer erzeugt sich doch keinen eigenen Thread. Er setzt auf der SetTimer-API auf, die wiederum Fensternachrichten verwendet.
Thread war auch nicht gemeint, aber Fenster. Der Timer erzeugt sich immer ein eigenes Fenster mit AllocateHWnd und ist somit unabhängig. Somit: warum sollte es nicht funktionieren. Dein Einwand das der TTimer nicht funktionieren kann da er ein Fensterhandle braucht ist falsch.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Thread execute wird nicht ausgeführt

  Alt 16. Jul 2009, 14:23
Und wer soll die Nachrichten für das Fenster bearbeiten? Das kann nur der Thread tun, der das Fenster erstellt hat. Und er braucht dazu eine Nachrichtenschleife.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Lord_stelzer

Registriert seit: 24. Okt 2006
Ort: Hannover
13 Beiträge
 
#9

Re: Thread execute wird nicht ausgeführt

  Alt 16. Jul 2009, 14:25
jetzt bekriegt euch hier nicht xD
kann mir lieber einer sagen wie ich sowas mache? (Nachrichtenschleife)
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Thread execute wird nicht ausgeführt

  Alt 16. Jul 2009, 14:29
Eine Nachrichtenschleife sieht in der einfachsten Form so aus:
Delphi-Quellcode:
var msg: tagMSG;

while GetMessage(msg, 0, 0, 0) do
  DispatchMessage(msg);
Die müsstest du dann einbauen, wenn der Timer laufen soll. Beenden kannst du die Nachrichtenschleife mit PostQuitMessage(0). Meine hellseherischen Fähigkeiten sagen mir allerdings, dass ein TTimer nicht die beste Lösung für dein Problem ist - jetzt müsste ich nur noch das Problem kennen. Wofür willst du den Timer verwenden?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz