下面举例说明在Win32 基础上进行多线程编程的过程。
1.使用函数说明
Win32函数库里提供了多线程控制的操作函数,包括创建线程、终止线程、建立互斥区等。首先,在应用程序的主线程或者其它活动线程的适当的地方创建新的线程,创建线程的函数如下:
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );
参数lpThreadAttributes 指定了线程的安全属性,在Windows 95中被忽略;
参数dwStackSize 指定了线程的堆栈深度;
参数lpStartAddress 指定了线程的起始地址,一般情况为下面原型的函数
DWORD WINAPI ThreadFunc( LPVOID );
参数 lpParameter指定了线程执行时传送给线程的32位参数,即上面函数的参数;
参数dwCreationFlags指定了线程创建的特性;
参数 lpThreadId 指向一个DWORD变量,可返回线程ID值。
如果创建成功则返回线程的句柄,否则返回NULL。
创建了新的线程后,线程开始启动执行,如果在dwCreationFlags中用了CREATE_SUSPENDED特性,那么线程并不马上执行,而是先挂起,等到调用ResumeThread后才开始启动线程,在这过程中可以调用函数
BOOL SetThreadPriority( HANDLE hThread, int nPriority);
设置线程的优先权。
当线程的函数返回后,线程自动终止,如果要想在线程的执行过程中终止的话,可以调用函数
VOID ExitThread( DWORD dwExitCode);
如果在线程的外面终止线程的话,可以用下面的函数
BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode );
但注意,该函数可能会引起系统不稳定,而且,线程所占用的资源也不释放,因此,一般情况下,建议不要使用该函数。
如果要终止的线程是进程内的最后一个线程的话,在线程被终止后,相应的进程也终止。
2. 无优先级例程,该例程实现在对话框上通过一线程实现时钟的显示和停止。步骤如下:
第一步:建立一基于对话框的工程MultiProcess1。
第二步:在对话框上建立两个按钮和一个编辑框,ID号分别为ID_START、ID_STOP和IDC_TIME,Caption分别为"启动"、"停止"。如下: 第三步:在MultiProcess1Dlg.cpp中定义全局函数ThreadProc(),格式如下:
void ThreadProc() { CTime time; CString m_time; for(;;) { time=CTime::GetCurrentTime(); m_time=time.Format("%H:%M:%S"); ::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_TIME,m_time); Sleep(1000); } }
|
第四步:在头文件MultiProcess1Dlg.h中定义变量如下:
DWORD ThreadID;
HANDLE hThread;
第五步:双击"开始"按钮,生成消息映射函数OnStart(),编写其中的代码如下:
void CMultiProcess1Dlg::OnStart() { // TODO: Add your control notification handler code here hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc, NULL,0,&ThreadID); }
|
此时即刻实现在对话框上点击"启动",启动时钟。接下来我们实现如何让时钟停下来。
第六步:双击"停止"按钮,添加停止的消息映射函数OnStop(),编写代码如下:
void CMultiProcess1Dlg::OnStop() { // TODO: Add your control notification handler code here TerminateThread(hThread,1); }
|
注意:该函数可能会引起系统不稳定,而且,线程所占用的资源也不释放,因此,一般情况下,建议不要使用该函数。
到现在,这个程序就完整了,看一下效果吧!
最后需要说明的是,并不是设计多线程就是一个好的程序。目前大多数的计算机都是单处理器(CPU)的,在这种机器上运行多线程程序,有时反而会降低系统性能,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,但对于大部分时间被阻塞的线程(例如等待文件 I/O 操作),可以用一个单独的线程来完成,这样可把CPU时间让出来,使程序获得更好的性能。因此,在设计多线程应用时,需要慎重选择,具体情况具体处理,以使应用程序获得最佳的性能。
 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |