C++ Builder XE10 - Variierende Threadgeschwindigkeit



  • Hallo zusammen,
    ich habe auf die schnelle ein simples Beispielprojekt erstellt wo einfach nur ein Thread erzeugt wird und dieser eine Art Timer im Millisekundentakt auf der VCL Form darstellt. Ist die Entwicklungsumgebung geladen wird die Darstellung der Millisekunde in Echtzeit im Label auf der Form dargestellt, die Standalone-Exe läuft hingegen sehr zeitverzögert bzw. viel langsamer ab. Selbst wenn die Standalone läuft und ich nur den C++ Builder im Hintergrund zu dessen Laufzeit einfach hinzu starte, läuft das Programm plötzlich wieder in Echtzeit. Da ich dieses Verhalten noch nie beobachten konnte frage ich mich, ob jemand von euch weiß was es auf sich hat.

    Form1

    void __fastcall TForm1::TerminateThread(TObject *Sender)
    {
       TThread *apointer = dynamic_cast <TThread*> (Sender);
       Label6->Caption = apointer->ThreadID;
       apointer->Terminate();
    
       Label1->Caption = "Terminated";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	if(newthread)
       {
    	 newthread->Terminate();
    	 newthread = NULL;
       }
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    	if(!newthread)
       {
    	 newthread = new MyThread(false);
    	 newthread->OnTerminate = TerminateThread;
    	 Label4->Caption = newthread->ThreadID;
    	 Label6->Caption = "unknown";
       }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    	if(newthread)
    	newthread->Terminate();
    }
    //---------------------------------------------------------------------------
    

    Thread

    //---------------------------------------------------------------------------
    __fastcall MyThread::MyThread(bool CreateSuspended)
    	: TThread(CreateSuspended)
    {
        this->Priority =  tpNormal;
    	this->FreeOnTerminate = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall MyThread::Execute()
    {
    
    	   int interval = 10000;
    
    	   while(!this->Terminated)
    	   {
    		   for(int i = 0; i < interval && !this->Terminated; i++)
    		   {
    			  Sleep(1);
    
    			  timer = IntToStr(i++);
    
    			  /*
    			  if(timer.Length() == 4)
    			  timer = timer.SubString(1,1);
    			  else
    			  timer = 0;
                 */
    
    			  Synchronize(&ShowOnGUI);
    		   }
           }
    
    }
    //---------------------------------------------------------------------------
    void __fastcall MyThread::ShowOnGUI()
    {
    
    	   Form1->Label1->Caption = timer;
    
    }
    //---------------------------------------------------------------------------
    


  • Hi,

    mit dem C++Builder mache ich ja nicht mehr viel, aber letztlich liegt da ja das gleiche wie bei Delphi drunter, und da gibt es die zwei Möglichkeiten, mit Laufzeitbibliotheken linken, oder die entsprechenden DLLs bereitstellen. Könnte mir vorstellen, dass das vielleicht einen Einfluss hat.

    Gruß Mümmel



  • Ein Sleep() unterhalb von 14 ms ist in Windows nicht deterministisch. Du solltest wenn Echtzeit eine Anforderung ist, auf QNX oder evtl. falls möglich Unix und Derrivate wechseln.
    Edit: Kleiner Spaß am Rande: Mit Windows fliegt man nicht zum Mars 🙂



  • Du kannst aber auf Gerätschaften wie Performancecounter setzen, die haben eine sehr gute Auflösung.



  • Vielen Dank für eure Statements. Warum funktioniert es aber dann mit sehr geringen Schwankungen (die Gründe habt ihr ja bereits genannt) sobald die IDE geladen ist?

    Ich glaube die Antwort gefunden zu haben indem die IDE im Debuging Mode TThreads höher Priorisiert ausführt. Die Zuweisung tpNormal ist mir in einem anderen Projekt schon wieder vor die Füsse gefallen obwohl dies laut Beschreibung der Defaultwert sein sollte. Lasse ich die Zuweisung weg oder priorisiere höher sind die Probleme verschwunden. Ich hatte noch nicht die Gelegenheit es mit diesem Beispiel zu verifizieren und werde dies nachholen


Anmelden zum Antworten