DLL Funktion als Memberfunktion (jaja, schonwieder DLL's ;)



  • N'abend
    Zur Zeit binde ich DLL's zB. so in meine Programme ein:

    typedef void (__stdcall* Out32Proc)( int PortAddress, int Value ); 
    HMODULE hInOutP = LoadLibrary( "inpout32.dll" ); 
    Out32Proc Out32 = (Out32Proc)GetProcAddress( hInOutP, "Out32" );
    

    Das funktioniert aber nur innerhalb einer Funktion, will ich Out32 in einer anderen Funktion verwenden, so muss ich sie dort ebenfalls mit dieser Methode am Anfang einbinden. Das währe ja auch nicht weiter störend, wenn ich Out32 nicht etwa alle 10ms bräuchte... leider ist dies aber der Fall.
    Ich habe eine Timer-funktion, die alle 10ms aufgerufen wird und dort wird Out32 verwendet. Leider bremst diese Einbindungsmethode den Timer stark aus, sodass er "nur" etwa 40ms schafft.
    Jetzt wollte ich fragen, ob man Out32 vielleicht in der OnInitDialog als Memberfunktion <einmal> einbinden könnte und danach auch ohne extra Einbindungscode verwenden kann.

    Hoffe ihr könnt mir da weiterhelfen 🙂



  • 10ms schafft kein Timer unter Windows.
    Windows ist kein Echtzeitsystem.



  • ok, dann werd ich mir anders behelfen... thx für die Info



  • doch 1-10ms gehn unter windows per cpu timing in assembler

    allerdings läuft dein programm dann unter volllast in ner while schleife und die andern prozesse bekommen kaum zeit mehr



  • Sovok schrieb:

    doch 1-10ms gehn unter windows per cpu timing in assembler

    allerdings läuft dein programm dann unter volllast in ner while schleife und die andern prozesse bekommen kaum zeit mehr

    Auch in assembler geht das nicht. Wie Unix-Tom schon gesagt hat, windows ist kein echteit system. Das ganze KANN 1-10ms ablaufen, wenn windows aber grad keine lust hat kanns auch 1-10s dauern.
    Kein echteit system == keine garantie das irgend was innerhalb einer gewissen zeitspanne abläuft.
    Das assembler gebastle ist also reine glückssache, wiel immer noch windows entscheided wer wieviel cpu-zeit bekommt und das kann win grad so machen wie es lust hat.



  • klar in der theorie gibt es keine garantie... hab ich auch nich behauptet

    aber in der praxis bekommt man eine genauigkeit von 1-10ms via assembler hin,
    falls man davon ausgehen kann, dass die eigene anwendung als einziges läuft



  • FatalError schrieb:

    Hoffe ihr könnt mir da weiterhelfen 🙂

    a) Du kannst diese Library doch statisch linken. Dann muss die Funktion auch nicht immer wieder geladen werden.

    b) Als Member (z.B. deiner Dialogklasse)
    Achtung: Nur das Wichtigste

    // dlg.h
    typedef void (__stdcall* Out32Proc)( int PortAddress, int Value ); 
    
    class Cdlg {
    private:
      Out32Proc fOut32_;  
      HMODULE hInst_;
    };
    
    // dlg.cpp
    Cdlg::Cdlg() : fInOut(0), hInst_(0) {
      hInst_ = LoadLibrary( "inpout32.dll" ); 
      if(hInst_)
        Out32Proc fOut32_ = (Out32Proc)GetProcAddress( hInOutP, "Out32" );
    }
    
    Cdlg::~Cdlg() {
      if(fOut32_)
        FreeLibrary(hInst_);    
    }
    
    Cdlg::OnTimer(/*...*/) {
      fOut32_(Port, Value);
    }
    

Anmelden zum Antworten