TThread



  • 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.



  • Reine Neugierde meinerseits: Was für ein Problem war das?

    Btw: Wie greifst du auf die Kompos zu? Mittels Synchronize?

    -junix



  • Naja das Problem war eigentlich kein "richtiges" Problem. Ich habe nur in meiner StatusBar versucht, den 3. Panel wieder zu entfernen und die Position der ProgressBar in der StatusBar wieder zu ändern...

    Also ehrlich gesagt, glaube ich nicht, dass es daran gelegen hat^^

    Hmm Synchronize habe ich gar nie benutzt, also im Thread selber habe ich ganz normal auf die Komponenten zugegriffen wie sonst auch immer.

    z.B.

    Form->StatusBar->Panels->Items[0]->Width = 300;
    

    EDIT:

    dafür habe ich jetzt ein neues Problem 🙄

    Beim "OnTerminate"-Ereignis in meinem Thread rufe ich eine Funktion auf. In dieser Funktion wird irgendwann mal eine MessageBox aufgerufen. Aber die MessageBox erscheint gar nie, ich höre zwar den "Beep"-Ton, welcher erklingt wenn eine MessageBox erscheint, aber die MessageBox sehe ich nicht und mein Programm reagiert dann auch nicht mehr, weil es wohl wartet bis ich dort in der MessageBox (die ich nicht sehe) auf den OK-Button klicke.

    Also wenn ich die MessageBox aus dem Code entferne funktioniert alles bestens.



  • Gazmo: was steht im Codeskellett, wenn du einen neuen Thread mit dem Thread-Experten erstellst bezüglich Synchronize?

    Was die MessageBox betrifft, weiss ich auch grad keine Lösung, ausser das hald nicht der Thread eine MsgBox anzeigt sondern das UI (o;

    -junix



  • und wieder mal eine dumme frage; was meinst du mit dem thread-experten ?

    also einfach wenn ich auf Datei->Neu->Weiter klicke und dann das Thread-Objekt auswähle ?


Anmelden zum Antworten