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