Systemabsturz beim Starten eines threads



  • Hallo zusammen

    Beim Ausführen folgendem Code, stürzt das Programm bei Zeile 30 ab wenn ich den thread starte.

    #include <vcl.h>
    #pragma hdrstop
    
    #include "sthred_frm.h"
    #include <thread>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    Tfrm_thred *frm_thred;
    //---------------------------------------------------------------------------
    __fastcall Tfrm_thred::Tfrm_thred(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall Tfrm_thred::btn_einsClick(TObject *Sender)
    {
    	unsigned int n_i{0};
    
    	n_i = StrToIntDef( edt_eins->Text, 0 );
    	n_i++;
    	edt_eins->Text = IntToStr( (__int64) n_i );
    }
    //---------------------------------------------------------------------------
    
    void __fastcall Tfrm_thred::btn_zweiClick(TObject *Sender)
    {
    	run();
    	std::thread th_eins( run );//SYSTEM_EXCEPTION
    }
    //---------------------------------------------------------------------------
    void Tfrm_thred::run( void )
    {
    	unsigned int n_i{0};
    
    	for(n_i; n_i < 1000000; n_i++)
    	{
    		edt_eins->Text = IntToStr( (__int64) n_i );
    		Application->ProcessMessages();
    	}
    }
    

    Kann mir jemand sagen was ich da falsch mache. Ich selber habe keine Idee mehr.

    Gruss Renato



  • 1. Systemabsturz != Programmabsturz

    2. aus Hintergrundthreads darfst du nicht auf VCL-Komponenten zugreifen; wenn du das machen willst, mußt du TThread::Synchronize() oder TThread::Queue() benutzen

    3. Was soll das Application->ProcessMessages(); da? Wer das benutzt, macht meistens was falsch; wer das aber von einem anderen Thread aus aufruft, macht immer was falsch.



  • audacia schrieb:

    ...
    2. aus Hintergrundthreads darfst du nicht auf VCL-Komponenten zugreifen; wenn du das machen willst, mußt du TThread::Synchronize() oder TThread::Queue() benutzen
    ...

    Ausserdem sollte man dann auch die TThread Klasse der VCL benutzen.



  • Ciao audacia

    Noch eine Frage zu Punkt 3. Ich verwende das Konstruckt

    Application->ProcessMessages();
    

    damit die Schlaufe unterbrochen wird und im Editfeld was angezeigt wird. Sonst läuft die Schlaufe durch und erst zum Schluss wird ein Wert ausgegeben.
    Ich dachte, dass ich schlau bin, wenn ich das so mache. Wie kann ich diesen Fehler ausbügeln?

    Gruss Renato



  • Robbiani schrieb:

    damit die Schlaufe unterbrochen wird und im Editfeld was angezeigt wird. Sonst läuft die Schlaufe durch und erst zum Schluss wird ein Wert ausgegeben.
    Ich dachte, dass ich schlau bin, wenn ich das so mache. Wie kann ich diesen Fehler ausbügeln?

    Wenn du, wie ich geschrieben habe, einen Aufruf von z.B. TThread::Synchronize() benutzt, um auf edit_eins->Text zuzugreifen, dann sollte die Änderung sofort sichtbar werden.



  • Ciao audacia

    Gut, dann mache ich mich an die Arbeit um es aus zuprobieren.

    Gruss Renato



  • Hei! das geht ja ganz einfach. Die IDE nimmt einem sehr viel Arbeit ab und in der Hilfe ist alles ganz gut und ausführlich beschrieben. Ich muss mich da noch einbisschen einlesen. Auf jeden Fall ist es einfach.

    Unter Datei->neu > weiter kann man unter C++ Builder-Dateien ein Thread-Objekt auswählen. Doppelklicken einen Namen vergeben und schon hat man ein Grundgerüst.

    Eine Frage habe ich noch:
    Mein Thread stürzt zwischen 300 und 400 ab. Weiss jemand warum?

    Herzlichen Dank für die schnelle Hilfe.

    Gruss Renato



  • Daß du es aber auch nie lernst.



  • Herzlichen Dank für eure Geduld und Verständnis. Wenn jemand mal in der nähe von Bern vorbei kommt. Kriegt er ein Bier von mir.

    Gruss Renato



  • Falls es nicht rübergekommen ist: ich wollte darauf hinweisen, daß eine Aussage wie

    Robbiani schrieb:

    Mein Thread stürzt zwischen 300 und 400 ab.

    derart unspezifisch ist, daß es nicht möglich ist, darauf sachgemäß zu antworten. Die offensichtlichen Fragen, die sich jedem Mitlesenden stellen:

    - du schreibst "Mein Thread", aber die Implementation desselben behältst du für dich. Wie sieht er denn nun aus, dein Thread, und was genau macht er? Quelltext bitte.
    - was ist "zwischen 300 und 400"? Gut, das wird sich wohl auf die Schleife oben beziehen.
    - was heißt "stürzt ab"? Der Thread produziert einfach keine Ausgabe mehr? Oder crasht das Programm? Falls ja, mit welcher Fehlermeldung und welchem Stacktrace?

    Mein Posting oben war etwas grob, sorry.



  • Ciao audacia

    Danke für deine ausführliche Antwort. Ich bin mir bewusst, dass wenn ich im Eifer bin, einfach das wichtigste vergesse.
    Daher werde ich in Zukunft am Tag darauf nochmals meine Meldung lesen und gegebenenfalls ergänzen.

    Es tut mir leid, wenn ich dich geärgert habe. Aber ich nehme alles nicht so ernst. Ich entwickle meine Projekte in der Freizeit. Daher möchte ich, dass es mir Spass macht. Gut ich möchte auch Spass bei der Arbeit. Auf jeden Fall macht mir der BCB Spass.

    Gruss Renato



  • Ich habe ich den Eindruck, das es leider immer weniger werden, denen der BCB Spass macht. 😞

    Robbiani schrieb:

    Ciao audacia
    ... Auf jeden Fall macht mir der BCB Spass.

    Gruss Renato

    Von daher ist es schön, das auch von dir zu hören, denn das tut er mir seit nunmehr fast 20 Jahren, zumindest überwiegend. 👍



  • Burkhi schrieb:

    Ich habe ich den Eindruck, das es leider immer weniger werden, denen der BCB Spass macht. 😞

    Ich meine, Embarcadero bemüht sich ja und nimmt Geld in die Hand, um ihr Produkt voranzutreiben. Aber viele Dinge laufen einfach in die falsche Richtung und gehen glatt am Kunden vorbei. Erst Mitte 2015 mit einem C++11 fähigen 32 Bit Compiler aufzuwarten ist schon ziemlich spät.

    Ich wiederhole mich, wenn ich sage, dass Embarcadero irgendwie den Fokus verloren hat. Die neuen Releases des RAD Studio werden mit immer mehr 3rd Party Produkten und mehr unterstützten Plattformen überfrachtet. Man versucht, die eierlegende Wollmilchsau zu erfinden und verliert dabei das eigentlich Ziel aus den Augen (aus meiner Sicht als C++ Entwickler: eine funktionierende Umgebung, mit der man produktiv arbeiten kann). Viele Neuerungen unterscheiden sich von den Eigenschaften oder Verhalten alter Projekte und funktionieren entweder anders oder auch gar nicht. Allein die Umstellung von AnsiString auf UnicodeString stellt in meinen Augen eine unverantwortliche Veränderung dar, weil sie den Code bestehender Projekte bricht.

    Die immer schneller werdenden Versionssprünge mit der daher einhergehenden Notwendigkeit 3rd Party Bibliotheken zu aktualisieren ist auch ein Minuspunkt für das Studio. Ein typisches Upgrade Szenario sieht so aus:
    Statt eines Fixes/Updates wird ein neues Major Release auf den Markt geworfen:
    -> 3rd Party Produkte lassen sich für das neue Release nicht installieren, da sie die aktuelle Studio Version nicht kennen.
    -> Kleinere Produkthersteller bekommen das neue Studio auch erst mit dem aktuellen Verkaufstermin und müssen ihr Produkt portieren und testen. Das führt dazu, dass man erst einige Wochen oder vllt Monate später eine Version für das aktuelle Studio bekommt. Wenn man eine Subscription für das Produkt hat, ansonsten muss man es neu kaufen. Für jeden Entwickler. Anschließend testet man wieder, ob sich nicht neue Bugs eingeschlichen haben. Alles in allem sehr mühselig, zeitraubend und damit teuer.

    Wir haben aufgrund von falscher Beratung des Embarcadero Vertriebs erst den XE8 gekauft, um dann kurze Zeit später das RAD Studio 10 zu kaufen. Aufgrund mind. eines kritischen Bugs möchten wir weder den clang Compiler des RAD Studio 10 einsetzen (RSP-13813 noch können wir den klassischen Compiler einsetzen (ständige Internal Compiler oder Linker Error).
    Support? Fehlanzeige. Da fällt es mir wirklich schwer, noch ein gutes Wort über das Studio zu verlieren.

    Embarcadero verkauft keine Lösungen, sondern Produkte. Wenn sie Lösungen verkaufen würden wären sie daran interessiert, dass ihre Kunden ihre Produkte einsetzen können, um produktiv zu arbeiten. Tun sie aber nicht. Embarcaderos Motto ist Fire & Forget: Ihr habt gekauft, damit seid ihr für uns uninteressant. Seht zu, wie ihr mit dem Studio klarkommt.

    Ich weiß nicht, wie andere Hersteller (Microsoft, Intel, etc.) das halten, ich kenne nur Embarcadero. Vielleicht sieht´s bei den anderen auch nicht besser aus.



  • Ich denke, dass es den BCB nicht mehr lange auf dem Markt geben wird. Da ich privat damit arbeite, ist dies für mich nicht so schlimm. Ich bleibe einfach auf der letzten Version sitzen.

    Für mich ist das RAD-Studio eine supper Ding. Damit komme ich doppelt so schnell zu einem Ziel als mit einer anderen Umgebung. RAD-Studio nimmt viel der rutiene Arbeiten ab. Genau dies schätze ich an diesem Werkzeug.

    Zugegeben, es ist störend, dass gewaltige Bugs seit Jahren mit jedem Release mitgenommen werden. Wenn du dann im Support nachfragst, wird dann alles negiert und behaubtet, dass es bei ihnen läuft. Das ist echt scheise, zumal das Teil nicht ganz gratis ist.

    Auch ist die agresive Verkaufspolitik störend. Mich haben sie sogar angerufen ob ich mir nicht die neuste Version kaufen will. Aber ich kann nicht jedes Jahr 2000 € in mein Hobby investieren.

    Nun ich schaue mal zu wie sich das ganze entwickelt. Trotz allen wiedrigen Umständen arbeite ich sehr gerne mit dem RAD-Studion.

    Gruss Renato



  • Robbiani schrieb:

    Es tut mir leid, wenn ich dich geärgert habe.

    Hast du nicht. Aber wenn du möchtest, daß wir dir beim Lösen deines Threading-Problems helfen können, dann beantworte doch meine Fragen oben.

    Robbiani schrieb:

    Auf jeden Fall macht mir der BCB Spass.

    Sei froh 🙂 Möge es so bleiben.

    DocShoe schrieb:

    ...

    Das faßt wohl die meisten der Probleme gut zusammen. Nachdem nun die meisten "großen Schritte" (Android- und iOS-Targets, OS X, ein Clang-basierter C++-Compiler, ein 64-Bit-Compiler) getan sind, könnte man meinen, daß jetzt ein paar Zyklen gründliche QA dran wären. Aber das verkauft sich halt nicht (denken sie), deshalb werden ihnen schon ein paar neue unreife Features einfallen, die sich im Datenblatt gut machen. Und auch wenn die Änderungen in der Lizenzierung (Updates nur noch für Subscription-Kunden) aktuell im Trend liegen, finde ich sie schwer erträglich.

    Das einzige, was mich im Moment bei Delphi/C++Builder hält, ist die VCL.

    DocShoe schrieb:

    Ich weiß nicht, wie andere Hersteller (Microsoft, Intel, etc.) das halten, ich kenne nur Embarcadero. Vielleicht sieht´s bei den anderen auch nicht besser aus.

    Ich habe die Entwicklung von Visual C++ über die letzten paar Versionen mitverfolgt und muß sagen, ich bin beeindruckt. Die Compiler-Codebasis des VC++-Compilers ist sicher ähnlich alt wie die des BCC, und der Rückstand ggü. GCC und Clang war auch ähnlich, aber mittlerweile unterstützt VC++ fast das komplette C++14. GCC und Clang machen einige Sachen noch besser, aber die Unterschiede schwinden.



  • Ciao Audiaca

    Das Problem mit dem Thread konnte ich selber lösen. Manchmal muss man einfach nur mal durchatmen. Ich habe aber schon wieder ein neues Problem. Dies im Zusammenhang mit den Threads. Dazu möchte ich aber einen Douwnload anbieten. Dies muss ich aber noch vorbereiten. Danach erstelle ich einen neuen Beitrag.

    also bis bald.

    Gruss Renato


Anmelden zum Antworten