Zum Inhalt springen

C++, Fenster, MessageQueue, Threading


Patrick_C64

Empfohlene Beiträge

Hallo @ALL,

eigtl. sehe ich zu das ich meine Sachen alleine geregelt bekomme, aber diesmal bin ich an einem Punkt angekommen wo ich nicht mehr weiter weiss.

Auch Recherchen und ausseinandersetzen mit dem Thema, 3-4 Tage!, half nichts.

Könnte mir bitte jemand ein Bsp. posten? Es ist eigtl. nicht meine Art nach Sourcen zu fragen aber in diesem Fall glaube ich, komme ich nicht anders weiter.

Meine sglib ("simpleGraphics") kann Fenster mit RC's erstellen und das funktioniert auch soweit auch kann in jedem Fenster ein seperater RC erstellt und bedient werden.

Wenn ich jetzt ein Fenster verschiebe, wird der komplette Programmablauf gestoppt, also die sich drehenden dreiecke werden nicht mehr gedreht......

Was ich benötige ist ein "einfaches" Bsp. wie man in C++ threadbasiert den MessageQueue eines Fensters abarbeitet, so dass ich das für meine sglibWindows nutzen kann.

Ich kenne auch jemand der Dipl. Informatiker ist, diesen habe ich erst nach 3 Tagen ergebnissloser Try and Lose Orgien konsultiert, doch leider hat er eher mit C# als C++ zu tun und konnte mir Spontan auch nicht weiterhelfen.

Bevor ich aus Verzweiflung Wahnsinnig werde, wende ich mich hier an die Erfahrenen C++ Programmierer die mir das auch ggf. beantworten können und möchten!

mfg. Patrick

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Klotzkopp,

ich erstelle mein Fenster mit WinApi, also ohne MFC. "Ganz normal" halt.

Später werde ich andere Libs nutzen aber erstmal muss ich alles verstehen, ich programmiere schon lange aber fuchs mich jetz erst in C++ ein.

Ein DblLkndLst(Template!) hab ich mir schon geschrieben während des lernens auch das erstellen von Fenstern sollte mir nicht mehr allzu schwer fallen nur das Threading das will mir einfach nicht in den Kopf nicht ansatzweise.

Wenn du magst hillf mir bitte! Source hau ich gerne hier rein zum runterladen!

- WinApi

- Kein Boost und nichts

- einfach nur C++ windows.h, vllt. noch process.h (wobei ich denke das ist C ?!)

ich möchte einfach nur das meine Konsole ungestört weiter arbeitet während ich zb. ein Fenster verschiebe bzw. solange DispatchMessage das Programm eigentlich stoppt.

Das kann doch alles nicht so schwer sein,... mein Kopf brummt vor Semaphore, Mutex, MessagePump/Pipe, NachrichtenQueue ,PostThreadMessage, Threading etc.

Alles andere konnte ich doch auch Autodidaktisch er"hasch"/"arbeit"en aber da bin ich jetz echt am ende meines IQ's :( *schmoll,...

mfg. Patrick und Thx für die Schnelle Antwort!

(Rechtschreib und Grammatikfehler, sry. sitze seit 3 Tagen an ein und dem selben Problem! :( und bin einfach nur Groggy! )

Bearbeitet von Patrick_C64
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm vllt. den dass das Lernen anhand von Praxis einfacher ist anstatt mit bloßer Theorie?! ;)

Das es in der STL diverse Container gibt die das selbige tun wie meine DBLLnkdLst steht außer Frage, ich habe dies eigtl. nur angemerkt um zu sagen das ich nicht ganz unbeholfen bin auch wenn es manchmal den Eindruck erwecken kann!!(.... und sicher wird).

Aber mal ganz davon, was hat das mit meinem Anliegen zu tun, wenn du mich auf die Sinnfreiheit einer selbstgeschriebenen Linkedlist hinweisen wolltest dann muss ich dich Entäuschen......, wenn du was Produktives zu meinem Anliegen beizutragen hast immer her damit!

Versteh mich nicht falsch aber da nichts zu meinem Anliegen in deinem Post auftaucht nehme ich das erstmal als Provokation wahr, wenn das wirklich nur als Frage gemeint war um einen Überblick zu meinem Anliegen zu bekommen dann Sry!!, sollte hiermit aber beantwortet sein ;) .

mfg. Patrick

Link zu diesem Kommentar
Auf anderen Seiten teilen

Meine sglib ("simpleGraphics") kann Fenster mit RC's erstellen und das funktioniert auch soweit auch kann in jedem Fenster ein seperater RC erstellt und bedient werden.
Was meinst du mit RC?

Wenn ich jetzt ein Fenster verschiebe, wird der komplette Programmablauf gestoppt, also die sich drehenden dreiecke werden nicht mehr gedreht......
Wie verschiebst du, und wie drehst du die Dreiecke?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Klotzkopp,

< bisl OT:

Wie gesagt bin im Prinzip in der C++ lernphase, komme aus na anderen ecke, da wars easy, man hatte Listen, konnte flink Fenster erstellen in denen man Rendern konnte etc. (n recht gutes OO-Basic, compiliert für Win,Lin,Mac)

Zudem schreibe ich sehr gerne viel selbst, ja die Sache mit dem "Rad" ist mir bewusst ;) aber von nichts kommt nichts und so lernt man am besten finde ich!

Deswegen möchte ich mir eine "sgLib" SimpleGraphicsLibrary schreiben mit der ich einfach Fenster erstellen kann in denen ich mit einfachen Befehlen Zeichnen möchte etc.

und BackToTopic>


sglib LbIFace;


sglibRC RC_win01=LbIFace.GetRndrCntxt("win",w,h,X,X);

sglibRC RC_win02=LbIFace.GetRndrCntxt("win",w,h,X,X);


LbIface.SetCrntRndrCntxt(RC_win01); sglib.drawImage (sglibIMG,x,y);


// more drawing to RC_win01 is possible!


LbIface.SetCrntRndrCntxt(RC_win02); sglib.drawImage (sglibIMG,x,y);

RC ist in dem Falle mein RenderContext der durch sglibRC initiiert/ zur verfügung gestellt wird, sglibRC initiiert ein Fenster (per WinApi) und stellt den RC zur verfügung.

Steh wie gesagt noch ganz am Anfang, Fenster lassen sich erstellen und eine PseudodrawRoutine sorgt für ein sich drehendes Dreieck wenn LbIface.Draw() aufgerufen wird, dies wird dann im gesetzten sglibRC gezeichnet. N'einfaches OGL dreieck gedreht über ne ständig imkrementierende in der Methode angelegten statischen Variable.

Hab also das Konsolenfenster (was später sicher nicht mehr benötigt wird!) und 2 sglib RC's, im Konsolenfenster lasse ich momentan im Interval (x%100==1) ein "x" ausgeben um zu sehen obs kontinuierlich läuft. Tut es auch allerdings sobald ich ein sglibWindow verschiebe stopt sich die Drehung aller Dreiecke und auch die Ausgabe des "x", da ja DispatchMessage den Programmablauf erstmal unterbricht. (Verschieben über die Titelleiste).

Wenn es möglich wäre das DispatchMessage nur 2 Messages verarbeitet und dann erstmal rauspringt (vllt. mit WM_Timer ?!?!) wär das schonma n Ansatz, allerdings ein so dreckiger das ich das lieber gleich lasse.

Weiss nich wie ichs Anstellen soll, komplett jeden sglibRC (verfügt über das Fenster ( nur das Fenster in einen Thread? ) ) in einem Thread stecken, oder die Nachrichtenschleife selbst nur im Thread abfragen?

Selbst wenn ich da jetz schonma ne Idee hätte wüsste ich nicht wie ich das realisieren könnte.

(Danke fürs Zeit nehmen is ja was mehr an Text geworden!)

mfg. Patrick

Bearbeitet von Patrick_C64
Link zu diesem Kommentar
Auf anderen Seiten teilen

Fenster lassen sich erstellen und eine PseudodrawRoutine sorgt für ein sich drehendes Dreieck wenn LbIface.Draw() aufgerufen wird, dies wird dann im gesetzten sglibRC gezeichnet. N'einfaches OGL dreieck gedreht über ne ständig imkrementierende in der Methode angelegten statischen Variable.
Das heißt, du hast da eine Schleife? Wer bedient währenddessen die MessagePump für deine Fenster?

allerdings sobald ich ein sglibWindow verschiebe stopt sich die Drehung aller Dreiecke und auch die Ausgabe des "x", da ja DispatchMessage den Programmablauf erstmal unterbricht.
DispatchMessage unterbricht gar nichts. Wie kommst du auf diese Diagnose?

Es bringt wenig, wenn du nur zeigst, wie man deine Lib benutzt. Du musst schon ein paar Informationen über die Architektur und die Implementierung deiner Libraryfunktionen liefern.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm vllt. den dass das Lernen anhand von Praxis einfacher ist anstatt mit bloßer Theorie?! ;)

Aber mal ganz davon, was hat das mit meinem Anliegen zu tun, wenn du mich auf die Sinnfreiheit einer selbstgeschriebenen Linkedlist hinweisen wolltest dann muss ich dich Entäuschen......, wenn du was Produktives zu meinem Anliegen beizutragen hast immer her damit!

Versteh mich nicht falsch aber da nichts zu meinem Anliegen in deinem Post auftaucht nehme ich das erstmal als Provokation wahr, wenn das wirklich nur als Frage gemeint war um einen Überblick zu meinem Anliegen zu bekommen dann Sry!!, sollte hiermit aber beantwortet sein ;) .

mfg. Patrick

Entschuldige! Ich habe nicht erwartet, dass Du Dich durch meine Anfrage derart provoziert siehst. Es ging mir ganz wertneutral darum, die Motivation zu erfragen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Klotzkopp,

Dispatchmessage blockiert in diesem Falle, wenn du ein Dispatchmessage hast welches das nicht tut, wir könn gerne Tauschen :) .., ne ma Scherz bei Seite, nach dalbbern is mir eigentlich ehh nich mehr.

Das "if" hier ist nur ein verzweiflungs "if" eigtl. ists ja n While Konstrukt.


    if ( PeekMessage(&msg, hWnd, 0, 0,PM_REMOVE)>0 )

    {

        cout <<">>> before Dispatch ";


        TranslateMessage(&msg);

        DispatchMessage (&msg);


        cout <<"| after Dispatch <<<";

    };

Sobald ich das Fenster verschiebe wird kein "after Dispatch" mehr ausgegeben bis ich das Fenster wieder loslasse! Also wenn das nicht an der Stelle blockiert wo dann?! :) Ne Schleife ? Wie kommst du da jetz drauf ? Weil sich die dreicke drehen? Beim Aufruf von Draw wird einfach eine Variable um eins erhöht. Interner Ablauf in sglibUpdate: Liste die die erstellten RC's durchgeht und ein Update für die jeweilige Instance aufruft.

    for(link<sglibRC> *RCLink=--RClist;RCLink!=NULL;RCLink=RClist++)

    {


                RCLink->data.update();


    };

Der RC kümmert sich während seines Updates wiederum um das Update der Windows, also auslesen der MsgPump, Translaten und Dispatchen.

So und da bei Dispatchmessage ein "Break" ensteht kann ich dir sagen wer sich dann um die MessagePump kümmert, niemand! Da es ja in "dieser" "stoppt".

Hoffe hab mich halbwegs verständlich ausgedrückt muss eingestehen deine Fragen verunsichern mich, ich kämpf hier Tagelang mit dem Stop der durch Dispatchmessage ensteht und du erzählst mir Dispatchmessage hält den Programmablauf nicht an,...,., ?!?! :eek

Falls noch was unklar einfach Fragen Source Code. ( sry. momentan leicht unsauberer style! um nicht zu sagen schlampig aber darum kümmer ich mich wenn das mit den Threads bzw. einen Ungestörten Programmablauf klappt, eigtl. schreibe ich rel. sauber siehe linkedlist mom. gibt es aber andere Prioritäten.)

Hab auf Codeguru schon paar Artikel gefunden, da hatte ich gestern sicher auch schonmal durchgeklickt aber wahr wohl zu groggy, so habe ich da jetzt zumindest schonmal n paar Infos und "Inspiration".

Besten Dank für deine Zeit, hoffe ich bekomme das noch hin, bin für jede und vor allem auch deine Hilfe Dankbar!

mfg. Patrick

Bearbeitet von Patrick_C64
nachtrag
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Klotzkopp,

du kannst es mit sglib_test.cpp Testen und somit Rekonstruieren, mir ist was aufgefallen hab einfach weiter Probiert, da ich denke ich kann dir vertrauen wenn du sagst Dispatchmessage hält den Programmablauf nicht an, im Prinzip glaub ich das dass soweit auch korrekt ist, durch einfaches klicken ins Fenster oder dergleichen läuft auch alles weiter hab mir n kleine Ausgabe in die WinProc geaddet, aber wenn ich das Fenster über die Titelleiste verschiebe oder dort nur MouseLeft halte das frierts ein, naja wie auch immer zur Lösung werde ich so oder so nicht um Threads herumkommen und das will ich eigtl. auch garnicht ich wills ja letzlich können.

Dickes dickes THX @Klotzkopp schon alleine zu Wissen das mir da wer beiseite steht gibt mir wieder n bisl Kraft und Motivation, wobei heute die Luft auch fasst raus ist, Umschulung (FI/AE) ganzen Tag am Rechner und nebenbei Coden Coden Coden, bzw. zur Zeit eher Lesen ,Recherchieren und Probieren.

mfg. Patrick

@lilith2k3 meine PN angekommen ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

aber wenn ich das Fenster über die Titelleiste verschiebe oder dort nur MouseLeft halte das frierts ein
Offenbar verursacht DefWindowProc bei WM_NCLBUTTONDOWN eine Rekursion in der WndProc. Damit ist deine MessagePump außen vor.

naja wie auch immer zur Lösung werde ich so oder so nicht um Threads herumkommen
Deine Probleme rühren meiner Meinung nach eher daher, dass du deine Lib-Logik ziemlich eigenwillig mit der Abarbeitung der Message Loop verknüpft hast. Ich bin da allerdings auch kein Experte. Du könntest dir mal anschauen, wie das bei GLUT gemacht wird.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hehe das war eben wie ein kleiner stupser :), hmm hab mir deinen Vorschlag mal kurz durchdacht, und ja im Prinzip haste Recht !!

Ein sglibRC hat ein sglibWindow, welches ein HWND verwaltet. Über sglibUpdate wird in einer Schleife in jeder sglibWindow Instanze ein PeekMessage auf das HWND und anschliessendes Translate und Dispatch durchgeführt, ist eigtl. nicht verkehrt aber vllt auch nicht sonderlich richtig.

Ich hatte auch kurz mein Konzept aus den Augen verloren als ich über deine Idee nachdachte, hab kurzerhand in sglib::Update ausserhalb der Update schleife die Messagepump reingesetzt in einem While Konstrukt, läuft genau wie vorher :( .

Dann blitzte es Kurz im Kopf und mir erschien wieder das das garnicht gut ist ;) (Des Konzeptes wegen) denn wenn ich sglibWIndow weiter ausbaue und dort nach dem Peek die Messages erstmal Intern verarbeite kann, so das ich auf ein Destroy oder Quit reagieren kann und somit die sglibWindow Instanze zersöre und den dazugehörigen sglibRC, was mir als recht elegante Lösung erscheint müsste ich mir ja dann was anderes einfallen lassen.

Nunja somit kann ich den Fehler auf der Designseite ausschliessen habs ja alternativ Probiert, und das eigenwillige Design ist ja durch die schon im Kopf weitergedachte Funktionalität ne gute Lösung.

Hmm die Sache mal in GLUT reinzuschnuppern das wär ja noch ne Idee, vllt. brauch ich ja ma 1-2 Tage abstand von dem Thema :( (glaub kaum das ich mich dazu zwingen kann).

mfg. Patrick und nochma vielen Dank das du dir Zeit genommen hast!

Bearbeitet von Patrick_C64
Korrigiert (schon leicht Konfus!)
Link zu diesem Kommentar
Auf anderen Seiten teilen

Holla die Waldfee,

2 Tage abschalten von Threads und CoKG, sollen nicht unbelohnt bleiben. der gute Kaffee und die mir in weiser Voraussicht durchs frühe aufstehen gegebene Ruhe haben sich bezahlt gemacht, erste Erfolge :)

Nur als erste Inspiration für andere !!, ich muss mich erst noch richtig einarbeiten, aber da eben der Groschen fiel und ich voller Eupohrie bin möchte ich euch das nicht vorenthalten, ggf. werde ich bei Zeiten wenn ich richtig mit Threads klarkomme ein kleines Tutorial verfassen.

Auf jeden Fall werde ich den Code hier noch erweitern und säubern! also Kommentare und alle wichtigen Funktionen die zu einen sauberen Thread gehören usw. implementieren!

mfg. Patrick

(Dreckiges Stück Experimentiercode! also nich schimpfen)


#include <windows.h>

#include <gl/gl.h>

#include <process.h>

#include <iostream>


LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);

void EnableOpenGL();

void DisableOpenGL(HWND, HDC, HGLRC);


void WinT(void *param);


    WNDCLASSEX wcex;

    HWND hwnd;

    HDC hDC;

    HGLRC hRC;

    MSG msg;

   BOOL bQuit = FALSE;

    float theta = 0.0f;

    HINSTANCE XhInstance=NULL;

    int XnCmdShow=0;



int WINAPI WinMain(HINSTANCE hInstance,

                   HINSTANCE hPrevInstance,

                   LPSTR lpCmdLine,

                   int nCmdShow)

{


XhInstance=hInstance;

XnCmdShow=nCmdShow;

int val=0;

int val1=0;

    HANDLE Thandle = (HANDLE) _beginthread( WinT,0,&val);

    /* enable OpenGL for the window */

Sleep(50);


   EnableOpenGL();

   hRC = wglCreateContext(hDC);


    wglMakeCurrent(hDC, hRC);


   BOOL bQuit = FALSE;


    /* program main loop */

    while (!bQuit)

    {

        val1+=1;


        if (val1>100){std::cout<<"x";val1=0;};


                    /* OpenGL animation code goes here */


            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

            glClear(GL_COLOR_BUFFER_BIT);


            glPushMatrix();

            glRotatef(theta, 0.0f, 0.0f, 1.0f);


            glBegin(GL_TRIANGLES);


                glColor3f(1.0f, 0.0f, 0.0f);   glVertex2f(0.0f,   1.0f);

                glColor3f(0.0f, 1.0f, 0.0f);   glVertex2f(0.87f,  -0.5f);

                glColor3f(0.0f, 0.0f, 1.0f);   glVertex2f(-0.87f, -0.5f);


            glEnd();


            glPopMatrix();


            SwapBuffers(hDC);


            theta += 1.0f;

            Sleep (0);

    }


    /* shutdown OpenGL */

    DisableOpenGL(hwnd, hDC, hRC);


    /* destroy the window explicitly */

    DestroyWindow(hwnd);


    return msg.wParam;

}


void WinT(void *param)

{

   BOOL bQuit = FALSE;


    /* register window class */

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style = CS_OWNDC;

    wcex.lpfnWndProc = WindowProc;

    wcex.cbClsExtra = 0;

    wcex.cbWndExtra = 0;

    wcex.hInstance = XhInstance;

    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);

    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

    wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);

    wcex.lpszMenuName = NULL;

    wcex.lpszClassName = "GLSample";

    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);;



    if (!RegisterClassEx(&wcex))

        return ;


    /* create main window */

    hwnd = CreateWindowEx(0,

                          "GLSample",

                          "OpenGL Sample",

                          WS_OVERLAPPEDWINDOW,

                          CW_USEDEFAULT,

                          CW_USEDEFAULT,

                          256,

                          256,

                          NULL,

                          NULL,

                          XhInstance,

                          NULL);


    ShowWindow(hwnd, XnCmdShow);



    while (!bQuit)

    {



        Sleep(1);



        /* check for messages */

        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

        {

            /* handle or dispatch messages */

            if (msg.message == WM_QUIT)

            {

                bQuit = TRUE;

            }

            else

            {




                TranslateMessage(&msg);

                DispatchMessage(&msg);

            }

        }

    }

}








LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

    switch (uMsg)

    {

        case WM_CLOSE:

            PostQuitMessage(0);

        break;


        case WM_DESTROY:

            return 0;


        case WM_KEYDOWN:

        {

            switch (wParam)

            {

                case VK_ESCAPE:

                    PostQuitMessage(0);

                break;

            }

        }

        break;


        default:

            return DefWindowProc(hwnd, uMsg, wParam, lParam);

    }


    return 0;

}


void EnableOpenGL()

{

    PIXELFORMATDESCRIPTOR pfd;


    int iFormat;


    /* get the device context (DC) */

    hDC = GetDC(hwnd);


    /* set the pixel format for the DC */

    ZeroMemory(&pfd, sizeof(pfd));


    pfd.nSize = sizeof(pfd);

    pfd.nVersion = 1;

    pfd.dwFlags = PFD_DRAW_TO_WINDOW |

                  PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

    pfd.iPixelType = PFD_TYPE_RGBA;

    pfd.cColorBits = 24;

    pfd.cDepthBits = 16;

    pfd.iLayerType = PFD_MAIN_PLANE;


    iFormat = ChoosePixelFormat(hDC, &pfd);


    SetPixelFormat(hDC, iFormat, &pfd);


    /* create and enable the render context (RC) */


}


void DisableOpenGL (HWND hwnd, HDC hDC, HGLRC hRC)

{

    wglMakeCurrent(NULL, NULL);

    wglDeleteContext(hRC);

    ReleaseDC(hwnd, hDC);

}



Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...