MainLoop in der MFC



  • Hallo zusammen, entschuldigt mich, wenn das eine Anfängerfrage ist, habe aber leider keine Antwort gefunden.

    Ich habe ein MFC Programm, sowie ich das verstanden habe reagiert Ein MFC Programm nur auf Ereignisse, wie ist es nun aber möglich eine Art MainLoop zu machen. Ich habe bestimmte Funktionen, die immer wieder ausgefürt werden müssen (Sensortaten abfragen) wie kann ich das nun realisieren?

    Danke für eure Antworten

    Gruss Isch Gucke



  • Du könntest zum Beispiel die OnIdle()-Methode überschreiben (die wird immer dann aufgerufen, wenn das Programm keine anderen Nachrichten zu verarbeiten hat). Oder du startest einen Arbeitsthread, der sich in einer (Endlos)Schleife um die ständig anfallenden Aufgaben kümmert (und neue Daten an den Hauptthread weiterleitet).


  • Mod

    Wichtig ist, dass OnIdle !=0 returniert damit weitere OnIdle Aufrufe erfolgen. Wird FALSE returniert, dann erfolgt kein weiterer OnIdle Aufruf.

    Andere Gedanken dazu: Du verwedenst einen Timer, oder eben einen zweiten Thread. Das ist be4sonders dann gut, wenn das aktualisieren länger dauert oder zu genauer festgelegten Punkten erfolgen muss.



  • danke für die Rasche antwort, werd mich gleich mal wieder hineinknien 🙂 danke



  • Hallo, es ist leider nochmals ein Problem aufgetreten, ich habe mich entschieden die OnIdle()-Methode zu überschreiben, das hat meines erachtens auch geklappt, nun wird die aber nie Aufgerufen, Was könnte da Falsch sein?

    Hier der Code
    In der Headerdatei

    class CMJPEGunicastAPP : public CWinApp
    {
    public:
       CMJPEGunicastApp();
    public:
       virtual BOOL OnIdle(LONG lCount);
       virtual BOOL InitInstance();
    
       Weiterer Code...
    }
    

    und in der Sourcedatei

    CMJPEGunicastApp theApp;
    BOOL CMJPEGunicastApp::InitInstance()
    {
       Code...
    }
    BOOL CMJPEGunicastApp::OnIdle(LONG lCount)
    {
       CWinApp::OnIdle(lCount);
       MessageBox(NULL,"allrighty","Wird OnIdle() ausgeführt?",MB_OK):
       return TRUE
    }
    

    Was könnte hier falsch gegangen sein, kann es sein, dass immer Messages anstehen? nicht wirklich oder?
    Die änderungen, welche ich in InitInstance vorgenommen habe schluckt er.

    Gruss Isch Gucke


  • Mod

    Wurde denn auch ein Fenster erzeugt? Ohne dass die Message Lopp anläuft kann es nicht gehen!



  • Ja es wurde ein Fenster erzeugt, was in der InitInstance drinnsteht wird zuerst abgearbeitet. Danach Kommt das Fenster zum vorschein, und Messages werden abgearbeitet. Es hat mehrere ON_BN_CLICKED und einen ON_NOTIFY, und alle funktionieren wunderbar. Aber es wechselt nie in die OnIdle()...


  • Mod

    Du hast eine Dialog basierende Anwendung?

    Dann wird InitInstance nicht abgearbeitet, da aus DoModal nicht zurückgekehrt wird.

    Das ganze funktioniert nur mit SDI/MDI Applkationen oder wenn die modale Dialogapplikation die "Main-Message-Loop" verwendet.
    Das kann man erreichen indem statt DoModal Create verwednet wird und InitInstance mit TRUE verlassen wird.



  • Verwende einen Timer. Dann bekommst du WM_TIMER in Abständen rein die du dir aussuchen kannst. OnIdle ist sowieso nicht ideal für normale Applikationen. Entweder du musst das drin Sleep() machen, oder aber du verbrätst sinnlos die ganze CPU Zeit.


Anmelden zum Antworten