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

lianghuating 2012-11-02 10:26:14
不知是我糊涂还是咋了,死活看不出问题,

各位看看什么一个情况, 代码应该是:执行完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);
}

}

...全文
648 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
mngzilin 2012-11-04
  • 打赏
  • 举报
回复
也就是说你AutoClick中所进行的窗口操作都是被加入windows消息队列中,排队执行,还未等到执行,就已经被sleep阻塞。 sleep中,UI线程是不获取cpu执行时间的,那么你的消息队列就不会被处理,处于等待状态 sleep后,UI线程重新得到cpu执行时间,消息队列接着处理,这时候你的mouseevent就可能正好得到执行了
mngzilin 2012-11-04
  • 打赏
  • 举报
回复
引用 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阻塞了消息队列了
salecn 2012-11-03
  • 打赏
  • 举报
回复
来学习一下!呵呵!
yuandonghuia 2012-11-02
  • 打赏
  • 举报
回复
楼主你换成控制台程序试试吧,sleep UI线程,你真心给力啊.
神马都能聊 2012-11-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
哦,我不是通过界面判断的,程序运行后,可以最小化,是不看界面的。我做的是个自动点击的小东东,

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

[/Quote]
你的思路最终效果是这样吧:

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

你这代码循环里的sleep是做什么的,为什么sleep没有放在点击事件里呢。
lianghuating 2012-11-02
  • 打赏
  • 举报
回复
断电的时候一切正常的,根本就没有AutoClick2之后的sleep
[Quote=引用 19 楼 的回复:]

为什么不断点看看怎么走的
[/Quote]
lianghuating 2012-11-02
  • 打赏
  • 举报
回复
给位看看这是什么情况?如15楼所说,我加了打印,

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


[Quote=引用 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……
[/Quote]
清明_ 2012-11-02
  • 打赏
  • 举报
回复
为什么不断点看看怎么走的
lianghuating 2012-11-02
  • 打赏
  • 举报
回复
哦,我不是通过界面判断的,程序运行后,可以最小化,是不看界面的。我做的是个自动点击的小东东,

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


[Quote=引用 16 楼 的回复:]

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

建议你不要这么做,因为 AutoClick所做的界面变更,可能因为Sleep阻塞主线程,导致没有界面没有被刷新,等阻塞结束了,AutoClick的变更才被显示出来。所以让你有这种错觉,
[/Quote]
  • 打赏
  • 举报
回复
我理解你的意思了、
[Quote=引用 9 楼 的回复:]
引用 5 楼 的回复:

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


无论是AutoClick1还……
[/Quote]
烈火蜓蜻 2012-11-02
  • 打赏
  • 举报
回复
你是凭什么判断 ,AutoClick 是在Sleep之后再执行的? 不会是看界面的变化吧?

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

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");
}
}


你这样打印看看就知道什么时候停止的了。
lianghuating 2012-11-02
  • 打赏
  • 举报
回复
这个真不是错觉,是真真实实的在AutoClick2之后停留了和AutoClick2之前一样的时间。

如果sleep时间短,那有可能是错觉,但我都sleep 10000 这么久 就很明显了。
  • 打赏
  • 举报
回复
那是你的错觉了、自己调下吧
[Quote=引用 10 楼 的回复:]
他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
for (int i = 0; i < p; i++)
{
AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2);
}

引用 7 楼 的回复:

AutoClick1和AutoClick2在同一个线程?
[/Quote]
Hauk 2012-11-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
for (int i = 0; i < p; i++)
{
AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2);
}
引用 7 楼 的回复:

AutoClick1和AutoClick2在同一个线程?
[/Quote]
不可能出现你说的问题,可能是你观察错误。
你单步调试看看就知道了。
SocketUpEx 2012-11-02
  • 打赏
  • 举报
回复
错觉
错觉

lianghuating 2012-11-02
  • 打赏
  • 举报
回复
他俩其实就是同意个函数,只是我传入的参数不同,我的代码实际上是这样的。
for (int i = 0; i < p; i++)
{
AutoClick(ck_X, ck_Y);
Thread.Sleep(sleeptime);
AutoClick(ck_X2, ck_Y2);
}
[Quote=引用 7 楼 的回复:]

AutoClick1和AutoClick2在同一个线程?
[/Quote]
SocketUpEx 2012-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

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

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

神马都能聊 2012-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
人家问的是AutoClick2后
执行Sleep再去执行AutoClick1的
如果AutoClick2函数里面没有Sleep的话不应该才对啊
LZ你看清楚了?

引用 2 楼 的回复:
程序肯定是在执行AutoClick1后才Sleep的
只不过Sleep卡了主线程
你眼睛感觉以为是Sleep才AutoClick1
[/Quote]
你没仔细思考问题,他的意思是说,第二次进入for循环之后,给楼主的错觉是先sleep,再AutoClick1。
  • 打赏
  • 举报
回复
AutoClick1和AutoClick2在同一个线程?
加载更多回复(18)

110,566

社区成员

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

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

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