Thread mit RS232



  • hm, meinst du das so?

    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "Unit2.h"
    #include <windows.h>
    #include <time.h>
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    
    //   Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur in
    //   in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
    //
    //      Synchronize(UpdateCaption);
    //
    //   wobei UpdateCaption so aussehen könnte:
    //
    //      void __fastcall Unit2::UpdateCaption()
    //      {
    //        Form1->Caption = "In Thread aktualisiert";
    //      }
    //---------------------------------------------------------------------------
    
    __fastcall PWM::PWM(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
     FreeOnTerminate = true;
    }
    void __fastcall PWM::UpdateCaption()
    {
    	Form1->Update();
            Form1->Caption = "In Thread aktualisiert";
    }
    //---------------------------------------------------------------------------
    void __fastcall PWM::Execute()
    {
     int b=0;
            //---- Hier den Thread-Code plazieren----
      Form1->Memo1->Lines->Add("-> Thread Arbeitet");
      for (int i=0; i<200000; i++){
         b=i;
         Form1->SpeedButton2->Caption = b;
       Synchronize(UpdateCaption);
       Sleep(0);
         }
      Form1->Memo1->Lines->Add (b);
    }
    

    und die Header

    #ifndef Unit2H
    #define Unit2H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    //---------------------------------------------------------------------------
    class PWM : public TThread
    {
    private:
    protected:
            void __fastcall Execute();
    public:
            __fastcall PWM(bool CreateSuspended);
             void __fastcall UpdateCaption(); //Unsere Synchronize-Methode.
    };
    //---------------------------------------------------------------------------
    #endif
    

    Das Synchronize ist dann abgeschlossen, richtig?
    Aber laufen tut es immer noch nicht.

    Im Beispiel beziehen die sich auf ein FileListBox->Update(), da ich sowas nicht habe, habe ich das HAuptformular gewählt.



  • Vielleicht solltest du aufhören einfach nur irgendwas zu kopieren und einzusetzen und dann zu hoffen es läuft und endlich mal nachdenken wieso du das machst... Falls du dich jetzt beleidigt fühlst, solltest du nochmals ganz genau ansehen was du gemacht hast.

    -junix



  • Ich fühl mich nicht beleidigt, keine Sorge 😉
    Hast ja prinzipiell recht!!
    Nur wenn ich das genau nachvollziehen könnte was ich da geschrieben(kopiert) habe, müsste ich hier nicht um Hilfe bitten.

    So wie du es schreibst muß es ein großer Bock sein, und ich werde ihn suchen.:)

    Sind ja bald Sommerferien!



  • Farnsworth schrieb:

    So wie du es schreibst muß es ein großer Bock sein,

    ja

    Lesen und nochmals nachdenken!

    //---------------------------------------------------------------------------
    
    //   Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur in
    //   in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
    


  • Ein Artikel (pdf-Format + sehr gut erklärt) über Threads im C++Builder



  • danke epsilon

    @´junix

    ich schätze hier steht was falsches drin

    void __fastcall PWM::UpdateCaption()
    {
    Form1->Update();
    Form1->Caption = "In Thread aktualisiert";
    }

    aber da ich in der unit1 die port.dll verwende und keine "komponenten" verwende die im Objekinspektor stehen weis ich jetzt nicht genau was ich stattdessen schreiben soll.



  • Schon mal nachgelesen was Synchronize so treibt? -> Borland Hilfe, TThread->Methoden, Synchronize



  • habs nachgelesen,

    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "Unit2.h"
    #pragma package(smart_init)
     int b=0;
    //---------------------------------------------------------------------------
    
    //   Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur in
    //   in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
    //
    //      Synchronize(UpdateCaption);
    //
    //   wobei UpdateCaption so aussehen könnte:
    //
    //      void __fastcall Unit2::UpdateCaption()
    //      {
    //        Form1->Caption = "In Thread aktualisiert";
    //      }
    //---------------------------------------------------------------------------
    
    __fastcall PWM::PWM(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
     FreeOnTerminate = true;
    }
    void __fastcall PWM::UpdateCaption()
    {
            Form1->SpeedButton2->Caption = b;
            Form1->Caption = "In Thread aktualisiert";
    }
    //---------------------------------------------------------------------------
    void __fastcall PWM::Execute()
    {
    
            //---- Hier den Thread-Code plazieren----
      Form1->Memo1->Lines->Add("-> Thread Arbeitet");
      for (int i=0; i<200000; i++){
         b=i;
    
       Synchronize(UpdateCaption);
       Sleep(0);
         }
      Form1->Memo1->Lines->Add (b);
    }
    

    hoffe richtig geändert, aber das Problem besteht weiterhin.



  • Farnsworth schrieb:

    hoffe richtig geändert,

    Naja nur die Hälfte leider...



  • Form1->Memo1->Lines->Add (b);
    den habe ich kurze Zeit später auskommentiert



  • trotzdem nur halbwegs..



  • ja ein feld hatte ich noch vergessen, aber daran scheint es auch nicht zu liegen.
    ich habe die 3 Verweise auf Form1 auskommentiert, und getestet.
    Das Problem besteht.
    Oder meinst du noch was anderes?



  • Danke an alle!

    Problem ist gelöst:)

    Durch diese kurzen Denkanstöße habe ich die Sache mit dem Thread auch besser verstanden, aber der Fehler lag woanders.
    Und zwar ausnahmsweise nicht bei mir:):)

    Der Autor der Port.dll hat eine neue Version der Datei herausgebracht die Probleme mit Windows XP löst.
    In der Schule hatten wir noch die alte verwendet.

    Mit der neuen gehts problemlos, sogar ohne Synchronize:)

    Gruß

    Farnsworth


Anmelden zum Antworten