我曾经Sleep(0)在我的代码的某些部分看到一些无限/长while循环可用.我被告知它会使时间片可用于其他等待进程.这是真的?有什么意义Sleep(0)吗?
我已经发现了另一个问题,即Windows/MingW没有为过时的usleep()提供nanosleep()和setitimer()替代方案.但我的目标是修复cppcheck给我的所有警告,包括usleep()样式警告.
那么,是否有一种解决方法可以在不使用cygwin或安装大量新依赖项/库的情况下以某种方式避免使用Windows上的usleep()?谢谢.
在消息传递客户端测试应用程序中,需要限制生产者线程以避免泛滥服务器.
由于传输速率约为每秒25,000条消息(每条消息40微秒),因此睡眠(1)引起的延迟时间太长.
如何在Windows上使线程休眠不到一毫秒包含一些与Windows API相关的信息.是否有Delphi的代码片段,类或库?
按照Bens的回答,我发现不同值低于15的睡眠也会提供不同的传输速率(Windows Vista):
每20条消息后休眠(1):
00:02 tx/rx 25740/3705 12831/1846 msgs/sec (77/541 microsecs/msg)
00:04 tx/rx 53101/7405 13255/1848 msgs/sec (75/541 microsecs/msg)
00:06 tx/rx 79640/11288 13260/1879 msgs/sec (75/532 microsecs/msg)
00:08 tx/rx 104520/14562 13055/1818 msgs/sec (76/550 microsecs/msg)
00:10 tx/rx 130760/18829 13066/1881 msgs/sec (76/531 microsecs/msg)
Run Code Online (Sandbox Code Playgroud)
每20条消息后睡觉(5):
00:02 tx/rx 7640/3622 3812/1807 msgs/sec (262/553 microsecs/msg)
00:04 tx/rx 14660/10794 3661/2695 msgs/sec (273/371 microsecs/msg)
00:06 tx/rx 21480/18171 3577/3026 msgs/sec (279/330 microsecs/msg)
00:08 tx/rx 28140/25642 3515/3203 msgs/sec (284/312 microsecs/msg)
00:10 tx/rx 34980/32692 3496/3267 msgs/sec (286/306 microsecs/msg)
Run Code Online (Sandbox Code Playgroud)
在阅读有关忙碌等待下限的评论后,这是意料之外的 …
我有运行循环的线程.我需要每5ms运行一次循环(1ms错误).我知道Sleep()函数不精确.
你有什么建议吗?
更新.我不能以其他方式做到这一点.在循环结束时,我需要某种睡眠.我也不想加载100%的CPU.
Unix有各种睡眠API(睡眠,睡眠,纳米睡眠).我知道睡眠的唯一Win32功能是Sleep(),它以毫秒为单位.
我看到大多数睡眠,即使在Unix上,也会大幅度上升(即:通常为大约10ms).我在Solaris上看到过,如果你以root身份运行,你可以获得10毫秒以下的休眠时间,我知道如果启用了精细粒度计时器内核参数,这也可以在HPUX上运行.Windows上是否有更精细的粒度计时器?如果是,那么什么是API?
以下函数System.Threading.Thread.Sleep(); 以毫秒为单位延迟线程,并将整数值作为参数.是否有任何线程延迟的方法,以微秒为单位.或者可以睡眠功能取浮动值?谢谢
可能重复:
睡眠时间小于一毫秒
如何使程序睡眠纳秒?我搜索了互联网,我发现了几种睡眠方式,但是:
windows.h的Sleep()睡眠时间只有几毫秒.
ctime的nanosleep()是仅适用于POSIX系统,而我使用的是Windows.
我也试过这个:
int usleep(long usec)
{
struct timeval tv;
tv.tv_sec = usec/1000000L;
tv.tv_usec = usec%1000000L;
return select(0, 0, 0, 0, &tv);
};
Run Code Online (Sandbox Code Playgroud)
但Code :: Blocks说:
obj\Release\main.o:main.cpp|| undefined reference to `select@20'|
Run Code Online (Sandbox Code Playgroud)
我尝试了很多东西,但一切都失败了.我该怎么办?
我正在尝试模拟按键和按键动作.
例如:2638毫秒.
SendMessage(hWnd, WM_KEYDOWN, keyCode, 0);
Sleep(2638);
SendMessage(hWnd, WM_KEYUP, keyCode, 0);
Run Code Online (Sandbox Code Playgroud)
你怎么知道它真的有用吗?
上周我需要测试一些不同的算法函数,为了让自己变得容易,我添加了一些人工睡眠并简单地测量了时钟时间.像这样的东西:
start = clock();
for (int i=0;i<10000;++i)
{
...
Sleep(1);
...
}
end = clock();
Run Code Online (Sandbox Code Playgroud)
由于睡眠的参数以毫秒表示,我预计总挂钟时间约为10秒(由于算法而大,因此现在不重要),这确实是我的结果.
今天早上我因为新的Microsoft Windows热修复而不得不重新启动我的电脑,令我惊讶的是睡眠(1)不再需要1毫秒,但大约需要0.0156秒.
所以我的测试结果完全搞砸了,因为总时间从10秒增加到大约156秒.
我们在几台PC上进行了测试,显然在一些PC上,一次睡眠的结果确实是1 ms.在其他PC上它是0.0156秒.
然后,突然,一段时间后,睡眠时间下降到0.01秒,然后一小时后回到0.001秒(1毫秒).
这是Windows中的正常行为吗?Windows重启后的第一个小时是"困",然后在一段时间后逐渐获得更高的睡眠粒度?或者是否有任何其他方面可以解释行为的变化?
在我的所有测试中,没有其他应用程序同时运行(或者:至少不占用任何CPU).
有任何想法吗?
操作系统是Windows 7.
在开发一个程序来计算由555定时器IC产生的脉冲的频率和脉冲宽度时,通过PC并行端口进入PC.我注意到每次运行代码时它都显示不同的值,所以我开始测试循环和定时器的准确性.我运行了以下代码,并指出它们不准确(我可能错了,请纠正我,如果我是!):
对于计时器:
int sec = 0;
private void button2_Click(object sender, EventArgs e)
{
sec = DateTime.Now.Second;
i = 0;
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
if (sec == DateTime.Now.Second)
{
i++;
}
else
{
timer1.Enabled = false;
MessageBox.Show(i.ToString(),"Timer Output");
}
}
Run Code Online (Sandbox Code Playgroud)
输出: 应该相同,但是:

对于LOOP:
private void button1_Click(object sender, EventArgs e)
{
i = 0;
CheckForIllegalCrossThreadCalls = false;
Thread t1 = new Thread(LoopTest);
t1.Start();
}
void LoopTest()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
this.Cursor = …Run Code Online (Sandbox Code Playgroud)