父子进程通过管道通信(MFC重定向).docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
父子进程通过管道通信(MFC重定向)

今天领导心血来潮说服务器的运行界面是一个黑乎乎的控制台,太低端了,看我们能不能把它图形化,至少做成一个窗口有按钮点启动、停止。好吧,领导拍脑袋就叫人干活的事不少,也没有产品规划,也就是让他看的舒服,只能去做了。 其中有一个关键性问题,就是原先是往控制台输出的信息,使用mfc图形化之后该往哪输出,工程维护人员肯定还是希望能在图形界面上能够看到这些信息的,因此就涉及到了如何获取到输出控制台的消息(都是cout、printf这种标准输出),然后再将这些消息重写到view上。这时候想到了标准输出重定向,因此整理了下思路: 1.将标准输出重定向到管道 2.创建一个线程从管道里取出数据 3.在view的OnPaint中将数据显示出来 二、实现 1.创建管道 [cpp] view plaincopyprint? BOOL?bRet?=?CreatePipe(hRead,?hWrite,?NULL,?0);?//?创建匿名管道 ?? if?(bRet?!=?TRUE)?? ????printf(创建匿名管道失败,错误代码:%d\n,?GetLastError());?? 2.将标准输出重定向到管道的写句柄中 [cpp] view plaincopyprint? int?nOpenHandle?=?_open_osfhandle((intptr_t)hWrite,?_O_TEXT);?? FILE*?fp?=?_fdopen(?nOpenHandle,?w);?? *stdout?=?*fp;?? 注意:这里不能使用SetStdHandle(STD_OUTPUT_HANDLE, hWrite),在MFC中SetStdHandle是没有效果的。 3.创建线程从管道取数据 [cpp] view plaincopyprint? boost::thread?thr(boost::bind(CKDSShellView::print_cb,?this));?? 这里用到boost的thread创建线程,CKDSShellView就是你自己的view了,print_cb是自定义的线程函数。 [cpp] view plaincopyprint? void?CKDSShellView::print_cb()?? {?? ????DWORD?ReadNum?=?0;?? ????char?ReadBuf[1024]?=?{0};?? ????while?(1)?? ????{?? ????????memset(ReadBuf,?0,?1024);?? ????????ReadFile(hRead,?ReadBuf,?1024,?ReadNum,?NULL);?? ?? ????????if?(ReadNum?==?0?||?ReadBuf[0]?==?0)?? ????????{?? ????????????continue;?? ????????}?? ????????this-AppendLog(ReadBuf);?? ????}?? }?? void CKDSShellView::print_cb() { DWORD ReadNum = 0; char ReadBuf[1024] = {0}; while (1) { memset(ReadBuf, 0, 1024); ReadFile(hRead, ReadBuf, 1024, ReadNum, NULL); if (ReadNum == 0 || ReadBuf[0] == 0) { continue; } this-AppendLog(ReadBuf); } } 死循环,通过ReadFile函数从管道的读句柄hRead中取出数据,然后AppendLog到一个vector容器中。 [cpp] view plaincopyprint? void?CKDSShellView::AppendLog(const?std::string?strLog)?? {?? ????if?(log_vector.size()??1024)?? ????{?? ????????log_vector.erase(log_vector.begin());?? ????}?? ?? ????std::vectorstd::string?tmp;?? ????boost::split(tmp,?strLog,?boost::is_any_of(\n));?? ?? ????for?(int?i?=?0;?i??tmp.size();?++i)?? ????{?? ????????boost::trim(tmp[i]);?? ????????if?(!tmp[i].empty(

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档