• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

线程休眠10ms,换一台机器变15ms

angel_hl 2020-10-22 02:22:36
用了几种线程延时的方法,但是编译后的程序在别的机器上就显示休眠时间15ms,在自己的机器上就是10ms
int TimeMS =10;
while (SendDataTS_End)
{
while (SendDataTS_End)
{
Stopwatch sw = new Stopwatch();
sw.Start();

//Delay(TimeMS);
//Wait(TimeMS);
System.Threading.Thread.Sleep(TimeMS);
//Thread.SpinWait(TimeMS);
//Thread.Sleep(TimeMS);
sw.Stop();
long totalTime = sw.ElapsedMilliseconds;
}
}

public static void Wait(int ms)
{
DateTime t = DateTime.Now;
bool pd = true;
while (pd)
{
TimeSpan ts = DateTime.Now - t;
if (ts.TotalMilliseconds >= ms)
{
pd = false;
}
}
}


[DllImport("kernel32.dll")]
static extern uint GetTickCount();
static void Delay(uint ms)
{
uint start = GetTickCount();
while (GetTickCount() - start < ms)
{
//Application.DoEvents();
}
}
...全文
11591 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiayadong 2020-10-23
这个结果是正常的,线程切换的时间片在10-20ms左右
回复
良朋 2020-10-23
代码太多没看完,不过我坚信还是代码问题,不相信是电脑精度或者是windows本身的问题。
回复
datafansbj 2020-10-23
你说的这三种方法,哪种执行结果不对?
第一种:使用 Sleep,还套用了两层循环,看不懂要做什么
第二种:使用循环和日期函数,日期函数精确度不高,会超过 ms 级,另外循环会占用 CPU 时间,对结果会有影响
第三种:使用循环和 TickCount,循环会占用 CPU 时间,对结果会有影响

Windows 本身实时性不高,要求精确到 ms 级是比较困难的。
回复
ziqi0716 2020-10-23
Thread.Sleep()方法休眠的时间不准确的,包括Timer(.net两个命名空间下的都是)的计时都不是精确计时的,写代码如果必须用精确计时,需要用其他实现(搜下"C#精确计时"),但,通常仔细分析需求后都会发现,不需要精确计时,甚至不需要计时器.
回复
晨易夕 2020-10-23
首先你应该知道Thread.Sleep是用来干什么的,如果你知道Sleep(0)和不睡眠的区别,这个问题也好解答了。
回复
angel_hl 2020-10-22
引用 1 楼 assky124 的回复:
Threed Sleep 只是保证间隔不小于10,CPU调度,你执行也要时间的。电脑本身就不是实时系统,一般精度在100MS

并且做不到的反倒是高处理器大内存的
回复
angel_hl 2020-10-22
现在是在2台机器能做到2台做不到,我想知道因为什么
回复
assky124 2020-10-22
Threed Sleep 只是保证间隔不小于10,CPU调度,你执行也要时间的。电脑本身就不是实时系统,一般精度在100MS
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2020-10-22 02:22
社区公告

让您成为最强悍的C#开发者