for的简单小问题,有点奇怪,麻烦各位看下

时间:2021-06-13 17:37:02
不知是我糊涂还是咋了,死活看不出问题,

各位看看什么一个情况, 代码应该是:执行完AutoClick1后sleep5000再执行AutoClick2,接着循环执行前面步骤

可为什么实际执行顺序是:执行完AutoClick1后sleep5000再执行AutoClick2,接着sleep5000才再开始执行前面步骤?

AutoClick1前面没有sleep了啊。为啥会在AutoClick1前面sleep呢?


 private void button1_Click(object sender, EventArgs e)
        {
         int p =int.Parse(this.textBox1.Text);
            for (int i = 0; i < p; i++)
            { 
                AutoClick1(ck_X, ck_Y);
                Thread.Sleep(5000);
                AutoClick2(ck_X2, ck_Y2); 
            }

        }

40 个解决方案

#1


AutoClick1或AutoClick2函数里面有sleep吗?

#2


程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1

for的简单小问题,有点奇怪,麻烦各位看下

#3


引用 1 楼  的回复:
AutoClick1或AutoClick2函数里面有sleep吗?

函数里没sleep

#4


引用 2 楼  的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1

貌似有这可能,怎么能释放下么?

#5


人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
引用 2 楼  的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1

#6


yes 是这情况,就是执行完AutoClick2之后又sleep5000,才重新执行AutoClick1.。。很是奇怪,

两个函数里都没有sleep的。。

引用 5 楼  的回复:
人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
引用 2 楼  的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1

#7


AutoClick1和AutoClick2在同一个线程?

#8


引用 5 楼  的回复:
人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?

引用 2 楼 的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1

你没仔细思考问题,他的意思是说,第二次进入for循环之后,给楼主的错觉是先sleep,再AutoClick1。

#9


引用 5 楼  的回复:
人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
引用 2 楼  的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1


无论是AutoClick1还是AutoClick2,让楼主感觉到不爽的原因就是Sleep阻塞了主线程没刷新界面
可以把for放到线程里
也可以在AutoClick2后面加一行:Application.DoEvents();

for的简单小问题,有点奇怪,麻烦各位看下

#10


他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
 for (int i = 0; i < p; i++)

AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2); 
}
引用 7 楼  的回复:
AutoClick1和AutoClick2在同一个线程?

#11


错觉
错觉

for的简单小问题,有点奇怪,麻烦各位看下

#12


引用 10 楼  的回复:
他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
 for (int i = 0; i < p; i++)

AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2); 
}
引用 7 楼  的回复:

AutoClick1和AutoClick2在同一个线程?

不可能出现你说的问题,可能是你观察错误。
你单步调试看看就知道了。

#13


那是你的错觉了、自己调下吧
引用 10 楼  的回复:
他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
 for (int i = 0; i < p; i++)

AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2); 
}

引用 7 楼 的回复:

AutoClick1和AutoClick2在同一个线程?

#14


这个真不是错觉,是真真实实的在AutoClick2之后停留了和AutoClick2之前一样的时间。

如果sleep时间短,那有可能是错觉,但我都sleep 10000 这么久 就很明显了。

#15



private void button1_Click(object sender, EventArgs e)
        {
         int p =int.Parse(this.textBox1.Text);
            for (int i = 0; i < p; i++)
            { 
                AutoClick1(ck_X, ck_Y);
                MessageBox.Show("AutoClick1");
                Thread.Sleep(5000);
                AutoClick2(ck_X2, ck_Y2); 
                MessageBox.Show("AutoClick2");
            }
        }


你这样打印看看就知道什么时候停止的了。

#16


你是凭什么判断 ,AutoClick 是在Sleep之后再执行的? 不会是看界面的变化吧?

建议你不要这么做,因为 AutoClick所做的界面变更,可能因为Sleep阻塞主线程,导致没有界面没有被刷新,等阻塞结束了,AutoClick的变更才被显示出来。所以让你有这种错觉,

#17


我理解你的意思了、 for的简单小问题,有点奇怪,麻烦各位看下
引用 9 楼  的回复:
引用 5 楼 的回复:

人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
引用 2 楼 的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1


无论是AutoClick1还……

#18


哦,我不是通过界面判断的,程序运行后,可以最小化,是不看界面的。我做的是个自动点击的小东东,

先点击一个坐标,sleep一会再点击另一个坐标,然后循环如此。


引用 16 楼  的回复:
你是凭什么判断 ,AutoClick 是在Sleep之后再执行的? 不会是看界面的变化吧?

建议你不要这么做,因为 AutoClick所做的界面变更,可能因为Sleep阻塞主线程,导致没有界面没有被刷新,等阻塞结束了,AutoClick的变更才被显示出来。所以让你有这种错觉,

#19


为什么不断点看看怎么走的 

#20


给位看看这是什么情况?如15楼所说,我加了打印,

奇怪的是加了打印之后AutoClick2居然没有sleep停顿了,而是马上就执行了AutoClick1


引用 15 楼  的回复:
C# code

private void button1_Click(object sender, EventArgs e)
        {
         int p =int.Parse(this.textBox1.Text);
            for (int i = 0; i < p; i++)
            { 
                AutoCl……

#21


断电的时候一切正常的,根本就没有AutoClick2之后的sleep
引用 19 楼  的回复:
为什么不断点看看怎么走的

#22


引用 18 楼  的回复:
哦,我不是通过界面判断的,程序运行后,可以最小化,是不看界面的。我做的是个自动点击的小东东,

先点击一个坐标,sleep一会再点击另一个坐标,然后循环如此。

你的思路最终效果是这样吧:

点击点1,睡眠5秒,点击点2,点击点3,睡眠5秒,点击点4,点击点5。。。假如函数执行时间为瞬时,你点2、4、6。。。的点击根本就看不到,所以:你看鼠标变化不准确。

你这代码循环里的sleep是做什么的,为什么sleep没有放在点击事件里呢。

#23


楼主你换成控制台程序试试吧,sleep UI线程,你真心给力啊.

#24


我点击的是IE页面上的按钮,不是看鼠标的变化,点击之后页面上是有变化的。另外我还试着把sleep放到AutoClick()函数里面去了,但是一样的效果,还是会在第二个点击之后停顿。。

引用 22 楼  的回复:
引用 18 楼  的回复:
哦,我不是通过界面判断的,程序运行后,可以最小化,是不看界面的。我做的是个自动点击的小东东,

先点击一个坐标,sleep一会再点击另一个坐标,然后循环如此。


你的思路最终效果是这样吧:

点击点1,睡眠5秒,点击点2,点击点3,睡眠5秒,点击点4,点击点5。。。假如函数执行时间为瞬时,你点2、4、6。。。的点击根本就看不到,所以:你看鼠标变化不准……

#25


不要在主线程上 sleep

#26



每天回帖即可获得10分可用分

#27


打断点调试,添加监视,看它咋走的

#28


线程问题,建议你看一下CSDN有一个大牛写的串口线程,里面对线程的挑取讲解的比较详细

#29


把你的全部代码贴出来,看现在的代码没有问题,把所以代码贴出来

#30


这个问题很简单的

#31


我这破代码,发出来让大家见笑,我现在也有点怀疑可能是sleep不能这样用

另外,断点监视一切正常运行。

 private void AutoClick(int x, int y)
        {
            POINT p = new POINT();
            GetCursorPos(out p);
            try
            {
                SetCursorPos(x, y);
                mouse_event((int)(MouseEventFlags.LeftDown | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);
                mouse_event((int)(MouseEventFlags.LeftUp | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);
            }
            finally
            {
                SetCursorPos(p.X, p.Y);
            }
        }


        private void button1_Click(object sender, EventArgs e)
        {
            ck_X = int.Parse(this.textBox2.Text);
            ck_Y = int.Parse(this.textBox3.Text);
            ck_X2 = int.Parse(this.textBox4.Text);
            ck_Y2 = int.Parse(this.textBox5.Text);
            sleeptime = int.Parse(this.textBox6.Text);
            int p =int.Parse(this.textBox1.Text);  //预期点击次数
            

            for (int i = 0; i < p; i++)
            {
                AutoClick(ck_X, ck_Y); 
                Thread.Sleep(sleeptime); 
                AutoClick(ck_X2, ck_Y2); 
            }
            

        }

#32


Sleep最好配合下多线程使用,别堵塞主线程,UI伤不起啊~
 private void button1_Click(object sender, EventArgs e)
{
ck_X = int.Parse(this.textBox2.Text);
            ck_Y = int.Parse(this.textBox3.Text);
            ck_X2 = int.Parse(this.textBox4.Text);
            ck_Y2 = int.Parse(this.textBox5.Text);
            sleeptime = int.Parse(this.textBox6.Text);
            int p =int.Parse(this.textBox1.Text);  //预期点击次数

object state=ck_Y+"-"+ck_X2+"-"+ck_Y2+"-"+sleeptime+"-"p
ThreadPool.QueueUserWorkItem(new WaitCallback(My_Click),object); 
 private void My_Click(Object state)
{
object[] obj=state.Split('-');

//这边类型你自己转换
ck_X = obj[0];
ck_Y = obj[1];
ck_X2 = obj[2];
ck_Y2 = obj[3];
sleeptime = obj[4];
int p =obj[5];

for (int i = 0; i < p; i++)
            {
                AutoClick(ck_X, ck_Y); 
                Thread.Sleep(sleeptime); 
                AutoClick(ck_X2, ck_Y2); 
            }
}
}


#33


会不会是程序跑太快了,鼠标没反应过来
楼主试试在每次控制鼠标点击后加个100毫秒左右的小延迟

#34


如果把 Thread.Sleep(5000);放在AutoClick1(ck_X, ck_Y)方法的最后面呢???

#35


for的简单小问题,有点奇怪,麻烦各位看下Thread.Sleep(5000);这个感觉咋是另一个线程睡觉成员函数勒

#36


该回复于2012-11-03 16:57:51被管理员删除

#37


该回复于2012-11-04 02:15:07被管理员删除

#38


来学习一下!呵呵!

#39


引用 10 楼 lianghuating 的回复:
他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
 for (int i = 0; i < p; i++)

AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2); 
}
引用 7 楼  的回复:AutoClick1和AutoClick2在同一……


你这是明显的windows消息机制问题,你mouseevent会先将你的点击操作加入消息队列,等待执行。
sleep执行后阻塞UI线程,消息队列处于阻塞状态,你的mouseevnet还未执行。
你无法保证你模拟点击后windows正好立即处理点击,没准是先被sleep阻塞了消息队列了

#40


也就是说你AutoClick中所进行的窗口操作都是被加入windows消息队列中,排队执行,还未等到执行,就已经被sleep阻塞。
sleep中,UI线程是不获取cpu执行时间的,那么你的消息队列就不会被处理,处于等待状态
sleep后,UI线程重新得到cpu执行时间,消息队列接着处理,这时候你的mouseevent就可能正好得到执行了

#1


AutoClick1或AutoClick2函数里面有sleep吗?

#2


程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1

for的简单小问题,有点奇怪,麻烦各位看下

#3


引用 1 楼  的回复:
AutoClick1或AutoClick2函数里面有sleep吗?

函数里没sleep

#4


引用 2 楼  的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1

貌似有这可能,怎么能释放下么?

#5


人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
引用 2 楼  的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1

#6


yes 是这情况,就是执行完AutoClick2之后又sleep5000,才重新执行AutoClick1.。。很是奇怪,

两个函数里都没有sleep的。。

引用 5 楼  的回复:
人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
引用 2 楼  的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1

#7


AutoClick1和AutoClick2在同一个线程?

#8


引用 5 楼  的回复:
人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?

引用 2 楼 的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1

你没仔细思考问题,他的意思是说,第二次进入for循环之后,给楼主的错觉是先sleep,再AutoClick1。

#9


引用 5 楼  的回复:
人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
引用 2 楼  的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1


无论是AutoClick1还是AutoClick2,让楼主感觉到不爽的原因就是Sleep阻塞了主线程没刷新界面
可以把for放到线程里
也可以在AutoClick2后面加一行:Application.DoEvents();

for的简单小问题,有点奇怪,麻烦各位看下

#10


他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
 for (int i = 0; i < p; i++)

AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2); 
}
引用 7 楼  的回复:
AutoClick1和AutoClick2在同一个线程?

#11


错觉
错觉

for的简单小问题,有点奇怪,麻烦各位看下

#12


引用 10 楼  的回复:
他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
 for (int i = 0; i < p; i++)

AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2); 
}
引用 7 楼  的回复:

AutoClick1和AutoClick2在同一个线程?

不可能出现你说的问题,可能是你观察错误。
你单步调试看看就知道了。

#13


那是你的错觉了、自己调下吧
引用 10 楼  的回复:
他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
 for (int i = 0; i < p; i++)

AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2); 
}

引用 7 楼 的回复:

AutoClick1和AutoClick2在同一个线程?

#14


这个真不是错觉,是真真实实的在AutoClick2之后停留了和AutoClick2之前一样的时间。

如果sleep时间短,那有可能是错觉,但我都sleep 10000 这么久 就很明显了。

#15



private void button1_Click(object sender, EventArgs e)
        {
         int p =int.Parse(this.textBox1.Text);
            for (int i = 0; i < p; i++)
            { 
                AutoClick1(ck_X, ck_Y);
                MessageBox.Show("AutoClick1");
                Thread.Sleep(5000);
                AutoClick2(ck_X2, ck_Y2); 
                MessageBox.Show("AutoClick2");
            }
        }


你这样打印看看就知道什么时候停止的了。

#16


你是凭什么判断 ,AutoClick 是在Sleep之后再执行的? 不会是看界面的变化吧?

建议你不要这么做,因为 AutoClick所做的界面变更,可能因为Sleep阻塞主线程,导致没有界面没有被刷新,等阻塞结束了,AutoClick的变更才被显示出来。所以让你有这种错觉,

#17


我理解你的意思了、 for的简单小问题,有点奇怪,麻烦各位看下
引用 9 楼  的回复:
引用 5 楼 的回复:

人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
引用 2 楼 的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1


无论是AutoClick1还……

#18


哦,我不是通过界面判断的,程序运行后,可以最小化,是不看界面的。我做的是个自动点击的小东东,

先点击一个坐标,sleep一会再点击另一个坐标,然后循环如此。


引用 16 楼  的回复:
你是凭什么判断 ,AutoClick 是在Sleep之后再执行的? 不会是看界面的变化吧?

建议你不要这么做,因为 AutoClick所做的界面变更,可能因为Sleep阻塞主线程,导致没有界面没有被刷新,等阻塞结束了,AutoClick的变更才被显示出来。所以让你有这种错觉,

#19


为什么不断点看看怎么走的 

#20


给位看看这是什么情况?如15楼所说,我加了打印,

奇怪的是加了打印之后AutoClick2居然没有sleep停顿了,而是马上就执行了AutoClick1


引用 15 楼  的回复:
C# code

private void button1_Click(object sender, EventArgs e)
        {
         int p =int.Parse(this.textBox1.Text);
            for (int i = 0; i < p; i++)
            { 
                AutoCl……

#21


断电的时候一切正常的,根本就没有AutoClick2之后的sleep
引用 19 楼  的回复:
为什么不断点看看怎么走的

#22


引用 18 楼  的回复:
哦,我不是通过界面判断的,程序运行后,可以最小化,是不看界面的。我做的是个自动点击的小东东,

先点击一个坐标,sleep一会再点击另一个坐标,然后循环如此。

你的思路最终效果是这样吧:

点击点1,睡眠5秒,点击点2,点击点3,睡眠5秒,点击点4,点击点5。。。假如函数执行时间为瞬时,你点2、4、6。。。的点击根本就看不到,所以:你看鼠标变化不准确。

你这代码循环里的sleep是做什么的,为什么sleep没有放在点击事件里呢。

#23


楼主你换成控制台程序试试吧,sleep UI线程,你真心给力啊.

#24


我点击的是IE页面上的按钮,不是看鼠标的变化,点击之后页面上是有变化的。另外我还试着把sleep放到AutoClick()函数里面去了,但是一样的效果,还是会在第二个点击之后停顿。。

引用 22 楼  的回复:
引用 18 楼  的回复:
哦,我不是通过界面判断的,程序运行后,可以最小化,是不看界面的。我做的是个自动点击的小东东,

先点击一个坐标,sleep一会再点击另一个坐标,然后循环如此。


你的思路最终效果是这样吧:

点击点1,睡眠5秒,点击点2,点击点3,睡眠5秒,点击点4,点击点5。。。假如函数执行时间为瞬时,你点2、4、6。。。的点击根本就看不到,所以:你看鼠标变化不准……

#25


不要在主线程上 sleep

#26



每天回帖即可获得10分可用分

#27


打断点调试,添加监视,看它咋走的

#28


线程问题,建议你看一下CSDN有一个大牛写的串口线程,里面对线程的挑取讲解的比较详细

#29


把你的全部代码贴出来,看现在的代码没有问题,把所以代码贴出来

#30


这个问题很简单的

#31


我这破代码,发出来让大家见笑,我现在也有点怀疑可能是sleep不能这样用

另外,断点监视一切正常运行。

 private void AutoClick(int x, int y)
        {
            POINT p = new POINT();
            GetCursorPos(out p);
            try
            {
                SetCursorPos(x, y);
                mouse_event((int)(MouseEventFlags.LeftDown | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);
                mouse_event((int)(MouseEventFlags.LeftUp | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);
            }
            finally
            {
                SetCursorPos(p.X, p.Y);
            }
        }


        private void button1_Click(object sender, EventArgs e)
        {
            ck_X = int.Parse(this.textBox2.Text);
            ck_Y = int.Parse(this.textBox3.Text);
            ck_X2 = int.Parse(this.textBox4.Text);
            ck_Y2 = int.Parse(this.textBox5.Text);
            sleeptime = int.Parse(this.textBox6.Text);
            int p =int.Parse(this.textBox1.Text);  //预期点击次数
            

            for (int i = 0; i < p; i++)
            {
                AutoClick(ck_X, ck_Y); 
                Thread.Sleep(sleeptime); 
                AutoClick(ck_X2, ck_Y2); 
            }
            

        }

#32


Sleep最好配合下多线程使用,别堵塞主线程,UI伤不起啊~
 private void button1_Click(object sender, EventArgs e)
{
ck_X = int.Parse(this.textBox2.Text);
            ck_Y = int.Parse(this.textBox3.Text);
            ck_X2 = int.Parse(this.textBox4.Text);
            ck_Y2 = int.Parse(this.textBox5.Text);
            sleeptime = int.Parse(this.textBox6.Text);
            int p =int.Parse(this.textBox1.Text);  //预期点击次数

object state=ck_Y+"-"+ck_X2+"-"+ck_Y2+"-"+sleeptime+"-"p
ThreadPool.QueueUserWorkItem(new WaitCallback(My_Click),object); 
 private void My_Click(Object state)
{
object[] obj=state.Split('-');

//这边类型你自己转换
ck_X = obj[0];
ck_Y = obj[1];
ck_X2 = obj[2];
ck_Y2 = obj[3];
sleeptime = obj[4];
int p =obj[5];

for (int i = 0; i < p; i++)
            {
                AutoClick(ck_X, ck_Y); 
                Thread.Sleep(sleeptime); 
                AutoClick(ck_X2, ck_Y2); 
            }
}
}


#33


会不会是程序跑太快了,鼠标没反应过来
楼主试试在每次控制鼠标点击后加个100毫秒左右的小延迟

#34


如果把 Thread.Sleep(5000);放在AutoClick1(ck_X, ck_Y)方法的最后面呢???

#35


for的简单小问题,有点奇怪,麻烦各位看下Thread.Sleep(5000);这个感觉咋是另一个线程睡觉成员函数勒

#36


该回复于2012-11-03 16:57:51被管理员删除

#37


该回复于2012-11-04 02:15:07被管理员删除

#38


来学习一下!呵呵!

#39


引用 10 楼 lianghuating 的回复:
他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
 for (int i = 0; i < p; i++)

AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2); 
}
引用 7 楼  的回复:AutoClick1和AutoClick2在同一……


你这是明显的windows消息机制问题,你mouseevent会先将你的点击操作加入消息队列,等待执行。
sleep执行后阻塞UI线程,消息队列处于阻塞状态,你的mouseevnet还未执行。
你无法保证你模拟点击后windows正好立即处理点击,没准是先被sleep阻塞了消息队列了

#40


也就是说你AutoClick中所进行的窗口操作都是被加入windows消息队列中,排队执行,还未等到执行,就已经被sleep阻塞。
sleep中,UI线程是不获取cpu执行时间的,那么你的消息队列就不会被处理,处于等待状态
sleep后,UI线程重新得到cpu执行时间,消息队列接着处理,这时候你的mouseevent就可能正好得到执行了