AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi TThread Execute Methode dauerhaft laufen lassen
Thema durchsuchen
Ansicht
Themen-Optionen

TThread Execute Methode dauerhaft laufen lassen

Ein Thema von sk0r · begonnen am 12. Mai 2008 · letzter Beitrag vom 29. Mai 2008
Antwort Antwort
Seite 1 von 3  1 23      
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#1

TThread Execute Methode dauerhaft laufen lassen

  Alt 12. Mai 2008, 18:46
Hi,

gibt es eine Möglichkeit, dass die Methode
Execute der erbenden TThread-Klasse, wie
wenn man mit WinAPI einen Thread erstellt und
ihn dauerhaft mit einer While-Schleife laufen
lässt, dauerhaft laufen zu lassen? Der Grund ist,
ich möchte eine Winsock-Klasse erstellen und
muss dort dauerhaft die Funktion recv() aufrufen
lassen.

MfG: sk0r
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: TThread Execute Methode dauerhaft laufen lassen

  Alt 12. Mai 2008, 18:51
Du hast die Lösung doch schon selber genannt. Ja das geht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von p0w3r5tr34m3r
p0w3r5tr34m3r

Registriert seit: 18. Aug 2003
Ort: Monheim am Rhein
153 Beiträge
 
RAD-Studio 2009 Pro
 
#3

Re: TThread Execute Methode dauerhaft laufen lassen

  Alt 12. Mai 2008, 20:27
Delphi-Quellcode:
while true do begin
  // code
  recv(s, buffer, sizeof(buffer));
  // code
end;
MfG
Florian Cülter
ich bin ein notorischer alles-klein-schreiber!

der 100. Beitrag nach 3 Jahren 25 Wochen und einem Tag
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: TThread Execute Methode dauerhaft laufen lassen

  Alt 12. Mai 2008, 21:08
Du weißt aber, dass die Sockets von Windows auch andere Möglichkeiten anbieten, als das ständige Polling. --> WSAAsyncSelect
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

Re: TThread Execute Methode dauerhaft laufen lassen

  Alt 12. Mai 2008, 21:18
Hi,

wenn du einen Thread in einer Schleife laufen lassen willst, nimm am besten eine Bedingung mit Terminated, also repeat ... until Terminated oder so. Falls du ihn dann doch Beenden möchtest, geht es dann ganz einfach über TThread.Terminate. So lange du das nicht aufrufst, wird dein Thread weiterlaufen (Vorausgesetzt es gibt keine unbehandelten Exceptions, kein break und kein exit in deinem Code).

Mfg
FAlter
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: TThread Execute Methode dauerhaft laufen lassen

  Alt 12. Mai 2008, 21:27
Naja, das Problem ist, wenn ich
Delphi-Quellcode:
procedure Thread.Execute;
begin
  while true do
  begin
    //Irgendwas machen
    Sleep(10);
  end;
end;
benutze, dann wird meine Hauptanwendung blockiert. :/

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  thread = class(TThread)
    procedure Execute;
  end;

var
  Form1: TForm1;
  gthread: thread;

implementation

{$R *.dfm}

procedure thread.Execute;
begin
  while true do
  begin
    ShowMEssage('TEST');
    Sleep(10);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  gthread := thread.Create(true);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  gthread.Execute;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

Re: TThread Execute Methode dauerhaft laufen lassen

  Alt 12. Mai 2008, 21:40
Hi,

du darfst nicht direkt die Execute aufrufen. Stattdessen musst du den Thread mit Resume starten (oder du übergibst gleich false an den Thread, dann wird er sofort gestartet).

Und ich glaube, ShowMessage aus dem Thread aufzurufen fällt in die Kategorie, in welcher Synchronize angesagt ist. Nimm lieber eine MessageBox.

Mfg
FAlter
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: TThread Execute Methode dauerhaft laufen lassen

  Alt 12. Mai 2008, 21:47
ein "override" wäre in der Deklaration der Methode execute noch sehr hilfreich.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
sk0r

Registriert seit: 1. Mai 2007
181 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: TThread Execute Methode dauerhaft laufen lassen

  Alt 12. Mai 2008, 21:51
Ok, bei Resume bekomme ich nun einen abstrakten Error. ó_Ò

Kann jemand mal meinen Code ansehen? Wäre echt nett.

Delphi-Quellcode:
unit sockettest;

interface

uses
  SysUtils,
  Classes,
  Windows,
  Winsock;

type
  TSockThread = class(TThread)
    iSock: Cardinal;
    recvProc: procedure(szString: String);
    procedure Execute;
  end;

  TSmallSock = class
      constructor Create(Address: PChar; Port: Cardinal);
      procedure Free;
    private
      lpAddress: PChar;
      dwPort: Cardinal;
      iSock: Cardinal;
      WSAData: TWSAData;
      addrIn: TSockAddrIn;
      dwThreadID: Cardinal;
      gThread: TSockThread;
    public
      procRecv: procedure(szString: String);
      function DoConnect:Boolean;
      function SendString(szString: String):Boolean;
  end;


var gSmallSock: TSmallSock;

implementation

procedure TSockThread.Execute;
var
  mBuf: array[0..1000-1] of Char;
begin
  if recv(gSmallSock.iSock, mBuf, sizeof(mBuf), 0) <> SOCKET_ERROR then
  begin
    if mBuf <> 'then
    begin
      recvProc(mBuf);
      mBuf := '';
    end;
  end;
end;

constructor TSmallSock.Create(Address: PChar; Port: Cardinal);
begin
  lpAddress := Address;
  dwPort := Port;
end;

function TSmallSock.DoConnect:Boolean;
begin
  result := false;
  try
    if WSAStartup(MAKEWORD(2, 2), WSAData) <> SOCKET_ERROR then
    begin
      iSock := socket(AF_INET, SOCK_STREAM, 0);
      if iSock = SOCKET_ERROR then exit;

      addrIn.sin_family := AF_INET;
      addrIn.sin_port := htons(dwPort);
      addrIn.sin_addr.S_addr := inet_addr(lpAddress);

      if connect(iSock, addrIn, sizeof(addrIn)) <> SOCKET_ERROR then
      begin
        gThread := TSockThread.Create(true);
        gThread.iSock := iSock;
        gThread.recvProc := procRecv;
        gThread.Resume;

        result := true;
      end;
    end;
  except
    WSACleanup;
  end;
end;

function TSmallSock.SendString(szString: String):Boolean;
begin
  result := false;

  if send(iSock, szString, length(szString), 0) <> SOCKET_ERROR then
    result := true;
end;

procedure TSmallSock.Free;
begin
  inherited Free;

  gThread.DoTerminate;
  WSACleanup;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: TThread Execute Methode dauerhaft laufen lassen

  Alt 12. Mai 2008, 21:53
Zitat von sk0r:
Ok, bei Resume bekomme ich nun einen abstrakten Error. ó_Ò
Siehe Post #8
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 01:52 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