一个循环算法,关于sleep()的时间改成很长的时间后,程序会出现问题,求大神!

陈思汉 2013-12-16 08:23:00
部分代码如下,就是两个变量,一分钟循环一次,m_PerTime+1,循环25次后重置0,m_ReadTime+1.然后根据值,执行相关操作,问题就是当我把循环设置成10秒,就是sleep(10000),循环次数设置为2时,程序没问题。一直到退出都没出现问题,但是设置成1分钟,循环次数25次的时候,程序开始没问题,运行一段时间后就会出现问题了,主要是ctrl+w 的键盘消息 出现问题。(PS:ctrl+w是关闭当前网页的快捷键)
求大神啊,这是什么原因啊?
苦恼
对了,这个循环是单独的一个线程。

int m_PerTime=0;
int m_ReadTime=0;

for (int i=3;i>1;i++)
{
if (i%3!=0)
{
keybd_event(VK_DOWN,0,0,0);
keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0);
Sleep(60000);
m_PerTime=m_PerTime+1;
}
else
{
keybd_event(VK_UP,0,0,0);
keybd_event(VK_UP,0,KEYEVENTF_KEYUP,0);
Sleep(60000);
m_PerTime=m_PerTime+1;
}
if (m_PerTime==10)
{
keybd_event(VK_CONTROL,0,0,0);
keybd_event(0x57,0,0,0);
keybd_event(0x57,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
m_PerTime=0;
m_ReadTime=m_ReadTime+1;
}
switch (m_ReadTime)
{
case 1:ShellExecute(NULL,"open","http://202.120.126.58/Exec_Detail.asp?ExecID=485",NULL,NULL,SW_NORMAL);
break;
case 2:ShellExecute(NULL,"open","http://202.120.126.58/Exec_Detail.asp?ExecID=486",NULL,NULL,SW_NORMAL);
break;
case 3:ShellExecute(NULL,"open","http://202.120.126.58/Exec_Detail.asp?ExecID=487",NULL,NULL,SW_NORMAL);
break;
case 4:ShellExecute(NULL,"open","http://202.120.126.58/Exec_Detail.asp?ExecID=488",NULL,NULL,SW_NORMAL);
break;
case 5:ShellExecute(NULL,"open","http://202.120.126.58/Exec_Detail.asp?ExecID=510",NULL,NULL,SW_NORMAL);
break;
case 6:ShellExecute(NULL,"open","http://202.120.126.58/Exec_Detail.asp?ExecID=511",NULL,NULL,SW_NORMAL);
break;
case 7: ::SendMessage(g_hWNd,WM_CLOSE,0,0);
break;
}
...全文
333 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2013-12-18
  • 打赏
  • 举报
回复
我猜测你的程序并不是程序流程执行乱了, 而是那些键盘事件乱了. 你先把模拟键盘事件的代码注释, 以输出一个调试语句代替, 检查是否是程序逻辑乱执行.
大奶兔白糖 2013-12-18
  • 打赏
  • 举报
回复
引用 11 楼 u010677054 的回复:
[quote=引用 10 楼 bijiaoben 的回复:] 如果你想每个网页只打开一次,应该把switch语句放到if(m_PerTime==10){...}这个条件执行语句的大括号中。
我才看见。我昨天下午已经想到了,就是这个原因,switch的位置错了,所以才会出现后面的越来越多的情况。已经修正了,没问题了,谢谢哈!! 大神哇。!!![/quote] 我也是小屌丝,可以结帖了,兄弟
陈思汉 2013-12-18
  • 打赏
  • 举报
回复
引用 10 楼 bijiaoben 的回复:
如果你想每个网页只打开一次,应该把switch语句放到if(m_PerTime==10){...}这个条件执行语句的大括号中。
我才看见。我昨天下午已经想到了,就是这个原因,switch的位置错了,所以才会出现后面的越来越多的情况。已经修正了,没问题了,谢谢哈!! 大神哇。!!!
大奶兔白糖 2013-12-18
  • 打赏
  • 举报
回复
如果你想每个网页只打开一次,应该把switch语句放到if(m_PerTime==10){...}这个条件执行语句的大括号中。
大奶兔白糖 2013-12-18
  • 打赏
  • 举报
回复
引用 1 楼 u010677054 的回复:
对了,补充一下,出现的问题就是case语句会重复多次执行。就是打开重复的网页,应该就打开一次才对的
因为你每次的if,else走完后,都会进入switch语句中,而你每次进入switch中的时候,m_ReadTime的值分别是前十次为0,然后是10次1,然后是10次2.。。。。。 另外,楼主你这循环设置是25次是怎么计算出来的?
xiaohuh421 2013-12-17
  • 打赏
  • 举报
回复
连续调用了哪个case, 怎么进入的, 输出调试信息, 一目了然.
陈思汉 2013-12-17
  • 打赏
  • 举报
回复
引用 6 楼 xiaohuh421 的回复:
OutputDebugString 在调试运行的时候, 输出到VC的"输出"窗口. 在直接运行的时候, 输出到DebugView这个软件中. 还有这里是不是循环有问题 for (int i=3;i>1;i++) 我想你是要 i--吧.
谢谢啊,我晚上试一下,是i++,我是想2次down,一次up,就是以3为循环嘛,能整除的时候就是up,不能整除就down。 最奇怪的是,sleep设置10秒,循环次数为2的时候(为了测试时间短,看结果的),没问题,一直到switch最后一个case。程序退出,都没问题,但是sleep设置25分钟就不行了,大概是程序运行30分钟左右的时候,程序就乱了。我晚上试下输出调试程序,看看什么原因。
xiaohuh421 2013-12-17
  • 打赏
  • 举报
回复
OutputDebugString 在调试运行的时候, 输出到VC的"输出"窗口. 在直接运行的时候, 输出到DebugView这个软件中. 还有这里是不是循环有问题 for (int i=3;i>1;i++) 我想你是要 i--吧.
陈思汉 2013-12-17
  • 打赏
  • 举报
回复
引用 4 楼 xiaohuh421 的回复:
连续调用了哪个case, 怎么进入的, 输出调试信息, 一目了然.
我是菜鸟,刚学VC,如何输出调试信息?是调试一步一步运行么?还是能怎么输出?请指点下。很困扰
陈思汉 2013-12-16
  • 打赏
  • 举报
回复
引用 2 楼 rxguoblp 的回复:
switch (m_ReadTime) { case 1: break; ........... default: break;//???}
必须有default吗?
rxguoblp 2013-12-16
  • 打赏
  • 举报
回复
switch (m_ReadTime) { case 1: break; ........... default: break;//???}
陈思汉 2013-12-16
  • 打赏
  • 举报
回复
对了,补充一下,出现的问题就是case语句会重复多次执行。就是打开重复的网页,应该就打开一次才对的

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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