多线程与异步套接字的编程笔记
2015-10-18 16:06
465 查看
1、什么是多线程?
在Windows操作系统中,线程是指系统中最小的功能执行单元,可以独立完成某一项功能,如果用多线程处理某个功能,会比单线程效率高很多
使用线程的好处有以下几点:
·1)使用线程可以把占据长时间的程序中的任务放到后台去处理
·2)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
2、创建线程
Win32 提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将选取其中的一些重要函数进行说明。
1、HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,其中各参数说明如下:
lpThreadAttributes:指向一个 SECURITY_ATTRIBUTES 结构的指针,该结构决定了线程的安全属性,一般置为 NULL;
dwStackSize:指定了线程的堆栈深度,一般都设置为0;
lpStartAddress:表示新线程开始执行时代码所在函数的地址,即线程的起始地址。一般情况为(LPTHREAD_START_ROUTINE)ThreadFunc,
ThreadFunc
是线程函数名;
lpParameter:指定了线程执行时传送给线程的32位参数,即线程函数的参数;
dwCreationFlags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为
CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数ResumeThread被调用;
lpThreadId:该参数返回所创建线程的ID;
如果创建成功则返回线程的句柄,否则返回NULL。
3、
创建一个基于控制台程序窗口的工程(就是大学学C语言的工程)
源码如下:
结果如下:
在Windows操作系统中,线程是指系统中最小的功能执行单元,可以独立完成某一项功能,如果用多线程处理某个功能,会比单线程效率高很多
使用线程的好处有以下几点:
·1)使用线程可以把占据长时间的程序中的任务放到后台去处理
·2)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
2、创建线程
Win32 提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将选取其中的一些重要函数进行说明。
1、HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,其中各参数说明如下:
lpThreadAttributes:指向一个 SECURITY_ATTRIBUTES 结构的指针,该结构决定了线程的安全属性,一般置为 NULL;
dwStackSize:指定了线程的堆栈深度,一般都设置为0;
lpStartAddress:表示新线程开始执行时代码所在函数的地址,即线程的起始地址。一般情况为(LPTHREAD_START_ROUTINE)ThreadFunc,
ThreadFunc
是线程函数名;
lpParameter:指定了线程执行时传送给线程的32位参数,即线程函数的参数;
dwCreationFlags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为
CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数ResumeThread被调用;
lpThreadId:该参数返回所创建线程的ID;
如果创建成功则返回线程的句柄,否则返回NULL。
3、
创建一个基于控制台程序窗口的工程(就是大学学C语言的工程)
源码如下:
#include <windows.h> //包含相应头文件 #include <stdio.h> DWORD WINAPI myfun1( //声明线程函数 LPVOID lpParameter ); DWORD WINAPI myfun2( LPVOID lpParameter ); int main() //主函数 { HANDLE h1,h2; //定义句柄变量 h1=::CreateThread(NULL,0,myfun1,NULL,0,NULL); //创建线程1 printf("线程1开始运行!\r\n"); //输出线程1运行信息 h2=::CreateThread(NULL,0,myfun2,NULL,0,NULL); //创建线程2 printf("线程2开始运行!\r\n"); //输出线程2运行信息 ::CloseHandle(h1); //关闭线程句柄对象 ::CloseHandle(h2); if(getchar()=='q') //如果用户输入字符"q" { return 0; //程序正常退出 } else //如果用户输入的字符不是"q" { ::Sleep(100); //程序睡眠 } } DWORD WINAPI myfun1(LPVOID lpParameter) //分别实现线程函数 { printf("线程1正在运行!\r\n"); //输出信息 return 0; //正常结束线程函数 } DWORD WINAPI myfun2(LPVOID lpParameter) { printf("线程2正在运行!\r\n"); return 0; }
结果如下:
相关文章推荐
- 手把手教你最简单的开源项目托管GitHub入门教程
- java——递归调用
- 从校园到工作的路(三)——那些java中的常见异常与错误
- Matlab中曾经用过的一些函数
- No.1 定时器接口timer的设计
- java.util.Properties类 学习笔记2
- DELPHI RTTI实现非可视的功能插件
- Java IO4:字符编码
- java中重载与重写的区别
- java.util.Properties类 学习笔记1
- java实现内部类
- Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解
- PHP中array_chunk的用法
- 在windows上安装php扩展
- 第二章 构造函数语意学 成员们的初始化队伍
- 【转载】:【C++跨平台系列】解决STL的max()与numeric_limits::max()和VC6 min/max 宏冲突问题
- PHP PDO prepare()、execute()和bindParam()方法详解
- 剑指offer第二十题【包含min函数的栈】c++实现
- 关于Eclipse 和 IDEA 导入library库文件 的步骤
- Eclipse build launcher 3具体步骤