Thread und Synchronize und Zugriffe



  • Hallo zusammen,

    ich hoffe ihr könnt mir mal wieder helfen.

    die Verarbeitung eines Thread erzeugt bei mir Werte die in einem Array abgelegt werden. der Thread läuft ohne VCL Objekte und kann daher ohne Synchonize laufen.

    mittels einem Anderen thread würde ich jetzt gerne auf dieses Array zu greifen. Dieser Thread verarbeitet auch VCL objete und ist deswegen synchonisiert.

    Reicht es mittesls Setter/Getter auf das Array zu zu geifen oder muss ich noch etwas beachten damit nicht zufällige zugriffsverletzungen entstehen?



  • Hallo,

    wenn der eine Thread nur lesend darauf zugreift und der andere nur schreibend, gibt das keinerlei Probleme (ausser ev. "springende" Werte, weil der eine Thread beim schreiben einer Integerzahl unterbrochen wird und bspw. das Highword noch den alten wert hat und dieser dann grad ausgelesen wird) , vorausgesetzt, dass das Array nicht mal irgendwie wieder freigegeben wird und der lesende oder schreibende Thread davon nix mitbekommt.

    Am saubersten ist es, eine CriticalSection zu benutzen.



  • Danke,

    das werde ich mir mal anschauen.

    Eine Andere Frage noch...

    Wann genau muss eigenlich synchronize benutzt werden? immer wann man auf eine VCL Komponente zugreift oder nur wenn es um visualisierung geht?

    class TTest: public TObject
    {
    	//...
    		public:
    			void __fastcall Berechnung();
    	//...
    };
    
    class TMyThread: public TThread
    {
    	//...
    	protected:
    		void __fastcall  Execute()
    		{
    			while(!Terminated)
    			{
    				Berechnung();
    //				oder
    				Synchronize(Berechnung);
    			}
    
    		}
    };
    

    muss es jetzt synchonisiert werden nur weil die klasse von VCL geleitet ist?



  • JBOpael schrieb:

    Wann genau muss eigenlich synchronize benutzt werden? immer wann man auf eine VCL Komponente zugreift oder nur wenn es um visualisierung geht?

    Wenn du auf VCL-Komponenten zugreifst, mußt du serialisieren. Wenn TTest::Berechnung() nur threadsichere Dinge tut und keine VCL-Komponenten anfaßt, kannst du es natürlich im Thread ausführen.

    TTest ist übrigens nicht "von VCL geleitet", sondern erbt von TObject aus der Delphi-RTL. RTL != VCL. Und es gibt sogar einige VCL-Klassen, die du gefahrlos in Threads benutzen kannst, solange du separate Instanzen verwendest, die nicht gleichzeitig vom Main-Thread benutzt werden; etwa TPicture und TBitmap.

    Edit: TObject und TThread velwechsert



  • audacia schrieb:

    ... mußt du serialisieren.

    Du meinst wohl "synchronisieren" 😉



  • Th69 schrieb:

    audacia schrieb:

    ... mußt du serialisieren.

    Du meinst wohl "synchronisieren" 😉

    Die Anweisungen serialisieren, also in serieller Folge ausführen, reicht üblicherweise. Aber ja, konventionellerweise benutzt man dazu Synchronize() und führt die Methode gleich im Main-Thread aus.


Anmelden zum Antworten