AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

VC++环境下利用管道和线程实现进程间通信

51自学网 2015-08-30 http://www.wanshiok.com

 

三. 子 进 程Child
---- Child 启 动 之 后, 立 刻 创 建 一 个 新 的 线 程, 并 在 新 线 程 中 执 行 读 管 道 操 作, 利 用 读 得 的 参 数 使 主 窗 口 绘 出 形 状。 读 管 道 函 数 为:

BOOL ReadFile(
  HANDLE hFile, //读入文件句柄
  LPVOID lpBuffer, //读入数据缓冲区地址
  DWORD nNumberOfBytesToRead, //要读入字节数量
  LPDWORD lpNumberOfBytesRead, //已读入字节数地址
LPOVERLAPPED lpOverlapped ); //异步I/O结构指针

---- 首 先 从MFC 类 库 创 建 新 线 程, 使 用ClassWizard 工 具: 选 择AddClassNew, 输 入 类 名CThr, 在 基 类 列 表 框 中 选 择"CWinThread", 按 下Create 按 钮, 生 成 线 程 类CThr。 然 后 修 改 程 序 代 码, 下 面 给 出 部 分 源 程 序:

 ///////////////////Thr.h线程类头文件
class CThr : public CWinThread
{//operations
public:
LONG PipeThread();
void DoRead(void);
HANDLE hpipeRead;
HANDLE hThread;
DWORD dwThreadID;
int iShape;
BOOL bTerminate;
};
 ////////////Thr.cpp线程类实现文件
#include
CThr::CThr()
{HWND hwnd=GetActiveWindow();
//检索管道句柄
hpipeRead=GetStdHandle(STD_INPUT_HANDLE);
if(hpipeRead==INVALID_HANDLE_VALUE)
  ::MessageBox(hwnd,"Invalid Handle!",NULL,MB_OK);
}
BOOL CThr::InitInstance()
{ bTerminate=FALSE;
 //设置线程优先权
SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
ResumeThread();
PipeThread();
return TRUE;
}
LONG CThr::PipeThread()
{ while(!bTerminate){ DoRead(); }
return 0L;
}
void CThr::DoRead(void)
{ FIGURE Figure;
DWORD dwRead;
BOOL bTest;
 //读管道
bTest=ReadFile(hpipeRead,&Figure,
sizeof(Figure),&dwRead,NULL);
if(bTest){
if(Figure.iShape==ID_TERMINATE) bTerminate=TRUE;
else{ iShape=Figure.iShape;
HWND hwndMain=GetActiveWindow();
InvalidateRect(hwndMain,NULL,TRUE);
UpdateWindow(hwndMain); //更新窗口
}
}
else{ bTerminate=TRUE; }
return;
}
//////////////Childview.cpp视类实现文件
#include"global.h"
#include"thr.h"
CThr* m_pThr; //定义新线程对象
……
CChildView::CChildView()
{ m_pThr=new CThr; } //产生新线程对象
CChildView::~CChildView()
{ delete m_pThr; } //删除线程
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{ m_pThr- >CreateThread();
 return CView::PreCreateWindow(cs);
}
void CChildView::OnDraw(CDC* pDC)
{……
//根据所读参数绘图
Cbrush brush(RGB(0,0,0));
pDC- >SelectObject(&brush);
if(m_pThr- >iShape==ID_RECT) pDC- >Rectangle(12,45,200,178);
if(m_pThr- >iShape==ID_ELLIPSE) pDC- >Ellipse(12,45,200,178);
}

四. 结 论
---- 运 行 以 上 例 程, 在 父 进 程Parent 窗 口 中 按 一 下 鼠 标 左 键, 就 会 产 生 一 个Pipe 并 启 动 子 进 程Child, 在Parent 中 选 中 菜 单 项Rect 或Ellipse 时,Child 窗 口 中 就 会 分 别 绘 出 矩 形 和 椭 圆, 选 中Terminate 时, 就 会 中 断 通 信。 以 上 介 绍 的 是 匿 名 管 道, 若 要 增 加 通 信 的 灵 活 性 还 可 采 用 命 名 管 道NamedPipe。

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:一段使窗口透明的代码(仅适用于2000)  下一篇:在ATL Browser Helper对象中使用WTL TreeView(英文)