现在的位置: 首页 > 综合 > 正文

深入浅出Win32多线程程序设计之综合实例-5

2013年12月01日 ⁄ 综合 ⁄ 共 1681字 ⁄ 字号 评论关闭
3.3.5控制接口

应用程序员使用下列一组public函数可以获取串口的DCB及串口上发生的事件:

//
// Return the device control block
//
DCB CSerialPort::GetDCB()
{
return m_dcb;
}

//
// Return the communication event masks
//
DWORD CSerialPort::GetCommEvents()
{
return m_dwCommEvents;
}

3.3.6错误处理

//
// If there is a error, give the right message
//
void CSerialPort::ProcessErrorMessage(char *ErrorText)
{
char *Temp = new char[200];

LPVOID lpMsgBuf;

FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
// Default language
(LPTSTR) &lpMsgBuf, 0, NULL);

sprintf(Temp,
"WARNING: %s Failed with the following error: /n%s/nPort: %d/n", (char*)
ErrorText, lpMsgBuf, m_nPortNr);
MessageBox(NULL, Temp, "Application Error", MB_ICONSTOP);

LocalFree(lpMsgBuf);
delete []Temp;
}

仔细分析Remon Spekreijse的CSerialPort类对我们理解多线程及其同步机制是大有益处的,从http: //codeguru.earthweb.com/network/serialport.shtml我们可以获取CSerialPort类的介绍与工程 实例。另外,电子工业出版社《Visual C++/Turbo C串口通信编程实践》一书的作者龚建伟也编写了一个使用CSerialPort类的例子,可以从http: //www.gjwtech.com/scomm/sc2serialportclass.htm获得详情。

4.多线程网络通信

在网络通信中使用多线程主要有两种途径,即主监控线程和线程池。

4.1主监控线程

这种方式指的是程序中使用一个主线程监控某特定端口,一旦在这个端口上发生连接请求,则主监控线程动态使用CreateThread派生出新的子线程处理该请求。主线程在派生子线程后不再对子线程加以控制和调度,而由子线程独自和客户方发生连接并处理异常。

使用这种方法的优点是:

(1)可以较快地实现原型设计,尤其在用户数目较少、连接保持时间较长时有表现较好;

(2)主线程不与子线程发生通信,在一定程度上减少了系统资源的消耗。

其缺点是:

(1)生成和终止子线程的开销比较大;

(2)对远端用户的控制较弱。

这种多线程方式总的特点是"动态生成,静态调度"。

4.2线程池

这种方式指的是主线程在初始化时静态地生成一定数量的悬挂子线程,放置于线程池中。随后,主线程将对这些悬挂子线程进行动态调度。一旦客户发出连接请求,主线程将从线程池中查找一个悬挂的子线程:

(1)如果找到,主线程将该连接分配给这个被发现的子线程。子线程从主线程处接管该连接,并与用户通信。当连接结束时,该子线程将自动悬挂,并进人线程池等待再次被调度;

(2)如果当前已没有可用的子线程,主线程将通告发起连接的客户。

使用这种方法进行设计的优点是:

(1)主线程可以更好地对派生的子线程进行控制和调度;

(2)对远程用户的监控和管理能力较强。

虽然主线程对子线程的调度要消耗一定的资源,但是与主监控线程方式中派生和终止线程所要耗费的资源相比,要少很多。因此,使用该种方法设计和实现的系统在客户端连接和终止变更频繁时有上佳表现。

这种多线程方式总的特点是"静态生成,动态调度"。

抱歉!评论已关闭.