Thread.sleep() 为什么暂停时间不对?

时间:2021-03-21 20:57:07
我用Thread.sleep(2000),要暂停程序2秒钟,可是我发现暂停的时间根本没有2秒,有的时候很快就到了。我把时间设置大点,如5000毫秒,还是一样的。这是怎么回事?如精确的控制暂停的时间呢?

11 个解决方案

#1


贴代码,不会这样的,肯定是其它什么地方影响到了。

#2


引用 1 楼 guwei4037 的回复:
贴代码,不会这样的,肯定是其它什么地方影响到了。


我的代码是模拟鼠标和键盘输入的,理想的是每模拟一次输入,都暂停个几秒,等界面变化后,在进行下次模拟输入

//点击再次群发
            SetCursorPos(200, 800);
            mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
            
            //全选按钮
            SetCursorPos(420, 85);
            mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
            Thread.Sleep(2000);
            //下一步按钮
            SetCursorPos(250, 800);
            mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
            Thread.Sleep(2000);
            //点击输入框
            SetCursorPos(150, 800);
            mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
            Thread.Sleep(1000);

#3


引用 1 楼 guwei4037 的回复:
贴代码,不会这样的,肯定是其它什么地方影响到了。


但是发现,每次模拟输入完了之后,等待的时间并不是sleep里面的时间,就这造成了,界面还没有变化,就开始下一次模拟输入了。我改了时间,但是效果不明显

#4


Thread.CurrentThread.Join(2000);

#5


引用 4 楼 guwei4037 的回复:
Thread.CurrentThread.Join(2000);


这个不是阻塞调用它的父线程,直到线程结束才返回父线程嘛?

#6


引用 5 楼 fp2001 的回复:
Quote: 引用 4 楼 guwei4037 的回复:

Thread.CurrentThread.Join(2000);


这个不是阻塞调用它的父线程,直到线程结束才返回父线程嘛?

是的,我想知道对你的程序有效吗?

#7


引用 6 楼 guwei4037 的回复:
Quote: 引用 5 楼 fp2001 的回复:

Quote: 引用 4 楼 guwei4037 的回复:

Thread.CurrentThread.Join(2000);


这个不是阻塞调用它的父线程,直到线程结束才返回父线程嘛?

是的,我想知道对你的程序有效吗?


我试了下,和sleep的效果差不多,但是我发现了一个奇怪的现象

for (int i = 0; i < 2; i++)
            {
                Thread.Sleep(3000);
                SetCursorPos(50, 100);
                mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
                //Thread.Sleep(3000);
            }


这个代码我是要点击三次,每次点击之间暂停3000毫秒,假如我把sleep放在mouse_event后面,时间久不太准备,而且,经常出现只点击了两下的情况。但是我无意中把sleep放到了循环的开头哪里,就是上面的代码,发现时间就准确多了,最关键的是每次运行都是点击了三次。不知道怎么回事,发现一旦用了线程之后奇怪的事情很多

#8


引用 7 楼 fp2001 的回复:
Quote: 引用 6 楼 guwei4037 的回复:

Quote: 引用 5 楼 fp2001 的回复:

Quote: 引用 4 楼 guwei4037 的回复:

Thread.CurrentThread.Join(2000);


这个不是阻塞调用它的父线程,直到线程结束才返回父线程嘛?

是的,我想知道对你的程序有效吗?


我试了下,和sleep的效果差不多,但是我发现了一个奇怪的现象

for (int i = 0; i < 3; i++)
            {
                Thread.Sleep(3000);
                SetCursorPos(50, 100);
                mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
                //Thread.Sleep(3000);
            }


这个代码我是要点击三次,每次点击之间暂停3000毫秒,假如我把sleep放在mouse_event后面,时间久不太准备,而且,经常出现只点击了两下的情况。但是我无意中把sleep放到了循环的开头哪里,就是上面的代码,发现时间就准确多了,最关键的是每次运行都是点击了三次。不知道怎么回事,发现一旦用了线程之后奇怪的事情很多


错了,刚才敲错了,i=3,不是等于2。问题还是那样,sleep前后顺序影响了点击的次数和时间不对劲

#9


同样求解。请大牛解答

#10


引用 9 楼 szzhuyike 的回复:
同样求解。请大牛解答

你也碰到这样的问题了?

#11


lz看看这个帖子:

What Thread sleep method is most precise: Monitor.Wait vs System.Timer vs DispatchTimer vs Threading.Timer
http://*.com/questions/10609718/what-thread-sleep-method-is-most-precise-monitor-wait-vs-system-timer-vs-dispat

How accurate is Thread.Sleep(TimeSpan)?
http://*.com/questions/1303667/how-accurate-is-thread-sleeptimespan

#1


贴代码,不会这样的,肯定是其它什么地方影响到了。

#2


引用 1 楼 guwei4037 的回复:
贴代码,不会这样的,肯定是其它什么地方影响到了。


我的代码是模拟鼠标和键盘输入的,理想的是每模拟一次输入,都暂停个几秒,等界面变化后,在进行下次模拟输入

//点击再次群发
            SetCursorPos(200, 800);
            mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
            
            //全选按钮
            SetCursorPos(420, 85);
            mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
            Thread.Sleep(2000);
            //下一步按钮
            SetCursorPos(250, 800);
            mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
            Thread.Sleep(2000);
            //点击输入框
            SetCursorPos(150, 800);
            mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
            Thread.Sleep(1000);

#3


引用 1 楼 guwei4037 的回复:
贴代码,不会这样的,肯定是其它什么地方影响到了。


但是发现,每次模拟输入完了之后,等待的时间并不是sleep里面的时间,就这造成了,界面还没有变化,就开始下一次模拟输入了。我改了时间,但是效果不明显

#4


Thread.CurrentThread.Join(2000);

#5


引用 4 楼 guwei4037 的回复:
Thread.CurrentThread.Join(2000);


这个不是阻塞调用它的父线程,直到线程结束才返回父线程嘛?

#6


引用 5 楼 fp2001 的回复:
Quote: 引用 4 楼 guwei4037 的回复:

Thread.CurrentThread.Join(2000);


这个不是阻塞调用它的父线程,直到线程结束才返回父线程嘛?

是的,我想知道对你的程序有效吗?

#7


引用 6 楼 guwei4037 的回复:
Quote: 引用 5 楼 fp2001 的回复:

Quote: 引用 4 楼 guwei4037 的回复:

Thread.CurrentThread.Join(2000);


这个不是阻塞调用它的父线程,直到线程结束才返回父线程嘛?

是的,我想知道对你的程序有效吗?


我试了下,和sleep的效果差不多,但是我发现了一个奇怪的现象

for (int i = 0; i < 2; i++)
            {
                Thread.Sleep(3000);
                SetCursorPos(50, 100);
                mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
                //Thread.Sleep(3000);
            }


这个代码我是要点击三次,每次点击之间暂停3000毫秒,假如我把sleep放在mouse_event后面,时间久不太准备,而且,经常出现只点击了两下的情况。但是我无意中把sleep放到了循环的开头哪里,就是上面的代码,发现时间就准确多了,最关键的是每次运行都是点击了三次。不知道怎么回事,发现一旦用了线程之后奇怪的事情很多

#8


引用 7 楼 fp2001 的回复:
Quote: 引用 6 楼 guwei4037 的回复:

Quote: 引用 5 楼 fp2001 的回复:

Quote: 引用 4 楼 guwei4037 的回复:

Thread.CurrentThread.Join(2000);


这个不是阻塞调用它的父线程,直到线程结束才返回父线程嘛?

是的,我想知道对你的程序有效吗?


我试了下,和sleep的效果差不多,但是我发现了一个奇怪的现象

for (int i = 0; i < 3; i++)
            {
                Thread.Sleep(3000);
                SetCursorPos(50, 100);
                mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, 0, 0, 0, UIntPtr.Zero);
                //Thread.Sleep(3000);
            }


这个代码我是要点击三次,每次点击之间暂停3000毫秒,假如我把sleep放在mouse_event后面,时间久不太准备,而且,经常出现只点击了两下的情况。但是我无意中把sleep放到了循环的开头哪里,就是上面的代码,发现时间就准确多了,最关键的是每次运行都是点击了三次。不知道怎么回事,发现一旦用了线程之后奇怪的事情很多


错了,刚才敲错了,i=3,不是等于2。问题还是那样,sleep前后顺序影响了点击的次数和时间不对劲

#9


同样求解。请大牛解答

#10


引用 9 楼 szzhuyike 的回复:
同样求解。请大牛解答

你也碰到这样的问题了?

#11


lz看看这个帖子:

What Thread sleep method is most precise: Monitor.Wait vs System.Timer vs DispatchTimer vs Threading.Timer
http://*.com/questions/10609718/what-thread-sleep-method-is-most-precise-monitor-wait-vs-system-timer-vs-dispat

How accurate is Thread.Sleep(TimeSpan)?
http://*.com/questions/1303667/how-accurate-is-thread-sleeptimespan