Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 调用Sleep的程序不';t wakup关于信号_Winapi - Fatal编程技术网

Winapi 调用Sleep的程序不';t wakup关于信号

Winapi 调用Sleep的程序不';t wakup关于信号,winapi,Winapi,在Linux中,当调用“sleep”的执行线程暂停其执行时。一旦向进程发送信号,“sleep”函数立即返回。我可以安装我的信号处理程序并正确设置下面的标志以退出while循环 // a signal handler set 'flag' on CTRL-C while(flag) { sleep(10); // returns on signal caught } 在窗户里我看不到。我正在使用“睡眠(DWORD毫秒)”,并且我已经使用“信号”函数安装了我的信号处理程序。实际上,睡眠线程

在Linux中,当调用“sleep”的执行线程暂停其执行时。一旦向进程发送信号,“sleep”函数立即返回。我可以安装我的信号处理程序并正确设置下面的标志以退出while循环

// a signal handler set 'flag' on CTRL-C

while(flag) {
   sleep(10); // returns on signal caught
}
在窗户里我看不到。我正在使用“睡眠(DWORD毫秒)”,并且我已经使用“信号”函数安装了我的信号处理程序。实际上,睡眠线程只在“睡眠”结束时恢复

在交代码之前,我必须做什么才能让“睡眠”返回? 我使用的是正确的方法(使用标志退出while循环)还是必须查看其他内容?

您应该使用

将循环替换为对的调用,并调用control-C处理程序


(当然,在实践中,你不太可能真的希望你的程序在用户按下control-C之前袖手旁观,什么也不做。但这就是问题所呈现的场景,这个答案为你提供了一个更现实场景的起点。)

我甚至不知道WIndows有*nix样式的信号:(…不,无论您在做什么,轮询标志都不是正确的方法。它浪费CPU并增加了可避免的延迟(在您的情况下,平均为5毫秒).Windows有大量synchro对象。信号量等待几乎肯定会起作用。此外,该标志需要是易变的。忘记该标志,在Windows synchro上阅读并正确执行:)使用bAlertable=TRUE,并在插入APC时返回函数。如果使用
ZwDelayExecution
direct(此api和调用
Sleep[Ex]
)您还可以通过警报来中断等待-
ZwAlertThread
一旦停止调用sleep,事情就会好转