warten bis applikation aufgebaut ist?



  • Folgendes Problem:

    Gibt es eine Möglichkeit einer MFC-Applikation zu sagen sie soll mit der Ausführung eines Berechnungsschritts warten bis die GUI wieder reagiert?

    Situation:
    Ich habe eine App die aus mehreren Windows besteht. während in einem Window ein Datensatz geladen wird bauen sich nebendran mehrere andere Windows auf (in denen es dann Möglichkeiten gibt den Datensatz zu bearbeiten)

    Einiges davon soll automatisiert bzw. sofort abgefahren werden (also direkt aus dem konstruktor oder einer init funktion).
    Dummerweise ist zu diesem Zeitpunkt das Datenwindow noch nicht fertig mit laden/aufbauen so dass ich hier einen Crash bekomme.

    Gäbe es z.b. eine Möglichkeit zu warten bis der cursor nicht mehr die Eieruhr zeigt? Oder gibt es eine andere Möglichkeit zu Testen ob die GUI reagiert/nicht reagiert?

    (leider hab ich sehr wenig Plan mit MFC. Im Code anderer Leute rumzupfuschen ist schon schwierig genug 😕 )



  • Sag den anderen Fenstern doch einfach Bescheid, wenn das Datenfenster fertig ist mit Laden (z.B. mit einem Event).



  • Leider ist der loader ein third-party modul. Auf den code habe ich keinen zugriff.
    Möchte auch möglichst vermeiden in vielen Klassen rumzupfuschen, da das ganze in vielen Applikationen verwendet wird (und daher Änderungen dann in anderen Applikationen unvorhergesehene Dinge zur Folge haben könnten)

    In den Bearbeitungs-Windows den Code zu verändern ist schon heikel genug :-\



  • Ich hatte es jetzt mal mit folgendem probiert

    HCURSOR wc = LoadCursor(NULL, IDC_WAIT);
        while(GetCursor() == wc)
    	{        
    		Sleep(200);
        }
    

    aber das bringt natürlich die applikation mitten im aufbau zum erliegen 😞

    möglicherweise muss ich sowas in einem separaten thread starten?


  • Mod

    Kannst Du mal sagen was für einen Crash Du bekommst. Ich vermute, dass Du einfach auf Fensterobjekte zugreifst, dienoch gar nicht erzeugt wurden.



  • Ja, der pointer auf das datenwindow ist zu dem zeitpunkt noch NULL (da sich das noch im aufbau befindet)

    habe inzwischen versucht den test auf WaitCursor (wie oben beschrieben) mit boost:threads in einem parallelen thread laufen zu lassen. Die Funktion dazu ist

    void CPageCalibration::CheckWait()
    {
    	HCURSOR wc = LoadCursor(NULL, IDC_WAIT);
    	while(GetCursor() == wc)
    	{        
    		Sleep(20);
    	}
    }
    

    Dann also im MFCDialog:

    thread thrd(CheckWait)
    thrd.join();
    

    aufgerufen (die idee is dass er einfach so lange den wait test abfährt bis der false wird und dann beim join() weitermacht.

    Wenn ich das mache bekomme ich allerdings "missing argument list" Fehler beim kompilieren in der Zeile: thread thrd(CheckWait)
    (obwohl CheckWait keine Argumente hat???)
    Er schlägt mir dann vor anstelle von
    thread thrd(CheckWait)
    soll ich
    thread thrd(&CheckWait)
    setzten

    wenn ich das aber mache bekomme ich:
    "'&' : illegal operation on bound member function expression"

    Habe auch schon versucht das mit 'bind' zu entzerren, aber egal in welcher Kombination ich das auch anführe, der compiler schluckts nicht.

    *Haare rauf* ..das kann doch nicht so schwierig sein. Das müssen doch schon tausend Jungs vor mir gemacht haben.



  • OK...threads sind gelöst (die methode muss statisch sein)

    aber das stoppt meine applikation dennoch komplett. also war das nicht die lösung fürs anfangs-problem


  • Mod

    Logo, wenn Du Per SendMessaage an eine UI wieder Daten übergibst findet eine Threadsynchronisation statt.


Anmelden zum Antworten