线程仅运行一次,但他处于无限while循环中

时间:2019-04-28 12:48:51

标签: c++ multithreading winapi

因此,我尝试获取所有按键并将其每分钟保存一次到文件中。所以我得到了while循环来获取按键,并且第一次一切都很好,但是在那之后线程就无法接近函数了。没有任何崩溃,但结果不可接受。

// MyLib.d.ts (edited for use with the `MyLib` identifier
declare namespace MyLib {
    function callMe(): boolean;
    enum Ex {
        true = 0,
        false = 1
    }
    namespace ns {
        function fn(): string;
    }
}

1 个答案:

答案 0 :(得分:2)

  

WriteKeyStrokesToFile函数仅被调用一次

应该如此。线程仅运行一次其功能。当函数退出时,就是这样,线程完成了。您无法重新启动线程,您所能做的就是创建一个新线程。

  

为什么线程在无限的while循环中只能工作1次。

因为在线程中根本没有循环。您有一个在线程外运行的代码循环,向线程提供数据。

要执行所需的操作,只需在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;
}