网络编程实用教程第7-8章_多线程编程
本章内容:
WinSock需要多线程编程的原因:
Win32操作系统下的多进程多线程机制、多线程机制在网络编程中的应用和Visual C++。
分析了 MFC 支求长度为N的数组Arry的各元素的和。
编程实现线程控制函数
(1)// 首先定义了一个结构:
struct {
int N; // 数组元素的个数。
double* Arry; // 指向一个双精度实数的数组
}myData;
// 定义了此结构类型的变量,省略了初始化的代码
myData ss;
创建工作线程的例子
(2)// 接着定义线程的控制函数。
UINT MyCalcFunc(LPVOID pParam)
{
// 如果入口参数为空指针,终止线程。
if (pPara == NULL) AfxEndThread(MY_NULL_POINTER_ERROR);
int N = pPara->N; // 数组的元素个数。
double* Arry = pPara->Arry; // 指向数组的第一个元素。
double sum=0; // 数组元素之和。
for ( int i =0; i<N; i++) sum+= Arry[i]; // 求和。
CString bb;
(“数组的和是:%d”, sum); // 格式化显示字符串。
AfxMessageBox(bb); // 显示结果。
return 0;
}
改为: pPara
创建工作线程的例子
调用AfxBeginThread()来创建并启动这个线程。
将控制函数名和结构变量的地址作为参数传递,其他的参数省略,使用默认值。
AfxBeginThread ( MyCalcFunc ,&ss );
一旦调用了此函数,线程就被创建,并开始执行线程函数。当数据的计算完成时,函数将停止运行,相应的线程也随即终止。线程拥有的堆栈和其他资源都将释放。CWinThread对象将被删除。
创建工作线程的例子
4.创建工作线程的一般模式
可以得出创建工作线程的一般模式:
定义一个结构myData用于传递数据;
工作线程控制函数的框架;
UINT MyThreadProc( LPVOID pPara )
{
if (pPara == NULL)
{ AfxEndThread(MY_NULL_POINTER_ERROR);
return 1;
}
创建工作线程的例子
……// 利用入口参数作某些工作。
return 0; // 线程成功地完成并返回。
}
在程序的另一个函数中插入以下代码。
..............
myData ss;
AfxBeginThread(MyThreadProc, ss);
创建并启动用户界面线程
用户界面线程允许用户使用更多的用户界面对象,如对话框或其他窗口。因此,要使用用户界面线程,需要做更多的工作:
创建并启动用户界面线程要经过三个步骤:
从CWinThread类派生出自己的线程类;
改造这个线程类,使它能够完成用户希望的工作
创建并启动用户界面线程。
创建并启动用户界面线程
1、从CWinThread类派生出自己的线程类
要创建一个用户界面线程,首先从CWinThread 类派生出自己的线程类,可借助ClassWizard来完成。
2、改造自己的线程类
对这个派生的线程类作以下改造工作:
,用DECLARE_DYNCREATE宏来声明这个类(使其支持动态创建);
DECLARE_DYNCREATE( class_name )
创建并启动用户界面线程
,用IMPLEMENT_DYNCREATE宏来实现这个类。调用格式是:
IMPLEMENT_DYNCREATE( class_name , base_class_name )
两个参数分别是参数是线程类名和它的基类名。
创建并启动用户界面线程
对派生类的改造:
这个线程类须重载它的基类的某些成员函数,如该类的InitInstance( )成员函数;对于其他成员函数,可以有选择地重载。
创建新的用户界面窗口类,并建立线程类与用户界面窗口类的联系。
利用类向导为新建的线程类添加控件成员变量,添加响应消息的成员函
网络编程实用教程第7-8章 多线程编程 来自淘豆网m.daumloan.com转载请标明出处.