Win32 native Thread mit VCL Hauptthread synchronisieren



  • Hallo,

    ich habe einen native Win32 Thread, der mir Daten liefert. Nun möchte ich diese Daten in einem Formular darstellen, und dazu muss ich den VCL Hauptthread benutzen. Wie bekomme ich den Win32 Thread mit dem VCL Thread synchronisiert? In der Klasse TThread gibt es eine Synchronize() Methode, die ich allerdings nicht benutzen kann, weil ich einen Win32 Thread habe.



  • Das Problem hatte ich auch.

    Ich habe dann einfach die Daten in geiegnete Variablen geschrieben und einen weiteren TThread erzeugt der die Daten dann aktualisiert.

    MfG



  • Wie es in deiner C++Builder-Version ist, weiß ich nicht, aber in C++Builder 2009 hat TThread die folgenden Methoden:

    class PASCALIMPLEMENTATION TThread : public System::TObject
    {
    	...
    public:
    	...
    	__classmethod void __fastcall Queue(TThread* AThread, TThreadMethod AMethod)/* overload */;
    	__classmethod void __fastcall RemoveQueuedEvents(TThread* AThread, TThreadMethod AMethod);
    	__classmethod void __fastcall StaticQueue(TThread* AThread, TThreadMethod AMethod);
    	__classmethod void __fastcall Synchronize(TThread* AThread, TThreadMethod AMethod)/* overload */;
    	__classmethod void __fastcall StaticSynchronize(TThread* AThread, TThreadMethod AMethod);
    	__classmethod void __fastcall Queue(TThread* AThread, _di_TThreadProcedure AThreadProc)/* overload */;
    	__classmethod void __fastcall Synchronize(TThread* AThread, _di_TThreadProcedure AThreadProc)/* overload */;
    

    __classmethod ist neu in C++Builder 2009. Sofern das in C++Builder 2007 bereits existiert, dürfte es etwa so aussehen:

    class PASCALIMPLEMENTATION TThread : public System::TObject
    {
    	...
    public:
    	...
    	static void __fastcall Queue(TMetaClass* Self, TThread* AThread, TThreadMethod AMethod)/* overload */;
    	static void __fastcall RemoveQueuedEvents(TMetaClass* Self, TThread* AThread, TThreadMethod AMethod);
    	static void __fastcall StaticQueue(TMetaClass* Self, TThread* AThread, TThreadMethod AMethod);
    	static void __fastcall Synchronize(TMetaClass* Self, TThread* AThread, TThreadMethod AMethod)/* overload */;
    	static void __fastcall StaticSynchronize(TMetaClass* Self, TThread* AThread, TThreadMethod AMethod);
    	static void __fastcall Queue(TMetaClass* Self, TThread* AThread, _di_TThreadProcedure AThreadProc)/* overload */;
    	static void __fastcall Synchronize(TMetaClass* Self, TThread* AThread, _di_TThreadProcedure AThreadProc)/* overload */;
    

    Es sollte also auch aus einem Win32-Thread heraus möglich sein, eine dieser Methoden aufzurufen:

    #ifdef __CODEGEARC__ // C++Builder 2009 unterstützt __classmethod
      TThread::Synchronize (0, TheSynchronizedMethod);
    #else
      TThread::Synchronize (__classid (TThread), 0, TheSynchronizedMethod);
    #endif
    

    Und bevor du fragst: ja, es ist legal, als Thread 0 zu übergeben. Es sollte aber auch möglich sein, TThread::CurrentThread zu übergeben.



  • Nein, ich frage nicht, ob´s legal ist. Oft hat der Wert 0 eine Bedeutung wie Default oder automatisch Bestimmen, wird schon passen.

    Unter BCB6 gibts keine statische Funktion der Klasse TThread, aber da ich gerade dabei bin, alles nach CG2007 zu portieren werde ich mir das noch einmal ansehen, wenn ich die Projekte kompilieren kann.

    Danke für den Hinweis.



  • DocShoe schrieb:

    Nein, ich frage nicht, ob´s legal ist.

    Na, hätte ja sein können 😉


Anmelden zum Antworten