Objekt-Jonglage, Das Hantieren unter Windows mit wirklich vielen Prozessen, Threads, Events ...,  c't 19/2011 S.176 
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Dateien:
WaiforMO: komplette Solution fr Visual Studio 2008  32 & 64 bittig, debug &release

Die Solution enthlt zwei Projekte :
WaitforM0: die C++-Klasse Cwait, wird als Library gelinkt 
WaitforMOTest: Testprogramm in klassischem C, das ber eine Wrapperfunkion die Cwait-Klasse  benutzt

Das Programm adressiert das Problem, dass die Windos API von  WaitForMultipleObject() auf 64 Objekte beschrnkt ist. Bentigt man mehr, kann 
man den Wartejob in Gruppen von bis zu 64 aufteilen, entweder nacheinander, was nur bei Waitall=true mglich ist, oder  kaskadiert mit Warte-Threads. 
Die hier vorgestellte Beispiellsung erweitert die Funktion auf bis zu 63*64 Objekte, muss dazu aber bei mehr als
128 Objekten neue Statuswerte fr WAITTIMEOUT und WAIT_ABANDONED_0 einfhren. (WAITTIMEOUTEX und WAIT_ABANDONEDEX_0)

Fr C++-Programme steht die Klasse CWAIT mit ihren publizierten Methoden zur Verfgung:

   CWait(WAITTYPE WaitType, int aMaxObjects=0);                  
   ~CWait();                     
    						
    DWORD WaitForManyObjects(
						__in  DWORD Count,
						__in  const PHANDLE pHandles,
						__in  BOOL WaitAll,
						__in  DWORD Milliseconds);

    
   DWORD GetCreateResult();
	
Hier bergibt man mit dem Konstruktor die Maximalanzal der Objekte, so dass der  die ntigen Ressourcen bereitstellen kann. Mit
GetCreateResult() kann man sich ber den Erfolg informieren (0: alles ok), ansonsten gab es Fehler beim Allozieren von Heap oder dem Erzeugen 
einesTerminate- Events.
    
 Die Methode  WaitForManyObjects arbeitet wie WaitForMultipleObjects(), nur eben mit mehr Handles. Zum Schluss sollte man dann das Objekt wieder freigeben. 
 
 Daneben gibt es die auch von alten C-Programmen nutzbare  Wrapper-Funktion WaitForManyObjects()  als diekten Ersatz von WaitForMulibleObjects() - aber ggf. mit anderen
 zurckgemeldeten Statuswerten -- die bei jedem Aufruf die Klasse automatisch erzeugt und 
 hernach wieder zerstrt.
 
 Anbei ist noch ein kleines Testprogramm, bei dem man per #define alle mglichen Waitsituationen, Timouts, verlassene Mutexe fr  Threads, Events, Mutexe einstellen 
 kann. Testweise ist dafr  in WaitForManyClass.h  #define TEST_MAXIMUM_WAIT_OBJECTS 2  gesetzt. Fr eigene Programme mit mehr als 64 Objekten ist 
 diese Zeile unbedingt zu streichen und dann neu zu kompilieren. 
 
Diese Version enthlt keinen Threadpool  fr die Wartethreads, diese werden also bei jedem Aufruf erzeugt und wieder zerstrt. 
  
Verbesserungsvorschlge sind wie immer  willkommen 

Viel Spa 

Andreas Stiller 