Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » 4 Threads eine Console

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: