"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; //--------------------------------------------------------------------------- #endifJetzt 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; #endifUnd 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