L
Hallo allerseits,
ich versuche, das untenstehende Programm dazu zu bewegen, nur eine bestimmte Anzahl Threads gleichzeitig auszuführen. Jedoch werden alle Threads gleichzeitig gestartet, ich komme einfach nicht dahinter, was ich da falsch mache...in der Hilfe steht, dass ein Semaphore nicht mehr "feuert", wenn es auf 0 steht. Dann müsste doch WaitForSingleObject in der Execute-Methode die
Ausführung dieses Threads solange anhalten, bis Semaphore wieder günes Licht gibt, oder?
Danke, LVMH.
//---------------------------------------------------------------------------
// mainthread
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int MAX_SIMULTANEOUS = 1;
MySemaphore = CreateSemaphore(NULL, MAX_SIMULTANEOUS, MAX_SIMULTANEOUS, "Sema1");
Form1->Label1->Caption = "0";
for(int i=0 ; i < 10 ; i++ )
{
SampleThread *MySampleThread1 = new SampleThread(i,false);
}
CloseHandle(MySemaphore);
}
//---------------------------------------------------------------------------
// threadobjekt
//---------------------------------------------------------------------------
__fastcall SampleThread::SampleThread(int Nummer, bool CreateSuspended)
: TThread(CreateSuspended)
{
m_Nummer = Nummer;
m_Bezeichnung = "Thread Nummer : "+String(m_Nummer);
m_Counter = 5;
m_Pause = 1000;
}
//---------------------------------------------------------------------------
void __fastcall SampleThread::Execute()
{
//---- Place thread code here ----
WaitForSingleObject(Form1->MySemaphore, INFINITE);
FreeOnTerminate = true;
Form1->ListBox1->Items->Add("*** "+m_Bezeichnung+" gestartet!");
while (!Terminated && m_Counter >= 0)
{
try
{
Synchronize(UpdateDataView);
Sleep(m_Pause);
m_Counter--;
}catch(...)
{
exit;
}
};
Form1->ListBox1->Items->Add("*** "+m_Bezeichnung+" beendet!");
Terminate();
}
//---------------------------------------------------------------------------
void __fastcall SampleThread::Terminate(void)
{
//TODO: Add your source code here
ReleaseSemaphore(Form1->MySemaphore, 1, NULL);
TThread::Terminate();
}
__fastcall SampleThread::~SampleThread()
{
//TODO: Add your source code here
}
void __fastcall SampleThread::UpdateDataView(void)
{
//TODO: Add your source code here
String S = String(m_Counter)+ " ";
for(int i=0;i<m_Counter;i++)
{
S+="|||";
}
Form1->ListBox1->Items->Add(m_Bezeichnung + " " + S);
}