免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5208 | 回复: 11
打印 上一主题 下一主题

[C++] MFC中从创建的进程中调用外部程序出现的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-10 17:32 |只看该作者 |倒序浏览
13可用积分
最近在做一个备份工具

由于之前没有使用多线程,所以导致备份过程,界面假死现象。

现在修改出现一个问题,如下,在按钮响应函数中通过AfxBeginThread()创建线程

void CDlg::OnButton3()
{
        // TODO: Add your control notification handler code here
       
        CWinThread* pThread;
        pThread=AfxBeginThread(ThreadFunc,NULL);//&m_progress);

        CPlayGif aa;
        aa.DoModal();   //显示GIF图片

        WaitForSingleObject(pThread, INFINITE);
//本打算在此处后添加备份结束的操作,但发现此语句不起作用,就是说压缩还未结束,就开始弹出消息框asd
//该如何解决这个问题?如果解决了,我想在此处发送消息,把上面显示gif图片的对话框关闭,该怎么整,先谢谢了
        AfxMessageBox("asd");
}

UINT ThreadFunc(LPVOID lpParam)
{

        CPack m_pack;
        m_pack.cpack();

        return 0;
}

void CPack::cpack()
{
        ……
        CreateProcess(NULL, ss, NULL, NULL, false, 0, NULL, NULL, &si, &pi);//在此调用外部程序7-zip压缩
        ……
}

很抱歉,我只有13个积分,希望不嫌弃

[ 本帖最后由 hikaruxx 于 2009-6-10 17:59 编辑 ]

最佳答案

查看完整内容

WaitForSingleObject的参数列表不是:WaitForSingleObject(HANDLE, DWORD); 吗?MFC中有这样的重载?WaitForSingleObject(CWinThread*, DWORD); ?如果没有这样的重载(但是上面的代码又是怎么编译通过的呢……), 可以考虑用:WaitForSingleObject(pThread->m_hThread, ... );

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2009-06-10 17:32 |只看该作者

回复 #1 hikaruxx 的帖子

WaitForSingleObject的参数列表不是:
WaitForSingleObject(HANDLE, DWORD); 吗?

MFC中有这样的重载?
WaitForSingleObject(CWinThread*, DWORD); ?

如果没有这样的重载(但是上面的代码又是怎么编译通过的呢……), 可以考虑用:
WaitForSingleObject(pThread->m_hThread, ... );

论坛徽章:
0
3 [报告]
发表于 2009-06-10 17:38 |只看该作者
不懂VC
提醒一下, 那个,lz,你好像发错地方了,这地方搞VC的不是很多啊,建议去windows专版

论坛徽章:
0
4 [报告]
发表于 2009-06-10 17:59 |只看该作者
可以用SendMessage发WM_CLOSE消息给要关闭的对话框。另外不是很清楚你的逻辑,线程之间可以用消息同步

论坛徽章:
0
5 [报告]
发表于 2009-06-10 18:05 |只看该作者
有时间用API重写吧,MFC太乱,思路都乱。

论坛徽章:
0
6 [报告]
发表于 2009-06-10 18:30 |只看该作者
ThreadFunc线程创建完zip进程后就继续执行到返回。所以ThreadFunc没等zip进程执行完就自行退出了。
你应该在ThreadFunc线程里面再等待zip进程结束。

论坛徽章:
0
7 [报告]
发表于 2009-06-10 18:34 |只看该作者
popen(管道)怎么样,那边程序结束关闭文件描述符,还能帮你阻塞线程省省CPU。

论坛徽章:
0
8 [报告]
发表于 2009-06-10 18:38 |只看该作者
原帖由 reiase 于 2009-6-10 18:34 发表
popen(管道)怎么样,那边程序结束关闭文件描述符,还能帮你阻塞线程省省CPU。


pp = popen("the command";
while(!feod(pp)){
fread(。。。。);

//
//程序执行完自动到这一行

论坛徽章:
0
9 [报告]
发表于 2009-06-10 19:16 |只看该作者
aa对话框退出的消息应该在ThreadFunc退出的时候发出,否则对话框一直阻塞在那里,不会执行后面的语句

论坛徽章:
0
10 [报告]
发表于 2009-06-10 19:18 |只看该作者
原帖由 gz80 于 2009-6-10 18:30 发表
ThreadFunc线程创建完zip进程后就继续执行到返回。所以ThreadFunc没等zip进程执行完就自行退出了。
你应该在ThreadFunc线程里面再等待zip进程结束。

对的,应该等那个压缩process退出后再退出线程函数,退出前发送消息,关闭对话框
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP