MultiThrading Probleme mit Speicher
-
Hallo peterus,
vielleicht kannst du uns einen Code-Schnipsel geben, wo zu Erkennen ist, wie und wo der neue Thread erzeugt wird und wie die Methoden des neuen Thread's aussehen.
//Haupt-Thread Unit1.cpp //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { new TMyThread(false); } //---------------------------------------------------------------------------//Neuer Thread TMyThread Unit2.cpp //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit2.h" #include "Unit1.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // Important: Methods and properties of objects in VCL can only be // used in a method called using Synchronize, for example: // // Synchronize(&UpdateCaption); // // where UpdateCaption could look like: // // void __fastcall TMyThread::UpdateCaption() // { // Form1->Caption = "Updated in a thread"; // } //--------------------------------------------------------------------------- void __fastcall TMyThread::GuiElements() { Form1->Label1->Caption = "TEST"; } //--------------------------------------------------------------------------- __fastcall TMyThread::TMyThread(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; } //--------------------------------------------------------------------------- void __fastcall TMyThread::Execute() { Synchronize(GuiElements); } //---------------------------------------------------------------------------//Header Datei des neuen Thread's TMyThread //--------------------------------------------------------------------------- #ifndef Unit2H #define Unit2H //--------------------------------------------------------------------------- #include <Classes.hpp> //--------------------------------------------------------------------------- class TMyThread : public TThread { private: protected: void __fastcall Execute(); void __fastcall GuiElements(); public: __fastcall TMyThread(bool CreateSuspended); }; //--------------------------------------------------------------------------- #endifSo sollte das ja funktionieren. Wenn es bei deinem Projekt nicht funktioniert, muss irgendwo anders der Fehler liegen.
P.S.: Wo liegt eigentlich der Unterscheid zwischen <<Synchronize(GuiElements)>> und <<Snychronize(&GuiElements)>> ???
Ich benutze jedenfalls immer die zweite Variante? Wäre schön wenn da noch ein bisschen Licht ins Dunkle käme...
-
Klingt nach einem nicht initialiesrtem Zeiger. Bist Du sicher, das Form1 und LTime gültige Instanzen haben? Falls sie korrekt erzeugt werden, überschreibst Du sie möglicherweise an anderer Stelle.
@StafanN: In meinem BCB6 funktioniert nur die Version ohne Adressoperator. Welche Version verwendest Du denn?
-
Ich hab den Fehler gefunden

wenn mann
#include "Unit1.cpp"anstatt von
#include "Unit1.h"im Unit2.cpp verwendet ist das schon ein leichter unterschied

Thx für die Hilfe!
Lg Peterus
Edit: das mit dem & geht bei mir auch (Version 6)! aber auch die ohne &
-
Öh?!? Man inkludiert neimals CPP-Dateien, immer nur Headerdateien. Da ist noch irgendetwas nicht richtig.
-
Hallo,
@Joe_M, ich benutze den C++ Builder 2007. Habe mich immer an die von Borland vorgegebene Syntax gehalten:
//--------------------------------------------------------------------------- // Important: Methods and properties of objects in VCL can only be // used in a method called using Synchronize, for example: // // Synchronize(&UpdateCaption); <--------------------------------------- // // where UpdateCaption could look like: // // void __fastcall TMyThread::UpdateCaption() // { // Form1->Caption = "Updated in a thread"; // } //---------------------------------------------------------------------------Mit und ohne Adressoperator wird die Synchronize Methode ordnungsgemäß ausgeführt, ohne dass ich einen Unterschied erkennen kann.
-
StefanN schrieb:
Mit und ohne Adressoperator wird die Synchronize Methode ordnungsgemäß ausgeführt, ohne dass ich einen Unterschied erkennen kann.
Wäre nicht das erste Mal, dass in einer Nachfolgeversion so etwas geändert wird...
@peterus: Das Formular (Form1) wird automatisch erzeugt, falls Du das dynmanisch erzeugst könnte das schon der Fehler sein... Heute werde ich keine Zeit mehr haben, aber falls Du das Problem morgen noch nicht gelöst hast, kannst Du mir das Projekt mal zukommen lassen, dann schau ich mal drüber.
-
@Joe_M.:
Danke, aber es geht e schon! funkt alles

-
Das hattest Du gelesen?
Joe_M. schrieb:
Öh?!? Man inkludiert neimals CPP-Dateien, immer nur Headerdateien.
-
Joe_M. schrieb:
Das hattest Du gelesen?
Joe_M. schrieb:
Öh?!? Man inkludiert neimals CPP-Dateien, immer nur Headerdateien.
Ja hab ich

Bin auf den Fehler leider zu spät draufgekommen...
Aber wie ich immer sage: Durch Fehlern lernt man
-
Ok, ich hatte es falsch verstanden. Ich dachte Du hättest die Headerdatei rausgenommen und die CPP reingenommen, aber offensichtlich war es genau anders herum.
Eklärt aber die Probleme, die Du hattest.