Komponente->Visible Problem



  • Hallo zusammen,

    ich habe da ein etwas seltsames Problem.
    Ich lese mittels eines Threads den Eingangspuffer einer Seriellen Schnittstelle aus. Der Thread läuft in einer von mir geschriebenen Klasse.

    Sobald etwas im Eingangspuffer ankommt, möchte ich gerne ein Edit1->Visible (sichbar) machen und den Inhalt des Eingangspuffers anzeigen.

    Leider wird das Edit1 nicht richtig angezeigt, und das Programm stürzt ab.

    Wenn ich das Edit1 aber immer sichtbar habe (nicht erst im Thread sichtbar mache), funktioniert die Sache einwandfrei.
    Borland mag es irgendwie nicht, wenn man Komponenteneigenschaften ohne deren Klassenevents ändert.

    Kann mir jemand einen Tipp geben, wie ich evtl. das Problem lösen könnte ?
    Bin für jede Hilfe dankbar.



  • Die VCL mag es nicht, wenn mehrere Threads gleichzeitig darauf zugreifen. Aber die Klasse TThread hat eine Methode Synchronize. Diese ist dazu da, den Zugriff mehrerer Threads auf die VCL zu synchronisieren. Es gibt dazu auch ein schönes Beispiel in der Hilfe.

    Dass Dein Programm sofort abstürzt ist jedoch aussergewöhnlich. Normalerweise gehen unsynchronisierte Zugriffe 100-mal gut und erst beim 1001.-mal kommt der Absturz. Deshalb solltest Du sehr gut aufpassen, dass alle Zugriffe richtig synchronisiert sind, weil Du sonst irgendwann anfängst nicht reproduzierbare Abstürze zu suchen, was sehr viel Zeit benötigen kann.

    Gruss Chris



  • Goldene Regeln für Threads:

    -greife nie auf Resourcen zu, die nicht dem Thread alleine zur Verfügung stehen. Wenn es denn unmbedings sein muss dann auf jeden Fall syncronisiert.

    - VCL- Objekte sind sehr Threadsensible. Keine Konstruktor- oder Destruktoraufrufe von VCL-Objekten innerhalb von unsyncronisierten Threadsanweisungen.

    - Viele Syncronisierungen heben die Asyncronität auf. Deshab gilt: Syncronisiere wenn möglich gar nichts. Anderfalls kannst kannst du dir den Thread auch sparen.

    Wenn du Visible auf true setzt, wird das Fenster mit API-Funktionen angezeigt. Klar, dass du, wenn du diese Funktionen aufrufst, in den Resourcen des Hauptthreads herumtrampelst. Das kommt nicht gut. Windows haut dir den Thread um die Ohren.



  • AndreasW schrieb:

    Wenn du Visible auf true setzt, wird das Fenster mit API-Funktionen angezeigt. Klar, dass du, wenn du diese Funktionen aufrufst, in den Resourcen des Hauptthreads herumtrampelst. Das kommt nicht gut. Windows haut dir den Thread um die Ohren.

    Das stimmt so nicht. Ich arbeite oft mit Threads und der WinAPI, und sende da auch öfter mal aus einem Nebenthread Messages an Fenster des Haupthreads. Warum sollte das Probleme geben? Man kann so doch sogar in anderen Prozessen rumpfuschen. Das Problem ist in der VCL zu finden.



  • WebFritzi schrieb:

    Ich arbeite oft mit Threads und der WinAPI, und sende da auch öfter mal aus einem Nebenthread Messages an Fenster des Haupthreads. Warum sollte das Probleme geben?

    Das gibt keine Probleme, weil SendMesasage intern synchronisiert.

    Win32SDK-Referenz schrieb:

    If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, Windows switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message.

    Dieses Verhalten wird auch von der VCL-Methode Synchronize ausgenutzt.
    Edit: bei BCB V4 war es noch so, bei Version 6 ist es anders implementiert

    Gruss Chris



  • hm,

    soweit ich weiss ruft die VCL aber die API-Nachrichten meist über Perform auf. Damit wird die Botschaftswarteschlange von Windows umgangen. Ich glaube nicht, dass dann die Nachricht syncronisiert wird.

    ich schau mir dass späternoch mal genauer an..


Anmelden zum Antworten