三. 子 进 程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不保证资料的完整性。
2/2 首页 上一页 1 2 |