设为首页 加入收藏

TOP

第三章--Win32程序的执行单元(部分概念及代码讲解)(上 -- 多线程)(二)
2017-10-12 10:11:57 】 浏览:4170
Tags:第三章 --Win32 程序 执行 单元 部分 念及 代码 讲解 线程
示:PriorityDemo.)

 

20.  实际编程中改变线程优先级的常用方法:创建一个线程的时候,将CREATE_SUSPENDED标记传给了CreateThread函数,这可以使得新线程处于暂停状态。在将它的优先级设为需要的优先级。再调用ResumeThread函数恢复线程的运行。

 

21.  WaitForMultipleObjects函数用于等待多个内核对象。(在实例PriorityDemo中最后有所展示。)

 

22.  Windows Explorer进程中的线程就是在高优先级下运行的。(请不要联想到IE浏览器。这里的Explorer是指Windows程序管理器或者文件资源管理器,可以说是图形界面的核心。别问我为什么知道这么清楚,因为我关闭过这个进程。)

 

23.  在实际开发中,一般不直接使用Windows系统提供的CreateThread函数创建线程,而是使用C/C++运行期函数_beginthreadex。(注:VC默认的C/C++运行期库并不支持_beginthreadex函数。囧。)相应地,C/C++运行期库同样提供了另一个用于结束当前线程运行的函数--_endthreadex函数,用于取代ExitThread函数。

 

 

代码解释:

1.ThreadDemo

  PS:主线程首先创建了一个辅助线程,打印出辅助线程的ID号,然后等待辅助线程运行结束;辅助线程仅打印出几行字符串,仅模拟真正的工作。

 

 1 #include <stdio.h>
 2 #include <windows.h>
 3 
 4 // 线程函数
 5 DWORD WINAPI ThreadProc(LPVOID lpParam)  6 {  7     int i = 0;  8     while(i < 20)  9  { 10         printf(" I am from a thread, count = %d \n", i++); 11  } 12     return 0; 13 } 14 
15 int  main(int argc, char* argv[]) 16 { 17  HANDLE hThread; 18  DWORD dwThreadId; 19     
20     // 创建一个线程
21     hThread = ::CreateThread ( 22         NULL,        // 默认安全属性
23         NULL,        // 默认堆栈大小
24         ThreadProc,    // 线程入口地址(执行线程的函数)
25         NULL,        // 传给函数的参数
26         0,        // 指定线程立即运行
27         &dwThreadId);    // 返回线程的ID号
28     printf(" Now another thread has been created. ID = %d \n", dwThreadId); 29 
30     // 等待新线程运行结束
31  ::WaitForSingleObject (hThread, INFINITE); 32  ::CloseHandle (hThread); 33     return 0; 34 }

 

 

2.PriorityDemo

  PS:下列程序同时创建了两个线程,一个线程的优先级是“空闲”,运行的时候不断打印出"Idle Thread is running"字符串;另一个线程的优先级是“正常”,运行的时候不断打印出“Normal Thread is running”字符创。

 1 #include <stdio.h>
 2 #include <windows.h>
 3 
 4 DWORD WINAPI ThreadIdle(LPVOID lpParam)  5 {  6     int i = 0;  7     while(i++<10)  8         printf("Idle Thread is running \n");  9 
10     return 0; 11 } 12 
13 DWORD WINAPI ThreadNormal(LPVOID lpParam) 14 { 15     int i = 0; 16     while(i++<10) 17         printf(" Normal Thread is running \n"); 18 
19     return 0; 20 } 21 int main(int argc, char* argv[]) 22 { 23  DWORD dwThreadID; 24     HANDLE h[2]; 25     
26     // 创建一个优先级为Idle的线程
27     h[0] = ::CreateThread(NULL, 0, ThreadIdle, NULL, 28         CREATE_SUSPENDED, &dwThreadID); 29     ::SetThreadPriority(h[0], THREAD_PRIORITY_IDLE); 30     ::ResumeThread(h[0]); 31 
32     // 创建一个优先级为Normal的线程
33     h[1] = ::CreateThread(NULL, 0, ThreadNormal, NULL, 34         0, &dwThreadID); 35     
36     // 等待两个线程内核对象都变成受信状态
37  ::WaitForMultipleObjects( 38         2,        // DWORD nCount 要等待的内核对象的数量
39         h,        // CONST HANDLE *lpHandles 句柄数组
40         TRUE,        // BOOL bWaitAll 指定是否等待所有内核对象变成受信状态
41         INFINITE);  // DWORD dwMilliseconds 要等待的时间
42        
43     ::CloseHandle(h[0]); 44     ::CloseHandle(h[1]); 45 
46     return 0; 47 } 48 
49 /*
50  HANDLE h[2]; 51  h[0] = hThread1; 52  h[1] = hThread2; 53  DWORD dw = ::WaitForMultipleObjects(2, h, FALSE, 5000); 54  switch(dw) 55  { 56  case WAIT_FAILED: 57  // 调用WaitForMultipleObjects函数失败(句柄无效?) 58  break; 59  case WAIT_TIMEOUT: 60  // 在5秒内没有一个内核对象受信 61  break; 62  case WAIT_OBJECT_0 + 0: 63  // 句柄h[0]对应的内核对象受信 64  break; 65  case WAIT_OBJECT_0 + 1: 66  // 句柄h[1]对应的内核对象受信 67  break; 68  } 69 */

 

 

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇中国大学MOOC-陈越、何钦铭-数据.. 下一篇C语言-预估校正法求常微分方程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目