Message von Enabler abfangen



  • Hallo,

    in einer Anwendung bleibt der Speicher-Button solange disabled, bis alle Eingabefelder korrekt gefüllt sind. Auch das Ansehen von sensiblen Daten wird in dieser Anwendung über disabled Buttons gesteuert. Jetzt habe ich das Problem, das ich das Programm sicherer machen muss, denn mit dem Programm Enabler von evil fingers ist es ja möglich alle Eingabefelder, Buttons, etc, die disabled sind zu enablen. 😡

    Meine Lösung war, das ich mir ein unsichtbares Dialogfenster lade auf dem ich eine Textbox und ein Button plazierte und beide disabled habe. Mit Hilfe eines Timers überwache ich nun den Zustand dieser beiden Komponenten. Schlägt dann der Enabler zu bring ich eine entsprechende Hinweismeldung und beende das Programm. So weit so gut. Funktionieren tut dies einwandfrei. Nun habe ich das Problem, das durch den Timer meine Anwendung im Taskmanager eine CPU-Last von 25% erzeugt, was natürlich nicht tragbar ist. Setze ich den Timer z.B. auf 10 Sekunden, kann man beobachten, das dann alle 10 Sekunden die CPU-Last hochschnellt. Sicherlich könnte ich jetzt an jedem Button-Event ein Abfrage machen, was ich aber bei der Größe der Anwendung (sicherlich > 100 mögliche Stellen) vermeiden will.

    Meine Vorstellung ist jetzt an einer zentralen Stelle (oder in meinem versteckten Window) eine Abfrage auf dieses "Enable"-Command zu machen.

    Ist das realisierbar?

    Achja, leider wird (muß) diese Anwendung noch in VS2003 geschrieben.
    Neuere Funktionalitäten realisiere ich aber schon in VS2010 und rufe sie über Interop auf.

    Vielen Dank schon mal für eure Unterstützung.

    Viele Grüße
    Rainer



  • Ist das Arbeiten mit Threads nicht möglich ?
    Also einen Thread starten, in dessen Callback du dauerhaft den Status der Buttons überprüfst .. Da das ja auch neben deinem Hauptthread läuft, sollte die Resourcen auch nicht so enorm sein ...



  • Habe mich mit Threads noch nicht so richtig beschäftigt. Ist aber sicherlich eine Möglichkeit. Werde mich mal in dieses Thema einarbeiten. Mal schauen ob ich ein paar gute Beispiele finde.
    Sollte jemand noch weitere Ideen haben, immer her damit... 😉

    Viele Grüße
    Rainer



  • Rainer Pirsch schrieb:

    Nun habe ich das Problem, das durch den Timer meine Anwendung im Taskmanager eine CPU-Last von 25% erzeugt, was natürlich nicht tragbar ist. Setze ich den Timer z.B. auf 10 Sekunden, kann man beobachten, das dann alle 10 Sekunden die CPU-Last hochschnellt.

    Wenn du den Zustand von zwei (!) Controls alle 10 Sekunden abfragst, und dabei sehen kannst wie die CPU-Auslastung hochgeht, dann machst du irgendwas falsch.
    Zeig mal den Code.
    So nen einfachen Check kannst man ruhig alle 10ms machen, ohne dass man davon was merkt.



  • [quote="hustbaer"]Wenn du den Zustand von zwei (!) Controls alle 10 Sekunden abfragst, und dabei sehen kannst wie die CPU-Auslastung hochgeht, dann machst du irgendwas falsch.[/quote]

    Genau das wollte ich hören, ehrlich! 🙂
    Denn nun weiß ich das es eigentlich gehen muss. Also hab ich, um nicht zuviel Code zu posten mal einige Sachen rausgeschmissen, wo ich meinte die sind eh hierfür nicht relevant... Und was soll ich sagen, auf einmal funktioniert es!!! 😋

    Es lag an dieser Methode:

    LRESULT CDlgEnabler::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    DWORD QueueStatus;
    LRESULT resValue = 0;
    bool OnIdleRetVal = true;

    //////if(message == WM_IDLE) {
    ////// OnIdleRetVal = OnIdle((UINT)wParam);
    ////// if(!OnIdleRetVal)
    ////// wParam = 0;
    //////} else

    resValue = CDialog::WindowProc(message, wParam, lParam);

    QueueStatus = GetQueueStatus(QS_ALLINPUT);

    if(HIWORD(QueueStatus) == 0)
    PostMessage(WM_IDLE, wParam + (OnIdleRetVal ? 1 : 0), 0);

    return resValue;
    }

    Vor lauter Ausprobieren ist diese Methode mal irgendwann entstanden und halt drin geblieben... 😉
    Wollte mich da irgendwie in den Idle-Zustand reinhängen...

    Wenn ich mal wieder etwas weniger Projektdruck hab, schau ich mal nach warum mir die Methode "WindowProc" die Performance bei einem gesetzen Timer so hoch jagt.

    Achja, den timer setze ich so:

    BOOL CDlgEnabler::OnInitDialog()
    {
    CDialog::OnInitDialog();
    SetTimer(ENABLERCHECKEVENT, 500,NULL);
    return TRUE;
    }

    Vielen Dank an hustbaer für den "Schupser"! 🙂



  • Kurze Frage aus Interesse .. sind die ganzen Idle Messages und Funktionen nicht MFC ?



  • [quote="Fake oder Echt"]Kurze Frage aus Interesse .. sind die ganzen Idle Messages und Funktionen nicht MFC ?[/quote]

    Ja, da hast du Recht. Wenn es darum gegangen wäre hätte die Frage ins MFC gehört. Ich wollte aber wissen ob man nicht generell eine "Enable-Message" von diesem "Enabler" abfangen/mitbekommen kann, damit ich es entsprechend handlen kann. Daher dachte ich das ich bei WinAPI besser aufgehoben bin. Das andere hat sich ja eigentlich erst jetzt rausgestellt. Meinst du ich sollte wegen dem Performance-Verhalten in Verbindung mit WindowProc die Frage nochmal in den MFC-Bereich stellen?



  • Das musst du wissen, ich kenne ja deinen Quellcode nicht und kann somit auch nicht sagen in welchem Teil es hängt ..
    War wie gesagt nur aus Interesse, sollte nicht heißen, dass das das falsche Forum hier ist 🙂


Anmelden zum Antworten