Announcement

Collapse
No announcement yet.

Synchronize und Delphi6

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Synchronize und Delphi6

    Hallo, ich habe folgendes Problem:
    Ein eigener Thread kommuniziert im Hintergrund mit einem externen Gerät und tätigt von Zeit zu Zeit über Synchronize Änderungen am aktiven Formular. (Z.B. Änderung von label.caption.)
    Wenn jetzt der Anwender das Fenster verschieben will indem er auf die Titelleiste klickt, hängt mein Thread bei Synchronize bis er wieder die Maustaste loslässt. In Delphi5 gabs diesen Effekt nicht, das habe ich dann nochmal ausprobiert.

    Ich habe D6 mit SP2. Bei Borland fand ich nur Hinweise, dass Synchronize in D6 jetzt ganz anders realisiert ist, aber nirgends etwas wie man dieses Problem löst. Auch fand ich bisher in keinem Forum einen Hinweis wie man das Problem einfach löst.

    Wenn die Kommunikation länger als 2 Sekunden unterbrochen wird, schaltet sich das Gerät mit Timeout weg und ich kann die ganze Übertragung wegwerfen. Allerdings habe ich keine Idee was ich tun kann. Wenn ich auf Synchronize verzichte kann ich keine Labels, Progressbars etc. mehr nutzen. Und auf Delphi5 kann ich auch nicht mehr zurücksteigen.

    Kann mir da jemand weiterhelfen?

  • #2
    Dann darf der Thread halt einfach nicht synchronizen.<br>
    Setze einfach Variablen in der Mainform ohne zu synchen. Solange nur der Thread schreibt ist das unproblematisch. In der Mainform lass einfach einen Timer laufen, der die Variablenwerte anzeigt/Label setzt

    Comment


    • #3
      Übergebe dem Thread das Fensterhandle des Forms mit. Im Thread selber wird mit PostMessage(FensterHandle, cm_InfoChanged, ...); das Form informiert. Das Form muß nun nur noch die Message cm_InfoChanged definieren und natürlich eine Messagemethode implementieren.<br>
      Da mit PostMessage() gearbeitet wird ist es keine synchrone Abwicklung mehr und der Thread wird nicht blockiert.<br>
      In deinem Falle wo es nur auf Labels/Progressbars ankommmt ist es unkritisch falls mal die Infos verspätet angezeigt werden.<br>

      Gruß Hage

      Comment


      • #4
        Danke für die Tips,
        für die einfache Fortschrittsanzeige habe ich das Konzept mit dem Timer verwendet und überbebe alles per globalen Integervariablen. Das funktioniert ganz gut, an anderer Stelle, wo bei bestimmten Ereignissen komplexere Atkivitäten erfolgen werde ich das Konzept mit postmessage probieren, damit der Hauptthread nur dann aktiviert wird, wenn er was zu tun hat

        Comment

        Working...
        X