各位看看什么一个情况, 代码应该是:执行完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
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1
#3
函数里没sleep
#4
貌似有这可能,怎么能释放下么?
#5
人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
#6
yes 是这情况,就是执行完AutoClick2之后又sleep5000,才重新执行AutoClick1.。。很是奇怪,
两个函数里都没有sleep的。。
两个函数里都没有sleep的。。
#7
AutoClick1和AutoClick2在同一个线程?
#8
你没仔细思考问题,他的意思是说,第二次进入for循环之后,给楼主的错觉是先sleep,再AutoClick1。
#9
无论是AutoClick1还是AutoClick2,让楼主感觉到不爽的原因就是Sleep阻塞了主线程没刷新界面
可以把for放到线程里
也可以在AutoClick2后面加一行:Application.DoEvents();
#10
他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
for (int i = 0; i < p; i++)
{
AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2);
}
for (int i = 0; i < p; i++)
{
AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2);
}
#11
错觉
错觉
错觉
#12
不可能出现你说的问题,可能是你观察错误。
你单步调试看看就知道了。
#13
那是你的错觉了、自己调下吧
#14
这个真不是错觉,是真真实实的在AutoClick2之后停留了和AutoClick2之前一样的时间。
如果sleep时间短,那有可能是错觉,但我都sleep 10000 这么久 就很明显了。
如果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的变更才被显示出来。所以让你有这种错觉,
建议你不要这么做,因为 AutoClick所做的界面变更,可能因为Sleep阻塞主线程,导致没有界面没有被刷新,等阻塞结束了,AutoClick的变更才被显示出来。所以让你有这种错觉,
#17
我理解你的意思了、
#18
哦,我不是通过界面判断的,程序运行后,可以最小化,是不看界面的。我做的是个自动点击的小东东,
先点击一个坐标,sleep一会再点击另一个坐标,然后循环如此。
先点击一个坐标,sleep一会再点击另一个坐标,然后循环如此。
#19
为什么不断点看看怎么走的
#20
给位看看这是什么情况?如15楼所说,我加了打印,
奇怪的是加了打印之后AutoClick2居然没有sleep停顿了,而是马上就执行了AutoClick1
奇怪的是加了打印之后AutoClick2居然没有sleep停顿了,而是马上就执行了AutoClick1
#21
断电的时候一切正常的,根本就没有AutoClick2之后的sleep
#22
你的思路最终效果是这样吧:
点击点1,睡眠5秒,点击点2,点击点3,睡眠5秒,点击点4,点击点5。。。假如函数执行时间为瞬时,你点2、4、6。。。的点击根本就看不到,所以:你看鼠标变化不准确。
你这代码循环里的sleep是做什么的,为什么sleep没有放在点击事件里呢。
#23
楼主你换成控制台程序试试吧,sleep UI线程,你真心给力啊.
#24
我点击的是IE页面上的按钮,不是看鼠标的变化,点击之后页面上是有变化的。另外我还试着把sleep放到AutoClick()函数里面去了,但是一样的效果,还是会在第二个点击之后停顿。。
#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毫秒左右的小延迟
楼主试试在每次控制鼠标点击后加个100毫秒左右的小延迟
#34
如果把 Thread.Sleep(5000);放在AutoClick1(ck_X, ck_Y)方法的最后面呢???
#35
Thread.Sleep(5000);这个感觉咋是另一个线程睡觉成员函数勒
#36
#37
#38
来学习一下!呵呵!
#39
你这是明显的windows消息机制问题,你mouseevent会先将你的点击操作加入消息队列,等待执行。
sleep执行后阻塞UI线程,消息队列处于阻塞状态,你的mouseevnet还未执行。
你无法保证你模拟点击后windows正好立即处理点击,没准是先被sleep阻塞了消息队列了
#40
也就是说你AutoClick中所进行的窗口操作都是被加入windows消息队列中,排队执行,还未等到执行,就已经被sleep阻塞。
sleep中,UI线程是不获取cpu执行时间的,那么你的消息队列就不会被处理,处于等待状态
sleep后,UI线程重新得到cpu执行时间,消息队列接着处理,这时候你的mouseevent就可能正好得到执行了
sleep中,UI线程是不获取cpu执行时间的,那么你的消息队列就不会被处理,处于等待状态
sleep后,UI线程重新得到cpu执行时间,消息队列接着处理,这时候你的mouseevent就可能正好得到执行了
#1
AutoClick1或AutoClick2函数里面有sleep吗?
#2
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1
#3
函数里没sleep
#4
貌似有这可能,怎么能释放下么?
#5
人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?
#6
yes 是这情况,就是执行完AutoClick2之后又sleep5000,才重新执行AutoClick1.。。很是奇怪,
两个函数里都没有sleep的。。
两个函数里都没有sleep的。。
#7
AutoClick1和AutoClick2在同一个线程?
#8
你没仔细思考问题,他的意思是说,第二次进入for循环之后,给楼主的错觉是先sleep,再AutoClick1。
#9
无论是AutoClick1还是AutoClick2,让楼主感觉到不爽的原因就是Sleep阻塞了主线程没刷新界面
可以把for放到线程里
也可以在AutoClick2后面加一行:Application.DoEvents();
#10
他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
for (int i = 0; i < p; i++)
{
AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2);
}
for (int i = 0; i < p; i++)
{
AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2);
}
#11
错觉
错觉
错觉
#12
不可能出现你说的问题,可能是你观察错误。
你单步调试看看就知道了。
#13
那是你的错觉了、自己调下吧
#14
这个真不是错觉,是真真实实的在AutoClick2之后停留了和AutoClick2之前一样的时间。
如果sleep时间短,那有可能是错觉,但我都sleep 10000 这么久 就很明显了。
如果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的变更才被显示出来。所以让你有这种错觉,
建议你不要这么做,因为 AutoClick所做的界面变更,可能因为Sleep阻塞主线程,导致没有界面没有被刷新,等阻塞结束了,AutoClick的变更才被显示出来。所以让你有这种错觉,
#17
我理解你的意思了、
#18
哦,我不是通过界面判断的,程序运行后,可以最小化,是不看界面的。我做的是个自动点击的小东东,
先点击一个坐标,sleep一会再点击另一个坐标,然后循环如此。
先点击一个坐标,sleep一会再点击另一个坐标,然后循环如此。
#19
为什么不断点看看怎么走的
#20
给位看看这是什么情况?如15楼所说,我加了打印,
奇怪的是加了打印之后AutoClick2居然没有sleep停顿了,而是马上就执行了AutoClick1
奇怪的是加了打印之后AutoClick2居然没有sleep停顿了,而是马上就执行了AutoClick1
#21
断电的时候一切正常的,根本就没有AutoClick2之后的sleep
#22
你的思路最终效果是这样吧:
点击点1,睡眠5秒,点击点2,点击点3,睡眠5秒,点击点4,点击点5。。。假如函数执行时间为瞬时,你点2、4、6。。。的点击根本就看不到,所以:你看鼠标变化不准确。
你这代码循环里的sleep是做什么的,为什么sleep没有放在点击事件里呢。
#23
楼主你换成控制台程序试试吧,sleep UI线程,你真心给力啊.
#24
我点击的是IE页面上的按钮,不是看鼠标的变化,点击之后页面上是有变化的。另外我还试着把sleep放到AutoClick()函数里面去了,但是一样的效果,还是会在第二个点击之后停顿。。
#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毫秒左右的小延迟
楼主试试在每次控制鼠标点击后加个100毫秒左右的小延迟
#34
如果把 Thread.Sleep(5000);放在AutoClick1(ck_X, ck_Y)方法的最后面呢???
#35
Thread.Sleep(5000);这个感觉咋是另一个线程睡觉成员函数勒
#36
#37
#38
来学习一下!呵呵!
#39
你这是明显的windows消息机制问题,你mouseevent会先将你的点击操作加入消息队列,等待执行。
sleep执行后阻塞UI线程,消息队列处于阻塞状态,你的mouseevnet还未执行。
你无法保证你模拟点击后windows正好立即处理点击,没准是先被sleep阻塞了消息队列了
#40
也就是说你AutoClick中所进行的窗口操作都是被加入windows消息队列中,排队执行,还未等到执行,就已经被sleep阻塞。
sleep中,UI线程是不获取cpu执行时间的,那么你的消息队列就不会被处理,处于等待状态
sleep后,UI线程重新得到cpu执行时间,消息队列接着处理,这时候你的mouseevent就可能正好得到执行了
sleep中,UI线程是不获取cpu执行时间的,那么你的消息队列就不会被处理,处于等待状态
sleep后,UI线程重新得到cpu执行时间,消息队列接着处理,这时候你的mouseevent就可能正好得到执行了