Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi scheitere bei TThread schon am Anfang (https://www.delphipraxis.net/7968-scheitere-bei-tthread-schon-am-anfang.html)

iaby 25. Aug 2003 19:24


scheitere bei TThread schon am Anfang
 
hallo zusammen!

ich wollte nun das erste mal in meinem delphi-leben Threads benutzen, das scheitert aber schon am anfang!
hier mein code:
Code:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  MyThread = class(TThread)
    protected
       procedure execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.
und hier die fehlermeldung:
Zitat:

[Error] Unit1.pas(19): Unsatisfied forward or external declaration: 'MyThread.execute'
ich habe das direkt aus einem buch abgeschrieben und auch schon so im forum gesehen!
bitte schlagt mich nicht weil es bestimmt super-einfach ist :oops:

gruss,
iaby

Chewie 25. Aug 2003 19:29

Re: scheitere bei TThread schon am Anfang
 
Drück mal Strg+Shift+C :wink:

Lies dir außerdem mal den Hilfeeintrag zu der Compilermeldung durch.

Luckie 25. Aug 2003 19:32

Re: scheitere bei TThread schon am Anfang
 
Zwei Dinge: Normalerweise packt man die Thread Classe in eine extra Unit. Und zweitens: Existiert die Prozedur Execute über haupt schon unter implementation?

Ansonsten kuck mal auf meiner HP, da habe ich gerade ein Thread-Demo mit der TThread-Object-Klasse veröffentlicht. Und da findest du noch ein kleines Tutorial zu Threads ohne die VCL Klasse TThread zu benutzen, also reine WinAPI. BTW. das kleine WinAPI-Thread Tutorial ist abgesegnet von Assarabad, grobe Schnitzer sollten also nicht mehr drin sein. :zwinker:

iaby 26. Aug 2003 11:00

Re: scheitere bei TThread schon am Anfang
 
ahhhhhhhh,
jetzt sieht das ganze schon besser aus ;-)

ich dachte allerdings, dass die execute prozedur schon beim erstellen des objekts per create ausgeführt wird. nach langem probieren habe ich dann herausgefunden, dass es mit Thread.resume geht! woran liegt das?

Thread.free brauche ich ja nicht zu machen( wie ich das bei luckie's tutorial gelesen hab)!?!

gruss,
iaby

Motzi 26. Aug 2003 11:30

Re: scheitere bei TThread schon am Anfang
 
Zitat:

Zitat von iaby
ich dachte allerdings, dass die execute prozedur schon beim erstellen des objekts per create ausgeführt wird. nach langem probieren habe ich dann herausgefunden, dass es mit Thread.resume geht! woran liegt das?

Der Paremeter "CreateSuspended" des Constructors gibt an, ob der Thread sofort mit seiner Ausführung beginnen soll, oder ob er gleich am Anfang "suspendiert" (also angehalten) werden soll. Ist CreateSuspended True, so wird der Thread angehalten und du musst ihn manuell per Resume wieder fortsetzen. Das ist dann sinnvoll, wenn du nach dem Erzeugen des Threads noch ein paar Initialisierungen o.ä. durchführen musst.

Zitat:

Thread.free brauche ich ja nicht zu machen( wie ich das bei luckie's tutorial gelesen hab)!?!
Sofern du FreeOnTerminate auf True setzt nicht...

Edit: @Luckie: hab mir dein Demo auch mal angeschaut.. was mir aufgefallen ist:
Delphi-Quellcode:
  private
    { Private-Deklarationen }
    // Demio-Zähler
    FCount: Integer;
    // globale Variablen zum Synchronisieren
    XIndex: Integer;
    XCount: Integer;


{...}
UpdateValues(Loop, FCount);
{...}


procedure TMyThreads.UpDateValues(Index, Count: Integer);
begin
  // globale Variable zuweise, da der Synchronize Methode keine Variablen
  // übetgeben werden können.
  XIndex := FIndex;
  XCount := FCount - 1;
  // Synchronize Methode aufrufen
  Synchronize(UpDateLVCaption);
end;

procedure TMyThreads.UpDateLVCaption;
begin
  // Synchronize Methode mit globalen Variablen
  Form1.UpdateLVCaption(XIndex, XCount);
end;
1) Wozu übergibst du der Methode UpdateValues zwei Parameter wenn diese innerhalb der Methode überhaupt nicht verwendet werden?
2) Wozu führst du die beiden privaten Felder XIndex und XCount ein wenn du stattdessen genausogut FIndex und FCount für UpdateLVCaption verwenden könntest?
Edit2: 3) Wozu rufst du die Methode UpdateValues per Synchronize auf?

Luckie 26. Aug 2003 15:23

Re: scheitere bei TThread schon am Anfang
 
1.) Mist. Ist noch von irgend was anderem übriggeblieben.
2.) Öhm, ja nun, also, ich meine, ich wollte sagen, also... :oops:
3.) Gute Frage.

Alles ausgebessert. ich hatte mich an einem meiner projekte orientiert, wo es irgendwie nicht anders ging. keine Ahnung warum.


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