线程休眠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();
}
}
...全文
11742 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧