Zum Inhalt springen

[C++] Problem bei Aufruf von Formular durch thread


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...