TThread



  • Hallo, habe mit der Suchfunktion nichts zu meinen Problem gefunden, aber einer von euch Profis kann mir sicher gleich sagen, was ich hier falsch mache...

    class ThDoConvert : public TThread
    {
        private:
    
        public:
                 __fastcall         ThDoConvert   ();
            void __fastcall         Execute       (void);
            void __fastcall         ShowPercent   (void);
            void __fastcall         UpdatePercent (int percent);
    };
    

    Meine Klasse "ThDoConvert" ist von der Klasse 'TThread' abgeleitet und wenn ich den Code nun compilieren will, erscheint folgender Fehler:

    [C++ Fehler] unitMain.cpp(2572): E2251 Standardkonstruktor zum Initialisieren der Basisklasse 'TThread' nicht gefunden

    Kann mir jemand sagen, was ich hier falsch mache ? oder muss ich irgendwie den entsprechenden Konstruktor selber erzeugen ?



  • Zeig mal die IMplementation des Konstruktors.



  • //---------------------------------------------------------------------------
    // Konstruktor:
    //---------------------------------------------------------------------------
    __fastcall ThDoConvert::ThDoConvert()
    {
    
    }
    

    Also viel Code habe ich noch nicht geschrieben ­čśë



  • Wenn du von einer Klasse ableitest, musst du auch den Konstruktor der Elternklasse aufrufen, ist kein Std-Konstrutor (parameterlos) vorhanden. Das s├Ąhe dann so aus:

    //---------------------------------------------------------------------------
    // Konstruktor:
    //---------------------------------------------------------------------------
    __fastcall ThDoConvert::ThDoConvert() : TThread("hier den richtigen Parameter wie du es dir w├╝nschen t├Ątest")
    {
    
    }
    

    -junix

    EDIT: Vorzugsweise solltest du dich etwas mit Vererbung in C++ auseinandersetzen...



  • werde ich machen, junix, und vielen Dank f├╝r deine Hilfe



  • Da bin ich wieder... ­čÖä

    Nun habe ich folgendes Problem:

    Wenn ich mein Programm beende, erschent folgende Meldung:

    ---------------------------
    Benachrichtigung ├╝ber Debugger-Exception
    ---------------------------
    Im Projekt winStDebug.exe ist eine Exception der Klasse EOSError aufgetreten. Meldung: 'Systemfehler. Code: 1400.
    Ung├╝ltiges Fensterhandle'. Proze├č wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
    ---------------------------
    OK Hilfe
    ---------------------------

    Kann mir einer sagen, was ich jetzt schon wieder vergessen bzw. falsch gemacht habe ?



  • Da h├Ąlt sich ja das Programm an und du siehst im Debugger wo es steht.... Wo stehts? Schliesst du evtl die Threads nicht sauber bevor dus beendest?

    -junix



  • Also ich habe nur einen Thread und der wird doch mit der Methode "Terminate" geschlossen wenn ich richtig liege, also das "OnTerminate"-Ereignis tritt dann auch auf und der entsprechende Code wird dort durchgef├╝hrt...

    Im Debugger sehe ich schon wo das Programm steht, d.h. es geht dort eine neue Seite auf (Forms.hpp) und beim folgenden Abschnitt bleibt er dann stehen:

    ...
    	__property OnUnDock ;
    public:
    	#pragma option push -w-inl
    	/* TCustomForm.Create */ inline __fastcall virtual TForm(Classes::TComponent* AOwner) : TCustomForm(AOwner) { }
    	#pragma option pop
    	#pragma option push -w-inl
    	/* TCustomForm.CreateNew */ inline __fastcall virtual TForm(Classes::TComponent* AOwner, int Dummy) : TCustomForm(AOwner, Dummy) { }
    	#pragma option pop
    	#pragma option push -w-inl
    -->	/* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { }
    	#pragma option pop
    ...
    

    Also im obigen Ausschnitt bei der zweituntersten Zeile bleibt er stehen, aber ich kann damit nicht viel anfangen...



  • L├Âschst du evtl. Speicher irgendwie zwei mal? Erstellst du dynamisch Komponenten?
    Was liegt, wenn du dir das Calling-Window anschaust, vor dem Stop durch den Debugger?



  • also speicher wird eigentlich nirgends mehrmals gel├Âscht...

    ja ich benutze ein dynamisches Array mit Komponenten (TCheckBox), aber das Problem habe ich jetzt ja auch erst seit ich den Thread ins Programm eingebaut habe.

    Sorry f├╝r die Frage, aber was ist das Calling-Window ?



  • BCB Version 6 z.B. Unter Start->Debugwindow (oder ├Ąhnlich) und dann Calling-Stack oder sowas... das Zeigt dir alle Funktionsaufrufe die noch auf dem Stack liegen an...

    -junix



  • hmm, sorry aber ich finde dort kein debug-window oder soetwas ├Ąhnliches... (habe auch Version 6, aber nur die personal-edition)

    es gibt ein punkt "Ausf├╝hrungsposition anzeigen" aber den meinst du wohl kaum ?!



  • Ne. Im BCB 6 Gibts irgendwo n Untermen├╝ "Debug Windows"...weiss aber nicht mehr in welchem Hauptmen├╝ das war und hab grad keinen BCB zum Testen...

    -junix

    EDIT: Ich glaub das war im View-Men├╝...



  • meinste vielleicht ansicht->Debug-Fenster->Aufruf-Stack?(kenn mich da selber net so aus ­čśë )



  • Jajaja genau das (o: Ich hab nur die Englischen Begriffe im Kopf sorry (o;



  • shit, habs die ganze zeit am falschen ort gesucht...

    habs jetzt gefunden unter Ansicht->Debug-Fenster->Aufruf-Stack

    hoffentlich ist es das richtige, bei mir sieht es jetzt so aus:

    http://shuto.gamersnet.ch/img/aufruf_stack.jpg



  • Genau das ist es... .hmmm keine Auff├Ąlligkeiten die ich grad so sehen w├╝rde....

    Ist es mit geringem aufwand m├Âglich, die dynamischen Komponenten vor├╝bergehend zu deaktivieren? Oft ist es wirklich so, dass irgendwas mit den dyn. Kompos schief l├Ąuft... eine andere Variante w├Ąre: Greifst du irgendwo im Thread auf VCL-Kompos zu?

    -junix



  • also im thread greife ich nirgends auf die dyn. komponenten zu.

    ich hab einfach mal die funktion, in welcher die dyn. komponenten erstellt werden, auskommentiert, doch die Fehlermeldung am Schluss kam auch dann...



  • Auf Komponenten die du nicht dyn. erstellst greifst du aber zu oder wie?

    -junix



  • ja...

    ├Ąhm, jetzt kapier ich gar nichts mehr...

    hab vorher an einem andern problem, welches meiner ansicht nach ├╝berhaupt nichts mit dem Thread zu tun herumgebastelt und konnte das Problem beheben.

    Nun habe ich mein Programm ausgef├╝hrt und beim Beenden erscheint nun pl├Âtzlich keine Exception mehr !!! ­čś«

    Jedenfalls vielen Dank Junix, f├╝r deine Hilfe und die Zeit, welche du in mein Problem investiert hast.


Log in to reply