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