Okno - wykonywanie funkcji w tle.

0

Witam, staram się napisać DLL, która wywoła konsolę i będę mógł za jej pomocą sterować funkcjami programu włączać/ wyłączać je, napisałem do momentu podania komendy, program wywołuje funkcję i niestety wtedy nie mogę już wpisać żadnej innej komendy, ponieważ funkcja opiera się na pętli nieskończonej i podejrzewam, że do czasu kiedy funkcja się nie wykona, nie mogę operować na menu, ponieważ to kolejna pętla nieskończona na case. Czy ktoś mógłby mi sprecyzować keyword dla zjawiska, które opisałem, albo podesłać do tego kurs/tut? W skrócie, chcę żeby po wpisaniu komendy do konsoli funkcja się wykonywała "w tle?/2 wątku?", a ja mógł wpisać np. drugą komendę ją wyłączającą. Przykład: Wpisuję /komenda on - funkcja(petla) zaczyna sie wykonywac i w momencie kiedy chce, ją przerwać wpisuje /komenda off.

EDIT: Zdecydowałem się jednak na GUI, ale nadal istnieje problem,, chciałem stworzyć nowy Thread przez

MobberThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Mobber, 0, 0, 0);

niestety natychmiastowo crashuje to aplikacje.

0

Mały przykład realizujący co opisałeś.

exec - odpala polecenie
stop exec - przerywa polecenie
exit - przerywa pętlę główną

#include <iostream>
#include <future>
#include <memory>

struct Command
{
private:
    bool m_bStop = true;

    void Execute()
    {
        m_bStop = false;
        for(int i = 1; !m_bStop; ++i)
        {
            std::cout << "command execution loop: " << i << '.' << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(3));
        }

        std::cout << "execution stopped." << std::endl;
    }
public:
    void exec()
    {
        future = std::async(std::launch::async, std::bind(&Command::Execute, this));
    }

    void stop()
    {
        m_bStop = true;
    }

    std::future<void> future;
};

int main()
{
    std::unique_ptr<Command> pCommand;
    std::string input;
    std::cout << "command: ";


    while(std::getline(std::cin, input))
    {
        input.erase(input.find_last_not_of(" \n\r\t")+1); // rtrim last whitespaces
        if(input == "exec")
        {
            if(!pCommand)
            {
                pCommand.reset(new Command());
                pCommand->exec();
            }
        }
        else if(input == "stop exec")
        {
            if(pCommand)
            {
                pCommand->stop();
                pCommand.reset();
            }
        }
        else if(input == "exit")
        {
            break;
        }

        std::cout << "command: ";
    }

    if(pCommand)
    {
        pCommand->stop();
        pCommand->future.get();
    }

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1