Progress Dialog einbinden



  • Hallo,

    ich möchte in eine DLL/LIB einen ProgressDialog einbinden, da ein Vorgang mehrere Minuten dauert, und stoße dabei an meine bescheidenen Programmierfähigkeiten.

    Zunächst wollte ich es ganz allgemein halten und für alle Funktionen vom Typ erstellen:

    typedef void(*updater)(int);
    

    komme allerdings nicht weiter.

    Nun versuche ich es mit wxProgressDialog::Update() von wxWidgets. Die Funktion sieht wie folgt aus:

    virtual bool Update(int value, const wxString& newmsg = wxEmptyString, bool *skip = NULL);
    

    Sie entspricht somit folgendem typedef:

    typedef bool(wxProgressDialog::*wx_28_updater)(int,const wxString &, bool *);
    

    Nun erstelle ich einen ProgressDialog.

    wxProgressDialog progress("Calculating Boundaries","");
    

    Die Updatefunktion wäre dann diese:

    progress.Update(50); // 50%
    

    Gibt es eine Möglichkeit nur die Adresse der Updatefunktion zu übergeben, so dass ich nicht die ganze wxWidgets Information in die DLL unterbringen muss?

    Am liebsten würde ich so einen aufruf machen:

    MyDLL_Open(filename,wx_28_updater);
    

    Und in der Open Funktion:

    // MyDLL
    // wxWidgets Klassen bekanntgeben
    class wxString,wxProgressDialog;
    // ProgressDialog Funktion bekanntgeben
    extern bool wxProgressDialog::Update(int, const wxString &, bool *);
    typedef bool(wxProgressDialog::*wx_28_updater)(int,const wxString &, bool *);
    wx_28_updater updater = {&wxProgressDialog::Update};
    
    MyDLL_Open(char *filename,wx_28_updater *updater){
    
    for(int i=0;i<100;i++) (*updater)(i,"",NULL");
    
    }
    

    Könnte mir bitte jemand einen Tipp geben wie man ein derartiges Problem lösen könnte ohne dass der Quellcode viele Abhängigkeiten durch externe Header bekommt? Es läuft nämlich schon bei der Bekanntgabe der Updatefunktion fehl.



  • Habe ich irgendwo einen Fehler begangen? Ist es ein sinnloses unterfangen? Nicht realisierbar?



  • status schrieb:

    Habe ich irgendwo einen Fehler begangen?

    Jap. Schau mal in die Forenunterschrift und vergleiche die mit deinem Thema. Standrad-C++ kennt keine Dialogboxen usw.

    Was ich da allerdings sehe ist folgendes: du hast einen Pointer-to-Member, versuchst den aber als freie Funktion aufzurufen. Du musst ein Objekt vom richtigen Typ haben und mit diesem die Funktion aufrufen, schließlich ist es eine Memberfunktion.



  • pumuckl schrieb:

    status schrieb:

    Habe ich irgendwo einen Fehler begangen?

    Jap. Schau mal in die Forenunterschrift und vergleiche die mit deinem Thema. Standrad-C++ kennt keine Dialogboxen usw.

    Es muss ja keine Dialogbox sein. Ich möchte einen Zeiger auf eine Memberfunktion als Parameter übergeben damit die empfangende Funktion die übergebene Funktion aufrufen kann.



  • status schrieb:

    Es muss ja keine Dialogbox sein. Ich möchte einen Zeiger auf eine Memberfunktion als Parameter übergeben damit die empfangende Funktion die übergebene Funktion aufrufen kann.

    Auch dazu hab ich was geschrieben - du musst noch ein Objekt mitliefern, für das die Memberfunktion aufgerufen werden soll.


Anmelden zum Antworten