Synchronize in Thread bremst eigentliche Applikation (Form1) aus
-
Hallo,
in einem Thread muss ich, um auf Komponenten von Form1 zugreifen zu können, "Synchronize" aufrufen:
void __fastcall TPing::Execute() { while (!Terminated) //wenn Thread nicht unterbrochen wurde: { try //Ping an Rechner abschicken { Synchronize(Pingen); } __finally { Form1->NextPing(); Terminate(); } } Application->ProcessMessages(); }Die Funktion, die Synchronize aufruft, sieht folgendermaßen aus:
void __fastcall TPing::Pingen() { int PingAntwortZeit = PingHost(Form1->aktuellerrechnername->Caption, NULL); //angepingter PC am Netz? if (PingAntwortZeit!=-1) //wenn PC am Netz: Form1->aktuellerrechnerstatus->Caption="PC_im_Netz"; else Form1->aktuellerrechnerstatus->Caption="PC_nicht_im_Netz"; //wenn nicht im Netz: }Dadurch wird aber das bei der Ausführung des Programms angezeigte Formular Form1 so zögerlich angezeigt, dass z.B. kaum noch ein Button im Formular gedrückt werden kann.
Wie kann ich diesen Fehler beheben?
-
Überleg Dir malgenau was Du da machst.Dann kommst Du selber drauf warum das so ist und wie Du das anders machen mußt.
-
Soweit ich weis hällt Synchronize das Hauptprogramm an um sicheren Zugriff auf die Komponenten zu ermöglichen.
Und wenn man dann immer wieder ohne Pause eine Methode mit Synchronize aufruft wird natürlich das Hauptprogramm blockiert.Ich sehe 2 Möglichkeiten:
- Den Thread immer für paar sekunden anhalten zwischen den Synchronize aufrufen.
- Dem Hauptprogramm Zeit geben Befehle zu verarbeiten
Hoffe das hilft dir.
-
Auf die hilfreichen Kommentare von MichelRT können wir hier alle verzichten!

Das mit dem Timer hilft nicht besonders viel, da immer noch während der Abarbeitung von Synchronize die Anwendung kurz gestoppt wird.
Gibt es denn keine Alternative zu Synchronize?
-
Wieso? er hat recht. Überlegt euch mal was euer Tun für Folgen für die restlichen Elemente hat. Dieser Aspekt geht nur allzuoft verloren.
Was Beliah da geschrieben hatte, hättest du beim Befolgen von MichelRTs Hinweis auch alles selber rausgefunden...
Oft genug finden sich hier Probleme die schlussendlich auf das Problem "Sie wissen nicht was sie tun" zurückzuführen ist.
-
Hilft mir jetzt aber leider auch nicht weiter, und da ich nunmal nicht jeden Tag mit C++-Programmierung verbringe, frage ich eben nun einmal die Experten.
Zudem:
Es gibt grundsätzlich keine blöden Fragen ..., sondern nur solche Antworten!
-
Reichlich unverfrorene Tonart für jemanden der um Hilfe bittet...
Du rufst in einer Schleife immer und immer wieder Synchronize(Pingen) auf, solange, bis der Thread, von außen, termininiert wird. Ist das tatsächlich das, was Du erreichen wolltest?
-
teacherwilli schrieb:
[...]
Das mit dem Timer hilft nicht besonders viel, da immer noch während der Abarbeitung von Synchronize die Anwendung kurz gestoppt wird.
[...]Das ist der Sinn von Synchronize, wenn die Anwendung normal weiterlaufen würde, könnte es zu Fehlern(Zugriffsfehlern?) kommen.
-
Die Lösung Deines Problems hat nichts aber auch gar nichts mit C++ zu tun, auch nicht mit dem BCB.
Was macht ein gestarteter Thread? Genau der läuft im Kreis rum bis ihn jemand stoppt und zwar so schnell wie durch Priorität und Betriebsystem eingestellt.
Was machst Du in dem Thread? Du aktualisierst irgendwelche VCL-Controls und zwar bei jedem Durchlauf. Auf dem Bildschirm was ausgeben kostet viel Zeit. Du machst das sehr oft. Was ist die Folge? Dein System geht ihn die Knie.Was ist folglich die Lösung? Ruf Dein Synchronise weniger oft auf. Wie macht man das? Zähle einfach Dein Threaddurchläufe mit und mach Synchronize z.B. nur bei jedem 20. Durchlauf.
Mit ein bißchen Überlegen wärst Du da selber drauf gekommen.Siehe mein Posting weiter oben.