Probleme mit Hints - BCB 5



  • Hallo Kollegen,
    ich habe ein Problem welches mich noch um den Verstand bringt...
    Ich habe ein Projekt welches wegen Hints abstürzt - wenn man einen Hint
    angezeigt bekommt und dann das Formular/Fenster mit der Maus schnell verlässt
    (sogar ohne zu klicken - nur Maus wegbewegen) stürzt das Programm in 3/10
    Fällen ab.
    Im Zuge des Debuggings habe ich gemerkt dass für jeden Hint ein Thread
    gestartet wird und dass es immer dann abstürzt wenn ein Thread gestartet aber
    nicht beendet wird. Killt man diesen Thread läuft das Programm weiter als wäre
    nichts gewesen - mit dem Unterschied dass dann nie wieder ein Thread für die
    Hints gestartet wird.
    In einem eilig erstellten Testprojekt werden für Hints keine Threads erstellt!
    Den ganzen Quelltext des Projekts habe ich durchsucht und keinen Hinweis weder
    auf irgendwelche OnHint-Handler und dergleichen noch auf irgendwelche Thread-
    Start-Aktionen noch auf andere wilde Focus-Handler etc. gefunden.
    Ich bin ratlos - werden bei euren Hints auch Threads gestartet oder nicht?
    (Sieht man schön mit dem ProcessExplorer von Sysinternals)
    Liegt das vielleicht an irgendwelchen "wild gewordenen" Komponenten?
    Wie stelle ich die Abstürze ab?
    Nehme auch wilde Mutmassungen entgegen! 😞
    Ciao,
    Harry.

    ----------
    Borland CBuilder 5
    Win XP und oder 2000
    BDE



  • Die Standard-Hints (Tooltips) laufen in der normalen Windows-Messageloop ab, d.h. dafür wird KEIN eigener Thread gestartet.
    Und da du ja anscheinend auch keine Hint-Aufrufe in "deinem" Projekt findest, werden wohl andere Mechanismen dafür verwendet.

    Sobald das Programm im Debug-Modus abstürzt, kannst du doch den Stack-Trace (Ansicht/Debug-Fenster/Aufruf-Stack Strg+Alt+S) überprüfen und die Fehlerquelle lokalisieren.



  • Th schrieb:

    Die Standard-Hints (Tooltips) laufen in der normalen Windows-Messageloop ab, d.h. dafür wird KEIN eigener Thread gestartet.
    Und da du ja anscheinend auch keine Hint-Aufrufe in "deinem" Projekt findest, werden wohl andere Mechanismen dafür verwendet.

    Hmmm - ich weiss ja nicht. Wie stelle ich das denn genau fest?
    Ich konnte das Anlegen des Threads bei Hints (per Asm-Debug) verfolgen bis in die forms.pas:

    procedure HookHintHooks;
    var
      ThreadID: DWORD;
    begin
      if not Application.FRunning then
      begin
        if HintHook = 0 then
          HintHook := SetWindowsHookEx(WH_GETMESSAGE, @HintGetMsgHook, 0, GetCurrentThreadID);
        if HintDoneEvent = 0 then
          HintDoneEvent := CreateEvent(nil, False, False, nil);
        if HintThread = 0 then
          HintThread := CreateThread(nil, 1000, @HintMouseThread, nil, 0, ThreadID);
      end;
    end;
    

    Daher ist es eher komisch, dass es in meinem Testcode keinen Thread gibt - eigentlich sollte es da auch einen neuen Thread geben.

    Sobald das Programm im Debug-Modus abstürzt, kannst du doch den Stack-Trace (Ansicht/Debug-Fenster/Aufruf-Stack Strg+Alt+S) überprüfen und die Fehlerquelle lokalisieren.

    Öhm, ok - "abstürzt" war vielleicht falsch formuliert: das Programm bleibt einfach stehen - ich vermute dass es an einem Threadlock oder sowas liegt.
    Wie ich oben schon erwähnt habe läuft das Programm weiter wenn ich den einen verklemmten Thread kille. (Prozessorlast wird übrigens nicht erzeugt)

    Kann mir vielleicht einer sagen wie man herausfindet welche Komponenten wirklich in ein Projekt hineinkompiliert werden?
    (Ist nicht ganz einfach weil das Projekt aus vielen (selbstprogrammierten) DLLs und ca. 100 (Fremd-)Komponenten besteht.)
    Ich habe nämlich langsam den Verdacht dass mir da irgendwas querschiesst.
    Ciao,
    Harry



  • *Bump*
    Kann mir hier keiner helfen? 😞



  • harryjon35 schrieb:

    Kann mir vielleicht einer sagen wie man herausfindet welche Komponenten wirklich in ein Projekt hineinkompiliert werden?

    Dafür könntest du das Programm im Debug-Modus starten und dann die Modulansicht aufrufen, das eine gute Übersicht bietet.

    Die genauere Diagnose des Problemes sollte mit dem Debugger leicht möglich sein: starte das Proramm, reproduziere die Lock-Situation, pausiere dann, aktiviere den UI-Thread (gewöhnlich ist das der erste Thread in der Liste), und sieh nach, wer da zu welchem Zweck z.B. ein WaitForSingleObject() auf den Hint-Thread ausführt.


Anmelden zum Antworten