Как мне запрограммировать параллельный ввод с клавиатуры - PullRequest
0 голосов
/ 24 мая 2018

Как написано ранее, я хотел бы знать, как работает параллельный ввод с клавиатуры.

Это мой код:

cout << "Enter time for Key A: ";
cin >> timeA;
cout << "Enter time for Key B: ";
cin >> timeB;
while (1)
{

    Sleep(timeA);
    INPUT ip;
    ip.type = INPUT_KEYBOARD;
    ip.ki.time = 0;
    ip.ki.dwFlags = KEYEVENTF_UNICODE; // Specify the key as a unicode character
    ip.ki.wScan = 'A'; // Which keypress to simulate
    ip.ki.wVk = 0;
    ip.ki.dwExtraInfo = 0;
    SendInput(1, &ip, sizeof(INPUT));


    Sleep(timeB);
    ip.type = INPUT_KEYBOARD;
    ip.ki.time = 0;
    ip.ki.dwFlags = KEYEVENTF_UNICODE; // Specify the key as a unicode character
    ip.ki.wScan = 'B'; // Which keypress to simulate
    ip.ki.wVk = 0;
    ip.ki.dwExtraInfo = 0;
    SendInput(1, &ip, sizeof(INPUT));

}

Это работает, но я бы хотел, чтобы, например, буква A нажималась каждые 500 мс, а буква B нажималась каждые 1 с.,Как бы я это сделал?

1 Ответ

0 голосов
/ 24 мая 2018

Это класс таймера.Вы можете создать объект и вызывать его следующим образом:

timer timer_1(time_in_milliseconds, true_if_async, &function_name, argument_1, arg_2, ...);

Таким образом, вы можете запускать свои функции по прошествии определенного времени, вы можете запускать несколько функций вместе с асинхронным или просто использовать синхронизацию ипоставить их в очередь.Ваш выбор.

Темы - лучшее решение для вашей проблемы.

class timer
{
public:
    template <class Callable, class... Arguments>
    timer(int after, const bool async, Callable&& f, Arguments&&... args)
    {
        std::function<typename std::result_of<Callable(Arguments...)>::type()> task(bind(forward<Callable>(f), forward<Arguments>(args)...));

        if (async)
        {
            thread([after, task]()
            {
                std::this_thread::sleep_for(std::chrono::milliseconds(after));
                task();
            }).detach();
        }
        else
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(after));
            task();
        }
    }
};

Вот небольшой пример использования:

void say(const string& word)
{
    cout << "Hello, " << word << "!\n";
}

int main(int argc, char* argv[])
{
    while (true)
    {
        timer timer1(500, false, &say, "pyreN - A");
        timer timer2(1000, false, &say, "pyreN - B");
    }
}
...