Synchrone Calls - Asynchrone Calls (threaded)



  • Die Situation ist recht einfach zu beschreiben.
    Es gibt eine Klasse A deren Methoden sehr lange laufen können.
    Der normale Aufruf geschieht synchron im Code:

    Result = A->Funktion1(...)
    // done
    

    Dies könnte zukünftig so aussehen (asynchron)

    A->QueueFunction(Funktion(...), Result);
    A->Run();
    
    while( A->IsRunning() ) { 
      cout << ".";
      sleep/yield();
    }
    // done
    

    Frage 1 : Wie sieht eine schöne C++-Deklaration von QueueFunction aus ?

    Frage 2 : Wie sieht der konkrete Funktionsaufruf aus wenn dieses Objekt von der Queue ausgeführt wird ?

    Bitte keine Diskussion über Events anfangen, aber
    Danke für Rückmeldungen.



  • Ich denke mal, dass du so was, wie Funktionszeiger suchst.

    Sehr ausführlich und auf Englisch:
    http://www.newty.de/fpt/index.html



  • NoNoob schrieb:

    Dies könnte zukünftig so aussehen (asynchron)

    A->QueueFunction(Funktion(...), Result);
    A->Run();
    
    while( A->IsRunning() ) { 
      cout << ".";
      sleep/yield();
    }
    // done
    

    Frage 1 : Wie sieht eine schöne C++-Deklaration von QueueFunction aus ?

    Ich würde bevorzugen:

    Future< ResultType > res = A.Funktion1( ... );
        // ... mache was anderes
        ResultType r = *res; // Aufruf blockiert, falls Result noch nicht vorliegt.
    
        // oder 
        for( ; res.empty(); sleep(..) )
            cout << ".";
        cout << endl;
        ResultType r = *res;
    

    Gruß
    Werner



  • Werner_logoff schrieb:

    ...

    Ein toller Tip, wo doch schon so viele Standardbibliotheken mit Futures existieren... 🙄

    Ich würde die Funktion entkoppeln. In Deiner Klasse läuft ein Thread (permanent), der darauf wartet, dass Die Funktion aufgerfufen wird. Wenn der Aufruf abgearbeitet ist, wird, wie gehabt ein Flag gesetzt, und der Thread wartet auf den nächsten Aufruf. Wenn die Funktion mehrere male hintereinander (schneller als der Thread arbeiten kann) aufgerufen werden soll, kann man die Aufrufe queuen, und dann nacheinander abarbeiten.


Anmelden zum Antworten