您的位置:首页 > 移动开发

Threads and Pipes in Console Apps

2008-07-09 22:31 267 查看
原文链接:Threads and Pipes in Console Apps

控制台程序中的线程和管道
问题是:如何创建一个可能阻塞的程序,但在阻塞的时候能当数据可读的时候从stdour和stderr中接收数据。本文的目的是展示如何在控制台程序中使用多线程。

子进程程序:

int _tmain(int argc, _TCHAR* argv[])

程序创建了两个线程:一个线程处理stdout,另一个线程处理stdin,主线程从两个工作线程收集数据并显示数据,当两个工作线程都结束时,主线程就结束。现在的问题是用什么机制来实现。作者使用了进程间队列机制,I/O完成端口,

class CommandLine

父进程程序:

int _tmain(int argc, _TCHAR* argv[])

智能句柄类

用来处理句柄的生存期问题:

class SmartHandle

线程参数类:

class ThreadParms

DWORD 
NumberOfBytesTransferred

ULONG_PTR 
CompletionKey

LPOVERLAPPED 
Overlapped

Meaning

SourceFlags::StdOut


0

(LPOVERLAPPED)(CString *)


stdout
line to display

SourceFlags::StdErr


0

(LPOVERALLPED)(CString *)


stderr
line to display

0

SourceFlags::StdOut


NULL


stdout
has terminated

0

SourceFlags::StdErr


NULL


stderr
has terminated

读线程工作函数

UINT __stdcall reader(LPVOID p)

class PipeReader

小结

子进程往管道的两个写端口写数据,父进程从管道的两个读端口读数据,为了读数据,父进程创建了两个子线程,一个子线程从stdout中读数据,一个子线程从stderr中读数据,为了能异步读取数据,使用了I/O完成端口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: