Synchronize() --> SOS?



  • Und wieder eine Frage von mir. Ich komme mit der Erklärung der Methode Synchronize in der Hilfe absolut nicht zurecht. Irgendwo hängts.

    Kann mir einer mal netterweise die Verwendung verständlich machen?



  • Hallo

    Siehe zum Beispiel hier.

    bis bald
    akari



  • Ah ok danke.

    Das heisst also wenn Thread A auf das Formular zugreift muss ich im Thread A eine Funktion definieren, die ich dann mit Synchronize aufrufe.

    Aber nehmen wir mal an der Zugriff passiert nicht direkt aus dem Thread. Sondern ich habe eine Klasse Interface, die den Zugriff macht. Der Thread ruft eine Funktion dieser Klasse auf, die dann am Formular manipuliert. Wie sicher ich das ab? Mit einem TSynchObject?

    Oder noch abstrakter. Auf diese Funktion in der Klasse Interface greifen mehrere Threads zu.
    Wie sichere ich sowas ab? (Siehe meine anderen Posts. Da ist das ganze ausführlicher....)



  • Öhm.... Ok..... Hilfe?

    Formular. Im Formular liegt TThread Transceiver. Bekommt Adresse von Form übergeben. In Form existiert die Methode Fire.

    void __fastcall Transceiver::Send(void)
    {
    	form->Fire(Time(),"Thread","Geschickt",IntToStr(1));
    }
    //---------------------------------------------------------------------------
    void __fastcall Transceiver::Execute()
    {
    	int i=0;
    	while (Terminated==false) {
    		Synchronize(Send);
    	}
    }
    

    **
    [C++ Fehler] Transceiver.cpp(26): E2285 Keine Übereinstimmung für 'TThread::Synchronize(void)' gefunden**

    ???? Wo hängts??? Das ist doch exakt das BCB Beispiel...



  • Hey Shogun,

    gibts inzwischen ne Lösung? Habe ein ähnliches Problem - auch mit dem BCB-Tutorial erarbeitet!

    MfG



  • Tja, schwer zu sagen, am gezeigten Code liegt es nicht...



  • Die Lösung war PillePalle!

    &Funktionsname......

    Ganz einfach nur die Referenz übergeben... In KEINER Hilfe steht das! In KEINEM Beispiel...

    Synchronize(&Send)

    Das wars schon!

    Was ich noch gern hätte wäre der Operator ()..... Zum Parameter reinwerfen...



  • Hallo

    Kann das mit dem & jemand bestätigen? Habe grad keinen Builder hier.
    Falls das Tut wirklich fehlerhaft ist werd ich es korrigieren.

    Was meinst du mit Operator() ? Der nützt dir hier nichts. Du kannst Werte von Execute nach Send über Klassenmember austauschen.

    bis bald
    akari



  • 😮 .... bin ganz gespannt am Warten ...



  • akari schrieb:

    Kann das mit dem & jemand bestätigen?

    Jawoll ! 🙂

    TThread::Synchronize
    
    Executes Method within the main VCL thread.
    
    typedef void __fastcall (__closure *TThreadMethod)(void);
            void __fastcall Synchronize(TThreadMethod &Method);
    


  • 🙄 oh man - und ich such mir den ganzen Nachmittag die Augen blutig und denke mir das bißchen Hirn wund, was ich noch habe...

    Danke Shogun für's rausfinden und Danke merker für's ausprobieren und Danke akari, dass Du immer überall mindestens Denkanstösse gibst! 👍

    MfG



  • @akari: Das war jetzt kein Gemecker über das Tut an sich. Die BCB Hilfen geben das leider so schon wieder... Sowohl die BCB 6, als auch die vrpfuschte BCB 2006....

    Klar über Klassenmember habe ich es auch gelöst. Aber ich versuche mich nach wie vor dran zu halten Global ist kacke. Ne PArameterübergabe wär mir lieber gewesen. Aber egal. Funkt.

    Eben über die Definitionen die Merker da ausgebuddelt hat habe ich das gefunden. Aber auch erst nach dem 20. Lesen...

    Ich stelle hiermit den Antrag Synchronize als am Schlechtesten dokumentierte Funktion im BCB zu nominieren!

    PS: Ich hab diverse Wochen immer wieder mal gesucht... Ist echt nix zu finden LOL... Jedes Beispiel ist ohne &



  • Also mal ehrlich - wie verschlafen sind wir denn eigentlich alle? Ist nicht der Kommentar am Anfang der *.cpp des neuen Thread's des Rätsels Lösung, oder irre ich mich?

    //---------------------------------------------------------------------------
    
    //   Wichtig: Objekt-Methoden und -Eigenschaften in der VCL dürfen nur
    //   in einer Methode nur mir Synchronize aufgerufen werden, z.B.:
    //
    //      Synchronize(&UpdateCaption);
    //
    //   wobei UpdateCaption folgendermaßen aussehen könnte:
    //
    //      void __fastcall TRxDThread::UpdateCaption()
    //      {
    //        Form1->Caption = "Aktualisiert in einem Thread";
    //      }
    //---------------------------------------------------------------------------
    

    // Synchronize(**&**UpdateCaption); 😮

    Ich fass'es nicht! 🙄

    MfG



  • Hallo

    Shogun schrieb:

    @akari: Das war jetzt kein Gemecker über das Tut an sich. Die BCB Hilfen geben das leider so schon wieder... Sowohl die BCB 6, als auch die vrpfuschte BCB 2006....

    Das habe ich auch nicht als Gemecker aufgefast. Wenn unserer Tutorial fehlerhaft ist muß es korrigiert werden.

    Klar über Klassenmember habe ich es auch gelöst. Aber ich versuche mich nach wie vor dran zu halten Global ist kacke. Ne PArameterübergabe wär mir lieber gewesen. Aber egal. Funkt.

    Ja Global ist meistens die schlechte Lösung. Aber Klassenmember sind nunmal nicht global. Und einer void-Funktion kannst du wirklich keine Parameter übergeben.

    bis bald
    akari



  • Bei mir funktionieren beide Versionen. Ich hab den BCB 6. Die Synchronize-Beispiele funktionieren bei mir also auch, wie in der Hilfe beschrieben.

    Ist es vielleicht ein neues 'Feature' des BDS 2006?



  • Hallo

    In meinem BCB 5 hier kompiliert auch beides.
    Können mal bitte die User mit den neueren Builder-Version bei sich das testen und hier Resultat und Builder-Version angeben?

    Builder-Version   Läuft mit &   Läuft ohne & 
    5                 1             1   
    6                 1             1     
    ...
    Studio 2006       1             0
    

    Dann werde ich ins Tutorial einen entsprechenden Hinweis einbauen.

    bis bald
    akari



  • Bei mir läufts nur mit &.

    Edit: Borland® Developer Studio für Microsoft® Windows™ Version 10.0.2166.28377 Update 1



  • Borland® C++Builder® für Microsoft® Windows™ Version 10.0.2288.42451 Update 2

    Synchronize(&Function) 1
    Synchronize(Function) 0



  • Hallo

    Zwischen BCB 6 und dem Studio 2006 gibt es doch noch andere Versionen. Gibt es hier keinen der diese hat und das bitte mal testen kann?

    bis bald
    akari



  • und welche bitte?
    Es gibt für den BCB6 und dem BDS2006 noch verschiedene Builds sowie Patchstufen aber keine weiteren Versionen.



  • Hallo

    Echt? Dachte da gabs noch eine Studio-Version vor dem 2006er. Gut dann kann ich die Umfrage beenden und im Tutorial eintragen das bei Studio das & hinmuß. Bzw. das es am besten immer verwendet werden sollte.

    bis bald
    akari


Anmelden zum Antworten