Windows CE多线程编程包括线程的启动、线程的运行状态控制、线程同步及数据通信和线程的正常/非正常退出。本项目的软件及架构在多线程设计上,要求通过多线程实现异步的数据采集及绘制,以提高系统运行效率。
1.
线程的启动
Win32API提供支持多线程的启动,调用API函数CreateThread()分配资源启动线程,并返回线程句柄(Handle),以控制线程状态。客观上,这种方法在Win32平台上是通用的。然而,通用不一定最好。函数原型:<winbase.h>
HANDLE
WINAPI
CreateThread (
LPSECURITY_ATTRIBUTES lpsa, // security属性,在WinCE下须为NULL
DWORD cbStack, // 堆栈大小,除非定义宏,否则被忽略
LPTHREAD_START_ROUTINE lpStartAddr, // 起始地址,即C的函数指针
LPVOID lpvThreadParam, // 自定义的传入线程参数
DWORD fdwCreate, // 标识线程是否立即运行,默认是
LPDWORD lpIDThread // 新线程ID
);
WINAPI
CreateThread (
LPSECURITY_ATTRIBUTES lpsa, // security属性,在WinCE下须为NULL
DWORD cbStack, // 堆栈大小,除非定义宏,否则被忽略
LPTHREAD_START_ROUTINE lpStartAddr, // 起始地址,即C的函数指针
LPVOID lpvThreadParam, // 自定义的传入线程参数
DWORD fdwCreate, // 标识线程是否立即运行,默认是
LPDWORD lpIDThread // 新线程ID
);
线程自身应用return结束,也可使用ExitThread()结束;主线程可以使用WaitForSingleObject(hThreadHandle, dwMilliseconds)等待线程结束,然后使用GetExitCode()获得返回码,最后使用CloseHandle()释放核心对象
Window C Runtime Library提供了封装CreateThread的函数_beginthreadex(),使得CRT对线程可以进行登记。函数原型一般在<process.h>中,但Windows SDK4.2没有对此函数的定义。
MFC是在eVC下提供的类库,基本上以MFC程序框架下封装了大多API系统调用,优点不仅仅是使用方便,更重要的是对系统的运行稳定性、正确性都提供的更高的保障。通过查阅得知,通过MFC提供的封装API函数AfxCreateThread()创建新线程,返回MFC的CWinThread类对象实例,这样通过对象实例可以更方便安全的进行线程的行为控制。函数原型为:<afxwin.h>
CWinThread
*
AFXAPI AfxBeginThread(
//
创建工作者线程重载方法
AFX_THREADPROC pfnThreadProc, // 线程起始函数
LPVOID pParam, // 自定义参数
int nPriority = THREAD_PRIORITY_NORMAL, // 优先级
UINT nStackSize = 0 , // 栈大小
DWORD dwCreateFlags = 0 , // 标识线程是否立即运行,默认是
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL // 安全属性
);
CWinThread * AFXAPI AfxBeginThread( // 创建UI线程
AFX_THREADPROC pfnThreadProc, // 线程起始函数
LPVOID pParam, // 自定义参数
int nPriority = THREAD_PRIORITY_NORMAL, // 优先级
UINT nStackSize = 0 , // 栈大小
DWORD dwCreateFlags = 0 , // 标识线程是否立即运行,默认是
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL // 安全属性
);
CWinThread * AFXAPI AfxBeginThread( // 创建UI线程