Asynchroner Funktionsaufruf



  • std::queue + Vorposters stuff



  • Ich nutze VS2008 SP1. Mein Compiler kennt zwar <functional>, jedoch nicht std::tr1::function bzw. std::tr1::bind.

    <boost/bind.hpp> und <boost/function.hpp> kennt der Compiler leider auch nicht.

    Was nun?



  • Das Zauberwort ist APC - Asynchronous Procedure Call

    QueueUserAPC(Funktion,Thread,Parameter);
    

    Verzögert aufrufen? Kein ding:

    BOOL WINAPI CreateTimerQueueTimer(
      __out     PHANDLE phNewTimer,
      __in_opt  HANDLE TimerQueue,
      __in      WAITORTIMERCALLBACK Callback,
      __in_opt  PVOID Parameter,
      __in      DWORD DueTime,
      __in      DWORD Period,
      __in      ULONG Flags
    );
    


  • AP0LL0 schrieb:

    ...

    Ist grausig anzusehen und nicht portabel (Weil WinAPI, wenn ich das richtig entziffere). Dann doch lieber, was die Vorposter geschrieben haben 🙂



  • Neulinger schrieb:

    Ich nutze VS2008 SP1. Mein Compiler kennt zwar <functional>, jedoch nicht std::tr1::function bzw. std::tr1::bind.

    #include <iostream>
    #include <functional>
    #include <queue>
    
    void fun(int a, double b)
    {
        std::cout << "a: " << a << ", b: " << b << std::endl;
    };
    
    int main()
    {
        typedef std::tr1::function<void ()> command_type;
        typedef std::queue<command_type> command_queue_type;
    
        command_queue_type command_queue;
    
        command_queue.push(std::tr1::bind(&fun, 42, 3.14159));
    
        std::cout << "la li lueue..." << std::endl;
    
        command_queue.front()();
        command_queue.pop();
    
    }
    

    Ausgabe:

    la li lueue...
    a: 42, b: 3.14159
    Drücken Sie eine beliebige Taste . . .
    

    Gebaut mit:

    Microsoft Visual Studio 2008
    Version 9.0.30729.1 SP
    


  • Wenn ich das richtig verstehe, muss ich ja hier explizit die Funktionsausführung anfordern?!

    Ich möchte eigentlich folgendes:

    void fun(int a, double b)
    {
        std::cout << "a: " << a << ", b: " << b << std::endl;
    };
    
    void meth()
    {      
        fun(5,10); // irgendwie asynchroner Funktionsaufruf!!!
    
        std::cout << "la li lueue..." << std::endl; // weitere Funktionen und Methoden
        // usw.   
    } // nach Abschluss der Funktion wird die Funktion aufgerufen
    

    Prinzipiell soll es also wie ein asynchrones Eventhandling funktionieren. Dabei wird der Delegate erst "am Ende des Codes" aufgerufen. Der Aufruf des Delegate hat sich nämlich in die Dispatcher Reihenfolge eingereiht und wird ausgeführt, sobald er an der Reihe ist...



  • Guck Dir mal boost.asio an. Damit kann man sowas ganz wunderbar umsetzen.



  • Ist "#include <boost/function.hpp>" eine Standardbibliothek? Denn leider kann ich sie nicht ohne Weiteres hinzufügen:

    fatal error C1083: Datei (Include) kann nicht geöffnet werden: "boost/function.hpp": No such file or directory



  • Neulinger schrieb:

    Ist "#include <boost/function.hpp>" eine Standardbibliothek? Denn leider kann ich sie nicht ohne Weiteres hinzufügen:

    fatal error C1083: Datei (Include) kann nicht geöffnet werden: "boost/function.hpp": No such file or directory

    Nein, Boost gehört nicht zur C++ Standard Library.

    http://www.boost.org/
    http://www.boostpro.com/download/



  • Neulinger schrieb:

    Was nun?

    Informationen zu Boost findest du auf deren Seite, für MSVC gibt es sogar einen Installer.



  • So endlich die Einbindung der library geschafft ;-). Ich hatte dann jedoch einen error beim compilen, dass "std::abort nicht existiert" (war in einer Boost Datei). Ich habe es dann einfach ausgeklammert, danach konnte ich compilen.

    Mir fällt es derzeit relativ schwer einen Einstieg zu finden, den asynchronen Funktionsaufruf durch zu führen. Boost bietet ja eben noch vieles mehr an Funktionalitäten... Wo soll ich anfangen zu suchen?



  • Wurde doch schon gesagt: Boost.Asio
    Konkret bei boost::asio::io_service und dessen Member Funktion post(..).


Anmelden zum Antworten