#pragma once

#include "Thread.h"
#include <functional>

namespace Framework
{
    class AsynchronCall : private Thread
    {
    private:
        std::function< void() > f;
        bool *finished;

        void thread() override;
        void threadEnd() override;

    public:
        //! Konstruktor
        //! \param f Die Funktion die asynchron aufgerufen werden soll
        //!  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
        DLLEXPORT AsynchronCall( std::function< void() > f );
        //! Konstruktor
        //! \param name Der Name des Threads
        //! \param f Die Funktion die asynchron aufgerufen werden soll
        //!  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
        DLLEXPORT AsynchronCall( const char *name, std::function< void() > f );
        //! Konstruktor
        //! \param f Die Funktion die asynchron aufgerufen werden soll
        //! \param finished Wird auf 1 gesetzt wenn der Aufruf abgearbeitet wurde
        //!  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
        DLLEXPORT AsynchronCall( std::function< void() > f, bool *finished );
        //! Konstruktor
        //! \param name Der Name des Threads
        //! \param f Die Funktion die asynchron aufgerufen werden soll
        //! \param finished Wird auf 1 gesetzt wenn der Aufruf abgearbeitet wurde
        //!  Muss mit new aufgerufen werden. Das Objekt löscht sich selbst
        DLLEXPORT AsynchronCall( const char* name, std::function< void() > f, bool* finished );
    };
}