Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TThread -> Execute(SockId: Integer); (https://www.delphipraxis.net/33465-tthread-execute-sockid-integer-%3B.html)

StanY 7. Nov 2004 18:05


TThread -> Execute(SockId: Integer);
 
Ich habe ein Programm, was mehrere Threads erstellt, während der Laufzeit.

Nun habe ich das Problem, dass quasie bei der OnExecute-Prozedur eine Variable übergeben werden muss.

Ist mir aber nciht möglich, da dann der Compiler rummeckert, dass sich die neue Prozedur von der alten unterscheidet:

Delphi-Quellcode:
TMyThread = class(TThread)
  protected
    procedure Execute(SockId: Integer);
end;
Wie kann ich das realisieren?

(Ein neues Ereignis schreiben und dann quasie manuell aufhühren geht nicht, da es dann nicht als thread behandelt wird und die Hauptanwendung lahmt.

Muetze1 7. Nov 2004 22:07

Re: TThread -> Execute(SockId: Integer);
 
Moin!

1. IMHO sollte man die Parameterliste von Execute nicht ändern, da diese Methode nicht von dir später aufgerufen wird, sondern vom der originalen TThread Klasse und daher würde das dann nicht mehr klappen.
2. Du musst die Methode überschreiben - aber das würde er auch ordentlich schon vorbereiten, wenn du über Datei->Neu->Thread gegangen wärst...
3. Wieso der Execute Methode übergeben? Definiere eine Property im Thread...

MfG
Muetze1

Jelly 7. Nov 2004 22:10

Re: TThread -> Execute(SockId: Integer);
 
Zitat:

Zitat von Muetze1
3. Wieso der Execute Methode übergeben? Definiere eine Property im Thread...

In so Fällen überschreib ich immer den Constructor Create ;-)

StanY 8. Nov 2004 13:17

Re: TThread -> Execute(SockId: Integer);
 
Entweder versteh ich euch oder ihr mich net :D

Also, hier mal ausführlicher. Dabei wollte ich heute weiter arbeiten \:

Ich habe eine eigene Klasse. Abgeleitet von der TIdTCPClient-Komponente. Halt mit eingebautem Thread:

Delphi-Quellcode:
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;

  TConnection = class(TIdTCPClient)
    Thread: TMyThread;
  end;
TMyThread steht halt darüber.

Nun erstelle ich per DynArr von TConnection mehrere TIdTCPClienten und mehrere Threads.

Jeder Thread muss nun für _seinen_ TCPClienten ReadLn ausführen, was ich realisieren wollte, indem ich TMyThread.Execute eine Integer Variable übergebe, die dann sagt, welchen Verbindung er abhören soll:

Delphi-Quellcode:
TMyThread.Execute(SockId: Integer);
begin
  memDebug.Lines.Add(Connection[SockId].ReadLn);
end;
Wie kann ich das möglich machen?

Sprint 8. Nov 2004 13:28

Re: TThread -> Execute(SockId: Integer);
 
Zitat:

Zitat von StanY
Jeder Thread muss nun für _seinen_ TCPClienten ReadLn ausführen, was ich realisieren wollte, indem ich TMyThread.Execute eine Integer Variable übergebe, die dann sagt, welchen Verbindung er abhören soll:

Wie kann ich das möglich machen?

Delphi-Quellcode:
type
  TMyThread = class(TThread)
  private
    FSockedId: Integer;
  protected
    procedure Execute; override;
  public
    property SockedId: Integer read FSockedId write FSockedId;
  end;
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  // arbeite mit FSockedId
end;
Und so erstellst du dann den Thread...
Delphi-Quellcode:
  with TMyThread.Create(True) do
  begin
    FreeOnTerminate := True;
    SockedId := 1234;
    Resume;
  end;

StanY 8. Nov 2004 13:33

Re: TThread -> Execute(SockId: Integer);
 
Ich idiot, da hätte ich drauf kommen können \: - Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 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