000
23.11.2011, 13:23 Uhr
~Gast
Gast
|
Hallo,
ich habe eine Aufgabe 4 Threads zu erzueugen die sich dann ein Consolen Fenster teilen, einer arbeitet am oberen linken Bildschirmrand der 2. am oberen rechhten usw.
Jetzt bin ich soweit das ich an der ausgabe schon erkennen kann das sich die Threads abwechseln aber einer überschreibt den anderen.
Das ist der Code, es wird die Improved Console benutzt (ic.hpp):
C++: |
// -------------- 4threads schreiben auf eine Console // ---------------------------------------------------
#include <Windows.h> #include "ic.hpp" #include <iostream> #include <conio.h>
using namespace std; using namespace ic;
// ------Thread Prototyp -------------- DWORD WINAPI Viertel (LPVOID arg); HANDLE hStopEvent;
// ---- Datenstruktur für den Thread ---- struct DATEN_THREAD { int ID; int xstart; int ystart; int hoehe; int breite; TextColor Farbe; };
CRITICAL_SECTION cs_console;
void main () { // --- initialisierung ----------------- con.setTitle("4 Threads für C3";
DATEN_THREAD Daten[4]; HANDLE hThread[4];
InitializeCriticalSection(&cs_console);
hStopEvent=CreateEvent(NULL,true,false,NULL); // ------------- Daten für die Threads ------------ for(int i=0;i<4;i++) { Daten[i].ID=i; Daten[i].xstart=Daten[i].breite * (i%2); Daten[i].ystart=Daten[i].hoehe * (i/2); Daten[i].breite=con.getWndSizeX()/2; Daten[i].hoehe=con.getWndSizeY()/2; Daten[i].Farbe=(TextColor)((int)(FG_RED+i));
// --------------- Threads starten ---------------- hThread[i]=CreateThread(NULL,0,Viertel,(void *)&Daten[i],0,NULL); } // ------- aufräumen -------------------- while(!_kbhit()); for(int i=0;i<4;i++)TerminateThread(hThread[i],0);
DeleteCriticalSection(&cs_console); CloseHandle(hStopEvent);
bool stop=false; while(true) { if(!_kbhit){ char c=_getche(); switch (c) { case 'q': SetEvent(hStopEvent);
default:break;
} } } } // // ---------- Thread Funktion ------------------- // DWORD WINAPI Viertel (LPVOID arg) { int zeile=0; int zaehler=0;
DATEN_THREAD *Daten = (DATEN_THREAD *)arg;
while(true) { if (WaitForSingleObject(hStopEvent,0)==WAIT_OBJECT_0)break;
EnterCriticalSection(&cs_console);
con.setTextColor(Daten->Farbe); con.setCurPos(Daten->xstart+zeile,zeile+Daten->ystart); cout << " Hallo Welt " << Daten->ID << zaehler << endl; zaehler++; if(zeile >= Daten->hoehe) zeile=0; zeile++; Sleep(10);
LeaveCriticalSection(&cs_console); } return 0; }
|
Edit: vb-Tags durch cpp-Tags ersetzt. Dieser Post wurde am 23.11.2011 um 22:42 Uhr von Hans editiert. |