sleep后程序异常退出了。

云在飞 2012-01-18 05:27:22
我在基于对话框的mfc程序的 onok函数中间使用sleep(100),程序能正常执行完毕,但对话框一闪没了,结束了,怎么回事啊,请高手帮帮忙!我已经注释掉了系统的onok返回的。
...全文
518 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
云在飞 2012-01-29
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 superly 的回复:]

注意:process_count会不会超过MAX_PROCESS-1
导致CreateProcess()异常崩溃跳出

另外,那个Sleep(100);要保留,否则可能会CPU某个核占用100%
[/Quote]
谢楼上,就是这个问题,我的max_process定义小了,超出去了。
SuperLy 2012-01-29
  • 打赏
  • 举报
回复
注意:process_count会不会超过MAX_PROCESS-1
导致CreateProcess()异常崩溃跳出

另外,那个Sleep(100);要保留,否则可能会CPU某个核占用100%
云在飞 2012-01-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 fronz 的回复:]

你又不能提供代码,总这么问不是办法,尝试几个过程吧
分批次注释掉如下几部分,看在哪一部退出的。再分析原因
1、char chPath[301];----------- // CDialog::OnOK();整个模块
2、第二个循环体程序块
3、第三个循环体

中间略改动写代码。应该是在2、3步出的问题吧。
[/Quote]
回楼上,是第二个循环体,如果没有while()那个的话是没事的,可是为什么呢?难道CReateprocess除了成功或者失败外,还会发生异常退出的情况?可是对话框消失时并没有弹出任何异常啊,而且所有的子进程都正常运行了。
stjay 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zhouyuefei 的回复:]

还是不行啊,坐等高人指点!
[/Quote]

这样大家只能猜下猜下
上传代码,等哪位高人帮忙调试一下吧
长尾巴的悟空 2012-01-19
  • 打赏
  • 举报
回复
你加个按钮,把代码放里头试试。
云在飞 2012-01-19
  • 打赏
  • 举报
回复
还是不行啊,坐等高人指点!
云在飞 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fronz 的回复:]

”程序执行完毕,对话框一闪没了“
这本来就是这种按钮的功能。
原因是楼主
“注释掉了系统的onok返回”代码-----而仍用原来的按钮和消息响应。
如这不是你的本意,那么将按钮响应函数中的代码和按钮本身删掉,重新放一个,重新构造消息及复制删除的处理函数。
[/Quote]
我加了个按钮,把代码转移到这个按钮的响应函数中了,这和你说的应该是一个意思吧。谢谢!
云在飞 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hhyhw2001 的回复:]

::CloseHandle(pi[process_count].hThread);
::CloseHandle(pi[process_count].hProcess); //你的下标没有移动
应该是重复关闭
[/Quote]
第一个在for循环里,没有问题,第二个楼上有人提醒,已经改过来了,还是不行。
谢谢!
fronz 2012-01-19
  • 打赏
  • 举报
回复
”程序执行完毕,对话框一闪没了“
这本来就是这种按钮的功能。
原因是楼主
“注释掉了系统的onok返回”代码-----而仍用原来的按钮和消息响应。
如这不是你的本意,那么将按钮响应函数中的代码和按钮本身删掉,重新放一个,重新构造消息及复制删除的处理函数。
云在飞 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kaile 的回复:]

不用OnOK, 加一个按钮,在这个拉钮事件里做事。

另外,代码要重构, 一个函数只做一个事
[/Quote]
另加一个按钮,把代码都拷贝过去,还是不行。
这个onok其实只是做了读入几行数据,然后尽可能多的创建进程来执行,貌似也没什么好拆分的了。
还是谢谢你。
hhyhw2001 2012-01-19
  • 打赏
  • 举报
回复
::CloseHandle(pi[process_count].hThread);
::CloseHandle(pi[process_count].hProcess); //你的下标没有移动
应该是重复关闭
Kaile 2012-01-19
  • 打赏
  • 举报
回复
不用OnOK, 加一个按钮,在这个拉钮事件里做事。

另外,代码要重构, 一个函数只做一个事
云在飞 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sky101010ws 的回复:]

你是不是调用了父类的OnOk函数啊
如果你的OnOk按钮的ID是IDOK,则就是代表退出
[/Quote]
没有,注释掉了。
云在飞 2012-01-19
  • 打赏
  • 举报
回复
谢谢gg606,帮我纠正了::CloseHandle(pi[process_count].hProcess)这个错误,我也觉得好像问题不在sleep或者continue那,创建失败确实经常发生,我测试的时候用了一个messagebox,会不断弹出。但是那也不应该给我退出了啊,实在想不通。
fronz 2012-01-19
  • 打赏
  • 举报
回复
你又不能提供代码,总这么问不是办法,尝试几个过程吧
分批次注释掉如下几部分,看在哪一部退出的。再分析原因
1、char chPath[301];----------- // CDialog::OnOK();整个模块
2、第二个循环体程序块
3、第三个循环体

中间略改动写代码。应该是在2、3步出的问题吧。

云在飞 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 stjay 的回复:]

引用 15 楼 zhouyuefei 的回复:

还是不行啊,坐等高人指点!


这样大家只能猜下猜下
上传代码,等哪位高人帮忙调试一下吧
[/Quote]
基本就是那些了,你只要加个按钮,把那段代码放进去,进程随便给个exe,就是这个结果呀。
云在飞 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 gofqjyie 的回复:]

你加个按钮,把代码放里头试试。
[/Quote]
哥,我试过了,不行。
谢谢!
gg606 2012-01-18
  • 打赏
  • 举报
回复
创建失败是经常发生的吗?
我怎么觉得问题不在
// Sleep(100);
continue;//老是自动退出

那里!
还有
::CloseHandle(pi[process_count].hProcess); 这句应该是
::CloseHandle(pi[s].hProcess);吧?
云在飞 2012-01-18
  • 打赏
  • 举报
回复
sleep在一个for循环的while里边,不管用sleep还是continue都不行,子进程创建完了,父进程自己就退出了。
云在飞 2012-01-18
  • 打赏
  • 举报
回复
谢谢大家的热情,上代码:
void CFastDlg::OnOK()
{
// TODO: Add extra validation here
//////////////////////////////////////////////////////////////////////////
UpdateData();

char chPath[301];
STARTUPINFO si;
PROCESS_INFORMATION pi[MAX_PROCESS];
HANDLE hProcess[MAX_PROCESS],hthread;
SECURITY_ATTRIBUTES sa;

sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(sa);
::GetCurrentDirectory(300,(LPTSTR)chPath);//得到当前目录
char path[20]= "\\xxxx.exe";
strcat(chPath,path);
GetStartupInfo(&si); // 获取本进程的STARTUPINFO结构信息

char cmd[100] = {0, };
int process_count=0;
for(int i=0;i<userList.GetSize();i++)
{
memset(cmd,0,100);
CString str=" -u "+userList.GetAt(i);
::strcpy(cmd, str.GetBuffer(0));
/
while(!CreateProcess(chPath, cmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi[process_count]))
{

//创建失败就歇会再接着创建。
// Sleep(100);
continue;//老是自动退出

}
CString str2;
str2.Format("进程%d:",process_count);
m_info+=str2+str+"\r\n";
UpdateData(FALSE);
hProcess[process_count]=pi[process_count].hProcess;
::CloseHandle(pi[process_count].hThread);
process_count++;
}

for(int s=0;s<process_count;s++)
{
::CloseHandle(pi[process_count].hProcess);
}
// CDialog::OnOK();
}
加载更多回复(3)
从零开始讲述Java多线程的核心知识,通过板书和一步一步画图的方式,引领大家逐步去理解和掌握这些知识;并深入分析源码实现,理解背后的实现原理,知其然还要知其所以然。从多线程核心基础讲起,理解线程的风险,多种创建线程的方式;再到深入理解线程的状态;然后是线程的基本操作。系统、深入、快速上手实现多线程。 课程目标:    快速上手掌握Java多线程的经典课程,    系统、全面、深入掌握Java多线程的核心知识主讲老师:CC老师     20年Java开发和使用经验,多年的首席架构师和CTO,畅销原创书籍《研磨设计模式》的作者。         参与和领导了上百个大中型项目的设计和开发,在互联网应用系统架构、系统设计、    应用级框架和中间件开发等方面具有很多经验和领悟。    更为难得的是,入行20年,仍然奋战在技术一线,深知一线架构师需要掌握哪些技术、    掌握到什么程度、一线架构设计会遇到哪些坑、如何才能做出最合适的架构设计,经验最难得!适应人群:    想要系统、深入学习Java多线程    已有Java开发基础,想要快速掌握Java多线程    补充Java多线程知识,为进入一线大厂做准备学习方式:随到随学课程内容:第一节课:系统理解Java并发编程的知识体系    1:为什么要掌握Java并发编程    2:整个课程的目标    3:整个课程的学习内容第二节课:线程必备基础知识    1:理解线程是什么,理解进程,图示    2:理解轻量级的含义    3:理解时序调度,线程是时序调度的基本单元,图示    4:理解调度方式:抢占式,图示    5:理解我们写的程序基本都是多线程的应用,图示    6:理解并发和并行,图示    7:为什么需要线程第三节课:线程的风险    1:线程安全性问题,图示    2:线程的活跃度问题:死锁、饥饿、活锁,图示    3:线程的性能问题,这里主要是线程间切换 上下文的开销第四节课:创建线程的方式之一    1: 代码演示:实现Runnable接口的方式来创建线程    2:学习Thread类的方法和属性的应用    3:学习Thread类的源码第五节课:创建线程的方式之二    1:继承Thread的方式来创建线程    2:继续学习Thread类的源码,分析线程初始化过程    3: 代码演示:演示ThreadGroup    4: 代码演示:演示daemon线程,理解daemon线程和主线程的关系第六节课:创建线程的方式之三    1: 代码演示:匿名内部类的方式来创建线程    2:继续学习Thread类的源码,分析run方法的调用过程    3:代码演示:callable的方式来创建线程,带返回值    4: 学习FutureTask的部分源码,分析run方法到call方法的调用过程第七节课:线程状态详解    1:通过Thread源码来查看线程状态的定义    2:一步一步画图,讲述状态之间的变迁第八节课:线程的基本操作sleep 和yield    1:阅读Thread源码    2:代码演示:sleep的使用    3:代码演示:yield的使用    4:sleep和yield的对比理解第九节课:线程的基本操作join和interrupt    1:阅读Thread源码    2:代码演示:join的使用    3:代码演示:interrupt的使用这里是《Java并发编程与源码分析》的第一部分——讲述多线程核心基础实现快速上手多线程的经典之作   

16,471

社区成员

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

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

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