"Method called on invalid object" beim Zugriff auf eine Methode eines Threads



  • Hallo,

    ich habe folgendes Problem. Zuerst der Quellcode in einem verinfachten Projekt:
    Unit1.cpp:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    TTest *TestThread;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      int x;
      FTThread = new TTest(false);
      FTThread->Priority = tpHighest;//tpTimeCritical;
      FTThread->OnTerminate = DeleteThread;
    
      Sleep(500);
      x=TestThread->GetTest();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::DeleteThread(TObject* Sender)
    {
      FTThread->Terminate();
    }
    

    Unit1.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            void __fastcall Button1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
            void __fastcall TForm1::DeleteThread(TObject* Sender);
    public:		// Anwender-Deklarationen
            TThread*   FTThread;
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Jetzt einen Thread der durch das Klicken auf den Button gestartet wird:
    Unit2.cpp:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit2.h"
    #pragma package(smart_init)
    
    __fastcall TTest::TTest(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
      FreeOnTerminate = true;
    }
    //---------------------------------------------------------------------------
    void TTest::SetName()
    {
            THREADNAME_INFO info;
            info.dwType = 0x1000;
            info.szName = "Test";
            info.dwThreadID = -1;
            info.dwFlags = 0;
    
            __try
            {
                     RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info );
            }
            __except (EXCEPTION_CONTINUE_EXECUTION)
            {
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TTest::Execute()
    {
            SetName();
            //---- Hier den Thread-Code plazieren----
            do
              {
              Sleep(100);
              Application->ProcessMessages();
              }
            while (!this->Terminated);
    }
    //---------------------------------------------------------------------------
    
    int __fastcall TTest::GetTest()
    {
      return 5;
    }
    

    Der zugehörige Header Unit2.h:

    //---------------------------------------------------------------------------
    
    #ifndef Unit2H
    #define Unit2H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    //---------------------------------------------------------------------------
    class TTest : public TThread
    {
      typedef struct tagTHREADNAME_INFO
      {
        DWORD dwType;     // muß 0x1000 sein
        LPCSTR szName;    // Zeiger auf Name (in user addr space)
        DWORD dwThreadID; // Thread-ID (-1=caller thread)
        DWORD dwFlags;    // Reserviert für spätere Verwendung, muß 0 sein
      } THREADNAME_INFO;
    private:
      void SetName();
    protected:
            void __fastcall Execute();
    public:
            __fastcall TTest(bool CreateSuspended);
           int __fastcall TTest::GetTest();
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TTest *TestThread;
    #endif
    

    Und jetzt das eigentliche Problem: Aus Unit1.cpp rufe ich int GetTest() auf. Dort wird zum Test der Wert 5 zurückgegeben. Wenn ich die Code Guard Überprüfung eingschaltet habe, bekomme ich beim Zugriff auf GetTest() die Fehlermeldung "Method called on invalid object". Wenn die Überprüfung abgeschaltet ist, wird der Wert 5 korrekt zurückgegeben...Warum?

    Grüße,
    Jochen



  • In deiner H-Datei steht:

    int __fastcall TTest::GetTest();
    

    Lass das TTest:: an dieser Stelle weg.

    Nachtrag:
    Auch in der anderen H-Datei hast du den gleichen Fehler gemacht in der Klasse TForm1.



  • Hi,

    Burkhi schrieb:

    Lass das TTest:: an dieser Stelle weg.

    Nachtrag:
    Auch in der anderen H-Datei hast du den gleichen Fehler gemacht in der Klasse TForm1.

    habe ich geändert, ohne Erfolg.

    Jochen



  • Hi,

    hat sonst keiner eine Idee warum es zu dieser Meldung kommt?

    Grüße,
    Jochen


Anmelden zum Antworten