Silverlan Geschrieben 3. Juli 2009 Teilen Geschrieben 3. Juli 2009 Hallo, habe mich gerade erst registriert, und ich hoffe dass ich hier eine Lösung für mein Problem bekomme, da es mich schon seit einiger Zeit beschäftigt hält. Mein Problem ist folgendes: Ich arbeite momentan an einem C++ Programm. (basierend auf einer graphischen Oberfläche) in dem sich ein thread befindet, der die Hauptaufgaben des Programms übernimmt. Innerhalb dieses Threads wird mehrmals auf verschiedene Formulare zugegriffen, und genau da liegt das Problem. Wenn ich z.B. durch den thread ein bestimmtes Bestandteil eines Formulars löschen will, kommt es vor dass ich die Fehlermeldung "Listenindex überschreitet das Maximum" entgegen geworfen bekomme. (Das entsprechende Bestandteil wird aber trotzdem gelöscht, außerdem erscheint die Fehlermeldung nicht immer.) Das größte Problem ist allerdings, dass ich ein Formular durch den thread öffnen muss, und dieses wird jedes Mal fehlerhaft initialisiert wird (Labels oder Buttons fehlen, ich kann es nicht schließen, etc). Zudem erhalte ich, sobald das Formular mindestens einmal durch den thread geöffnet wurde, bei Beendigung des Programms den Fehler "Abnormal programm termination" (Oder "Ungültiges Fensterhandle" vom Debugger). Dies passiert seltsamerweise jedoch nur, wenn das Formular mindestens ein TButton-Objekt enthält. Leider bin ich noch relativ neu auf diesem Gebiet, und habe noch keine Lösung finden können, ich habe aber das Gefühl, dass sich das Problem möglicherweise durch eine Synchronisation zwischen meinem thread und dem thread des Formulars lösen lässt. (Oder liege ich da völlig falsch? Habe das Thema Synchronisation bei threads noch nicht ganz verstanden...) Allerdings weiß ich leider nicht wie man das in meinem Fall bewerkstelligt. Ich möchte meinen Quellcode hier aus verschiedenen Gründen nicht posten, daher ist hier ein kurzes Test-Programm, welches genau den gleichen Fehler verursacht: #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TForm2 *Form2; DWORD WINAPI ThreadFunction(void* pParameter) { Sleep(100); Form2->Show(); return 0; } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { HANDLE hThread; DWORD dwThreadID; hThread = CreateThread(NULL, 0, &ThreadFunction, NULL, 0, &dwThreadID); } //--------------------------------------------------------------------------- (Form2 ist ein einfaches Formular mit einem TButton-Objekt.) Was kann ich tun, um diese Fehler zu vermeiden? Achja, ich sollte vielleicht noch erwähnen, dass ich den Builder 2009 von CodeGear verwende. - Silverlan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 3. Juli 2009 Teilen Geschrieben 3. Juli 2009 Das Problem ist dieses hier Mutex ? Wikipedia Zur Erklärung: Du hast ein Array mit einer gewissen Anzahl Elementen. Wenn nun ein Thread auf ein Element zugreift z.B. löscht, dann verändert sich die Größe, der zweite Thread bekommt aber unter Umständen davon noch nichts mit. Du musst dafür Sorge tragen, dass Deine Datenstruktur, also hier das Array, synchronisiert wird. D.h. egal welche Operation Du auf dieses Array los lässt, Du musst ganz klar sicherstellen, dass immer nur ein Thread auf den Daten werkeln darf. Ich finde da aus der Boost den Zusammenhang ganz gut erläutert: Synchronization Ich nutze selbst die Boost für solche Dinge Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.