Thread bringt Programm zum Absturz
-
Hi,
Wenn ich mit nachfolgendem Code ein Bild anklicke, so stürzt das Programm ab. Bis zu der Codezeile die den Thread startet komme icha uch ohne Propleme, doch die Funktion im Thread wird nichtmehr ausgeführt. Programm stürzt ab.
Führe ich die Funktion ohne Thread aus so klappt alles wie geplant.
//***************// //Thread bringt programm zum absturz #pragma once #pragma comment(lib, "DevIL.lib") #pragma comment(lib, "ILU.lib") #include "IL\il.h" #include "IL\ilu.h" #include <string> #include <vcclr.h> #include "windows.h" using namespace std; string a_pfad = ""; struct s_scale { char* in; char* out; int size; }; namespace Bildload_alpha_1 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Zusammenfassung für Form1 /// /// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch /// die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern, /// das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt. /// Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen /// arbeiten, die diesem Formular zugewiesen sind. /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // //Init IL ilInit(); iluInit(); } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::PictureBox^ c_vorschau; private: System::Windows::Forms::MenuStrip^ c_menu; protected: private: System::Windows::Forms::ProgressBar^ c_status_bar; private: System::Windows::Forms::Button^ c_upload; private: System::Windows::Forms::TextBox^ c_pfad; private: System::Windows::Forms::Button^ c_offnen; private: System::Windows::Forms::OpenFileDialog^ c_openFile; protected: protected: private: /// <summary> /// Erforderliche Designervariable. /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->c_vorschau = (gcnew System::Windows::Forms::PictureBox()); this->c_menu = (gcnew System::Windows::Forms::MenuStrip()); this->c_status_bar = (gcnew System::Windows::Forms::ProgressBar()); this->c_upload = (gcnew System::Windows::Forms::Button()); this->c_pfad = (gcnew System::Windows::Forms::TextBox()); this->c_offnen = (gcnew System::Windows::Forms::Button()); this->c_openFile = (gcnew System::Windows::Forms::OpenFileDialog()); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->c_vorschau))->BeginInit(); this->SuspendLayout(); // // c_vorschau // this->c_vorschau->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle; this->c_vorschau->Location = System::Drawing::Point(12, 27); this->c_vorschau->Name = L"c_vorschau"; this->c_vorschau->Size = System::Drawing::Size(300, 300); this->c_vorschau->TabIndex = 0; this->c_vorschau->TabStop = false; // // c_menu // this->c_menu->Location = System::Drawing::Point(0, 0); this->c_menu->Name = L"c_menu"; this->c_menu->RenderMode = System::Windows::Forms::ToolStripRenderMode::System; this->c_menu->Size = System::Drawing::Size(324, 24); this->c_menu->TabIndex = 1; this->c_menu->Text = L"menuStrip1"; // // c_status_bar // this->c_status_bar->Location = System::Drawing::Point(12, 334); this->c_status_bar->MarqueeAnimationSpeed = 30; this->c_status_bar->Name = L"c_status_bar"; this->c_status_bar->Size = System::Drawing::Size(300, 17); this->c_status_bar->TabIndex = 2; // // c_upload // this->c_upload->Location = System::Drawing::Point(123, 357); this->c_upload->Name = L"c_upload"; this->c_upload->Size = System::Drawing::Size(75, 23); this->c_upload->TabIndex = 3; this->c_upload->Text = L"Upload"; this->c_upload->UseVisualStyleBackColor = true; // // c_pfad // this->c_pfad->Location = System::Drawing::Point(12, 386); this->c_pfad->Name = L"c_pfad"; this->c_pfad->Size = System::Drawing::Size(256, 20); this->c_pfad->TabIndex = 4; // // c_offnen // this->c_offnen->Location = System::Drawing::Point(274, 382); this->c_offnen->Name = L"c_offnen"; this->c_offnen->Size = System::Drawing::Size(37, 23); this->c_offnen->TabIndex = 5; this->c_offnen->Text = L"..."; this->c_offnen->UseVisualStyleBackColor = true; this->c_offnen->Click += gcnew System::EventHandler(this, &Form1::c_offnen_Click); // // c_openFile // this->c_openFile->Filter = L"All (*.*)|*.*|Jpeg (*.jpg)|*.jpg|Photoshop (*.psd)|*.psd"; this->c_openFile->FileOk += gcnew System::ComponentModel::CancelEventHandler(this, &Form1::c_openFile_FileOk); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(324, 414); this->Controls->Add(this->c_offnen); this->Controls->Add(this->c_pfad); this->Controls->Add(this->c_upload); this->Controls->Add(this->c_status_bar); this->Controls->Add(this->c_vorschau); this->Controls->Add(this->c_menu); this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle; this->MaximizeBox = false; this->Name = L"Form1"; this->Text = L"Bildload alpha v1"; (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->c_vorschau))->EndInit(); this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion private: System::Void c_offnen_Click(System::Object^ sender, System::EventArgs^ e) { //this->c_status_bar->Style = System::Windows::Forms::ProgressBarStyle::Marquee; c_openFile->ShowDialog(); } private: System::Void c_openFile_FileOk(System::Object^ sender, System::ComponentModel::CancelEventArgs^ e) { //this->c_status_bar->Style = System::Windows::Forms::ProgressBarStyle::Blocks; c_pfad->Text = c_openFile->FileName; a_pfad = strtochar(c_openFile->FileName); s_scale struct_s; struct_s.in = strtochar(c_openFile->FileName); struct_s.out = "tmp_v.jpg"; struct_s.size = 300; //scale_img(struct_s); HANDLE hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)scale_img, &struct_s, 0, 0); } //***** scale_img() || Scaliert das Bild auf die maximale breite oder höhe. *****// static long WINAPI scale_img(s_scale scale) { char* in; char* out; int max; in = scale.in; out = scale.out; max = scale.size; bool err = ilLoadImage(in); iluImageParameter(ILU_FILTER, ILU_SCALE_BSPLINE); int img_height = ilGetInteger(IL_IMAGE_HEIGHT); int img_width = ilGetInteger(IL_IMAGE_WIDTH); if(img_height > max && img_width > max){ if(img_height > img_width){ int scale = (img_width * max)/img_height; iluScale(scale,max,32); }else{ int scale = (img_height * max)/img_width; iluScale(max,scale,32); }} bool err2 = ilSaveImage(out); return 0; } //***** strtochar() || Wandelt einen System::String^ in ein char* um *****// public: char* strtochar(String ^str) { pin_ptr<const wchar_t> wch = PtrToStringChars(str); size_t convertedChars = 0; size_t sizeInBytes = ((str->Length + 1) * 2); errno_t err = 0; char *ch = (char *)malloc(sizeInBytes); err = wcstombs_s(&convertedChars, ch, sizeInBytes,wch, sizeInBytes); return ch; } }; }
Hoffe jemand weiß eine Lösung.
InFaIN
Vielen Dank für eure Hilfe....
-
Falsches Forum, das ist C++/CLI...
-
Sry, dachte es gehört zu WinApi weils ja mit WinApi gemacht wird....
Wenn das so ist kann es auch verschobenw erden.
InFaIN
-
WinAPI != WinForms
-
InFaIN schrieb:
Wenn das so ist kann es auch verschobenw erden.
Ist verschobenW die Unicode-Variante von verschobenA?
-
_matze schrieb:
InFaIN schrieb:
Wenn das so ist kann es auch verschobenw erden.
Ist verschobenW die Unicode-Variante von verschobenA?
Genau
-------------
-
DevIL (OpenIL) ist sowieso schonmal nicht thread-safe, was aber hier nicht dein Problem ist.
-
Dein Problem hier ist, dass du die Adresse einer lokalen Struct an den Thread übergibst, die Funktion aber verlässt bevor der Thread fertig gelaufen ist. Da die Struktur am Stack liegt, das Programm danach weiter läuft, und den Stack weiter verwendet, werden die Speicherstellen wo ehemals die Struktur war überschrieben. Beim Zugriff auf diese Speicherstellen vom Thread aus steht dann nurmehr Blödsinn drin.
-
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum WinAPI in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Sowas passiert wenn ich zu schnell tippe.
Es tut mir leid, dass ich abundzu Rechtschreibfehler verursache.Kann mir vieleicht, auch wenn ich so schlimm schreibe, jemand helfen?
Ich hoffe ich habe diesmal keine Fehler.
InFaIN
-
Ich wollte dich ja nicht lächerlich machen oder so. War halt nur ein lustiger Vertipper. Klar wird dir geholfen.
Hast du hustbaers Tipp verstanden und umgesetzt?
-
Ok... ich muss sagen ihr habt den Rechtschreibfehler schon lustig interpretiert
Und ich muss gesetehen den Tip habe ich ganz überlesen...
Ich werde ihn gleich mal testen.
Ok hat nix gebracht... oder habe ich es falsch gemacht wenn ich die variable struct_s einfach über dem namespace Bildlaod definiere?
InFaIN
-
private: System::Void c_openFile_FileOk(System::Object^ sender, System::ComponentModel::CancelEventArgs^ e) { //this->c_status_bar->Style = System::Windows::Forms::ProgressBarStyle::Blocks; c_pfad->Text = c_openFile->FileName; a_pfad = strtochar(c_openFile->FileName); s_scale struct_s; struct_s.in = strtochar(c_openFile->FileName); struct_s.out = "tmp_v.jpg"; struct_s.size = 300; //scale_img(struct_s); HANDLE hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)scale_img, &struct_s, 0, 0); }
Problem ist klar? Du erzeugst lokal dein struct, übergibst einen Pointer darauf an den Thread und im Anschluss wird der Scope verlassen und das lokale struct ist nicht mehr gültig, dein Pointer zeigt aber immer noch darauf.
Ich würde das struct einfach als Member deiner Klasse deklarieren. Dann überlebt es den Start des Threads länger als ein paar Mikrosekunden. Initialisieren kannst du es ja dann trotzdem an der Stelle (musst du aber nicht
).
-
Vielen Dank für deine Hilfe..... doch irgendwie stehe ich gerade auf dem Schlauch
.
Das Proplem habe ich jetzt verstanden... nur die Lösung nicht
Vieleicht könntest du mir ja die Lösung an dem Code zeigen?
InFaIN
-
Ich hoffe ihr entschuldigt mein doppelposting, doch ich glaube ich habe den Lösungsvorschlag jetzt verstanden, doch es kommt dennoch ein Fehler beim compilen.
error C2814: "Bildload_alpha_1::Form1::s_scale": Ein systemeigener Typ kann innerhalb des verwalteten Typs "Bildload_alpha_1::Form1" nicht geschachtelt werden.
Ich denke an diesem Fehler ist vc++ schuld, doch ich weiß nicht wie ich es umgehen kann. Ich hoffe ich habe den Lösungsvorschlag so richtig interpretiert.
//***************// //Theard bringt programm zum absturz #pragma once #pragma comment(lib, "DevIL.lib") #pragma comment(lib, "ILU.lib") #include "IL\il.h" #include "IL\ilu.h" #include <string> #include <vcclr.h> #include "windows.h" using namespace std; string a_pfad = ""; namespace Bildload_alpha_1 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Zusammenfassung für Form1 /// /// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch /// die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern, /// das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt. /// Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen /// arbeiten, die diesem Formular zugewiesen sind. /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // //Init IL ilInit(); iluInit(); } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::PictureBox^ c_vorschau; private: System::Windows::Forms::MenuStrip^ c_menu; protected: private: System::Windows::Forms::ProgressBar^ c_status_bar; private: System::Windows::Forms::Button^ c_upload; private: System::Windows::Forms::TextBox^ c_pfad; private: System::Windows::Forms::Button^ c_offnen; private: System::Windows::Forms::OpenFileDialog^ c_openFile; protected: protected: private: /// <summary> /// Erforderliche Designervariable. /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->c_vorschau = (gcnew System::Windows::Forms::PictureBox()); this->c_menu = (gcnew System::Windows::Forms::MenuStrip()); this->c_status_bar = (gcnew System::Windows::Forms::ProgressBar()); this->c_upload = (gcnew System::Windows::Forms::Button()); this->c_pfad = (gcnew System::Windows::Forms::TextBox()); this->c_offnen = (gcnew System::Windows::Forms::Button()); this->c_openFile = (gcnew System::Windows::Forms::OpenFileDialog()); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->c_vorschau))->BeginInit(); this->SuspendLayout(); // // c_vorschau // this->c_vorschau->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle; this->c_vorschau->Location = System::Drawing::Point(12, 27); this->c_vorschau->Name = L"c_vorschau"; this->c_vorschau->Size = System::Drawing::Size(300, 300); this->c_vorschau->TabIndex = 0; this->c_vorschau->TabStop = false; // // c_menu // this->c_menu->Location = System::Drawing::Point(0, 0); this->c_menu->Name = L"c_menu"; this->c_menu->RenderMode = System::Windows::Forms::ToolStripRenderMode::System; this->c_menu->Size = System::Drawing::Size(324, 24); this->c_menu->TabIndex = 1; this->c_menu->Text = L"menuStrip1"; // // c_status_bar // this->c_status_bar->Location = System::Drawing::Point(12, 334); this->c_status_bar->MarqueeAnimationSpeed = 30; this->c_status_bar->Name = L"c_status_bar"; this->c_status_bar->Size = System::Drawing::Size(300, 17); this->c_status_bar->TabIndex = 2; // // c_upload // this->c_upload->Location = System::Drawing::Point(123, 357); this->c_upload->Name = L"c_upload"; this->c_upload->Size = System::Drawing::Size(75, 23); this->c_upload->TabIndex = 3; this->c_upload->Text = L"Upload"; this->c_upload->UseVisualStyleBackColor = true; // // c_pfad // this->c_pfad->Location = System::Drawing::Point(12, 386); this->c_pfad->Name = L"c_pfad"; this->c_pfad->Size = System::Drawing::Size(256, 20); this->c_pfad->TabIndex = 4; // // c_offnen // this->c_offnen->Location = System::Drawing::Point(274, 382); this->c_offnen->Name = L"c_offnen"; this->c_offnen->Size = System::Drawing::Size(37, 23); this->c_offnen->TabIndex = 5; this->c_offnen->Text = L"..."; this->c_offnen->UseVisualStyleBackColor = true; this->c_offnen->Click += gcnew System::EventHandler(this, &Form1::c_offnen_Click); // // c_openFile // this->c_openFile->Filter = L"All (*.*)|*.*|Jpeg (*.jpg)|*.jpg|Photoshop (*.psd)|*.psd"; this->c_openFile->FileOk += gcnew System::ComponentModel::CancelEventHandler(this, &Form1::c_openFile_FileOk); // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(324, 414); this->Controls->Add(this->c_offnen); this->Controls->Add(this->c_pfad); this->Controls->Add(this->c_upload); this->Controls->Add(this->c_status_bar); this->Controls->Add(this->c_vorschau); this->Controls->Add(this->c_menu); this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle; this->MaximizeBox = false; this->Name = L"Form1"; this->Text = L"Bildload alpha v1"; (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->c_vorschau))->EndInit(); this->ResumeLayout(false); this->PerformLayout(); } #pragma endregion public: struct s_scale { char* in; char* out; int size; }; private: System::Void c_offnen_Click(System::Object^ sender, System::EventArgs^ e) { //this->c_status_bar->Style = System::Windows::Forms::ProgressBarStyle::Marquee; c_openFile->ShowDialog(); } private: System::Void c_openFile_FileOk(System::Object^ sender, System::ComponentModel::CancelEventArgs^ e) { //this->c_status_bar->Style = System::Windows::Forms::ProgressBarStyle::Blocks; c_pfad->Text = c_openFile->FileName; a_pfad = strtochar(c_openFile->FileName); s_scale struct_s; struct_s.in = strtochar(c_openFile->FileName); struct_s.out = "tmp_v.jpg"; struct_s.size = 300; //scale_img(struct_s); HANDLE hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)scale_img, &struct_s, 0, 0); } //***** scale_img() || Scaliert das Bild auf die maximale breite oder höhe. *****// static long WINAPI scale_img(s_scale scale) { char* in; char* out; int max; in = scale.in; out = scale.out; max = scale.size; bool err = ilLoadImage(in); iluImageParameter(ILU_FILTER, ILU_SCALE_BSPLINE); int img_height = ilGetInteger(IL_IMAGE_HEIGHT); int img_width = ilGetInteger(IL_IMAGE_WIDTH); if(img_height > max && img_width > max){ if(img_height > img_width){ int scale = (img_width * max)/img_height; iluScale(scale,max,32); }else{ int scale = (img_height * max)/img_width; iluScale(max,scale,32); }} bool err2 = ilSaveImage(out); return 0; } //***** strtochar() || Wandelt einen System::String^ in ein char* um *****// public: char* strtochar(String ^str) { pin_ptr<const wchar_t> wch = PtrToStringChars(str); size_t convertedChars = 0; size_t sizeInBytes = ((str->Length + 1) * 2); errno_t err = 0; char *ch = (char *)malloc(sizeInBytes); err = wcstombs_s(&convertedChars, ch, sizeInBytes,wch, sizeInBytes); return ch; } }; }
Vielen dank für eure Bemühungen.
InFaIN
-
Das ist jetzt noch falscher als vorher.
Du kannst nicht einfach Funktionstypen beliebig rumcasten, und dann davon ausgehen dass es einfach so geht.
CreateThread erwartet eine Funktion, die genau einen Parameter nimmt, nämlich einen void*.
Du kannst weder Memberfunktionen noch Funktionen verwenden die eine struct als Parameter nehmen.
Oh Mann...Nimm eine fertige Threading-Library, oder verwende .NET Framework Threads.
-
hustbaer schrieb:
CreateThread erwartet eine Funktion, die genau einen Parameter nimmt, nämlich einen void*.
Du kannst weder Memberfunktionen noch Funktionen verwenden die eine struct als Parameter nehmen.Die Lösung hierfür ist einfach, einen Pointer auf dein struct nach void* zu casten und im Thread wieder zurückzucasten.
//hier den Zeiger auf dein struct nach void-Pointer casten HANDLE hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)scale_img, (LPVOID)&struct_s, 0, 0); static long WINAPI scale_img(LPVOID param) { s_scale *pScale=(s_scale*)param; //hier einen lokalen Zeiger anlegen und in deinen Typ casten; mit dem kannst du dann arbeiten //... }
So in etwa sollte das aussehen.
-
Ich habe jetzt einmal deinen Idee an meinen code angepasst.
Die struct habe ich wieder oben wie am anfang geschrieben. Den rest habe ich so angepasst...Es kommen keine Fehler beim compilen ABER es stürzt wieder ab sobald der Thread ausgeführt werden soll.....
HANDLE hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)scale_img, (LPVOID)&struct_s, 0, 0); //.... //***** scale_img() || Scaliert das Bild auf die maximale breite oder höhe. *****// static long WINAPI scale_img(LPVOID param) { s_scale *scale=(s_scale*)param; char* in; char* out; int max; in = scale->in; out = scale->out; max = scale->size; bool err = ilLoadImage(in); iluImageParameter(ILU_FILTER, ILU_SCALE_BSPLINE); int img_height = ilGetInteger(IL_IMAGE_HEIGHT); int img_width = ilGetInteger(IL_IMAGE_WIDTH); if(img_height > max && img_width > max){ if(img_height > img_width){ int scale = (img_width * max)/img_height; iluScale(scale,max,32); }else{ int scale = (img_height * max)/img_width; iluScale(max,scale,32); }} bool err2 = ilSaveImage(out); return 0; }
Ich hoffe ihr könnt mir helfen.
InFaIN
-
leg die Variable "struct_s" mal bitte mit *new* an!
ud verwende Thread::Start...
-
InFaIN schrieb:
Die struct habe ich wieder oben wie am anfang geschrieben.
Ich sehe keinen Code von dir, wo du dein struct nicht lokal direkt vor dem Erzeugen des Threads deklariert hast. Du machst es immer so:
s_scale struct_s; //struct wird LOKAL erzeugt //struct mit Werten versorgen struct_s.in = strtochar(c_openFile->FileName); struct_s.out = "tmp_v.jpg"; struct_s.size = 300; //Zeiger auf struct an den Thread übergeben HANDLE hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)scale_img, &struct_s, 0, 0); //und hier kommt der Knackpunkt: die Funktion, in der du dein struct LOKAL erzeugt hast, endet (schließende geschweifte Klammer) und somit hört das //struct auf zu existieren! Der Zeiger, den der Thread bekommen hat, zeigt ins Nirwana.
Solltest du es doch mittlerweile anders machen, sag Bescheid. So geht es jedenfalls nicht.
Du hast da doch eine Klasse. Wie ich bereits sagte: mach dein struct zu einem Member der Klasse. Füll es von mir aus in der Funktion, die den Thread startet, mit Werten. Und wenn der Thread gestartet wird, dann existiert das struct immer noch (denn es ist Member der Klasse, und die existiert ja auch noch!) und der Zeiger zeigt auch auf einen gültigen Speicherbereich.
Es gibt noch andere Möglichkeiten, aber dies ist sicher die sinnvollste (und am wenigsten fehleranfällige).
-
_matze schrieb:
Ich sehe keinen Code von dir, wo du dein struct nicht lokal direkt vor dem Erzeugen des Threads deklariert hast.
Du darfst es *nicht* lokal deklarieren, da die Variable nicht mehr existiert, wenn der Thread läuft...
Verwende "new"!
-
Jochen Kalmbach schrieb:
_matze schrieb:
Ich sehe keinen Code von dir, wo du dein struct nicht lokal direkt vor dem Erzeugen des Threads deklariert hast.
Du darfst es *nicht* lokal deklarieren, da die Variable nicht mehr existiert, wenn der Thread läuft...
Verwende "new"!Da hast du mich missverstanden! Der Satz war "anklagend" zu verstehen.
Ich hatte ja empfohlen, das struct als Member zu deklarieren, und eben nicht lokal...