大家好,小城来为大家解答以上问题。vc运行库官方下载,vc多线程很多人还不知道,现在让我们一起来看看吧!
1、如果函数执行成功,则返回非零值,否则返回零。3、BOOL ce vent:reset event();
2、该函数将事件的状态设置为无信号状态,并一直保持到调用SetEvent()为止。由于自动事件由系统自动重置,因此不需要自动事件。
3、来调用这个函数。如果函数执行成功,则返回非零值,否则返回零。我们通常通过调用WaitForSingleObject函数来监控事件状态。我们已经
4、该功能介绍。因为语言描述,CEvent
5、上课真的很难理解,但是仔细回想下面的套路,多看几遍就能理解了。
6、Routine 9 Multithreading 9
7、建立一个基于对话框的项目MultiThread9,在对话框IDD_MULTITHREAD9_DIALOG中添加一个按钮和两个编辑框控件。按钮的ID是IDC_WRITEW,标记为。
8、题为“写‘w’”;两个编辑框的id分别为IDC_W和IDC_D,属性均选择只读;
9、Declare two thread functions in multithreaded 9Dlg.h file: uintwritew (lpvoid pparam);
10、UINT WriteD(LPVOID pParam);
11、Use the category wizard to add the Seder class variables m_ctrlW and m _ ctrlD to IDC_W and IDC_D respectively.
12、将以下内容添加到MultiThread9Dlg.cpp文件中:
13、为了在文件中正确使用同步类,请在文件开头添加
14、#include 'afxmt.h'
15、定义事件对象和字符数组,它们被定义为全局变量,以便在不同的线程之间使用。CEvent eventWriteD
16、char g_Array[10];
17、添加线程函数:UINT WriteW(LPVOID pParam)
18、{
19、CEdit *pEdit=(CEdit*)pParam;
20、pEdit-SetWindowText('');
21、for(int i=0;i10;i++)
22、{
23、g_Array[i]=''W'';
24、pEdit-SetWindowText(g_Array);
25、Sleep(1000);
26、}
27、eventWriteD.SetEvent();
28、return 0;
29、}
30、UINT WriteD(LPVOID pParam)
31、{
32、CEdit *pEdit=(CEdit*)pParam;
33、pEdit-SetWindowText('');
34、WaitForSingleObject(eventWriteD.m_hObject,INFINITE);
35、for(int i=0;i10;i++)
36、{
37、g_Array[i]=''D'';
38、pEdit-SetWindowText(g_Array);
39、Sleep(1000);
40、}
41、return 0;
42、}
43、仔细分析这两个线程函数,你就会正确理解CEvent类。线程将执行写入
44、WaitForSingleObject(event writed . m _ ho object,INFINITE);等到事件Eventwritten发出信号,线程将向下执行,因为Eventwritten对象
45、是一个自动事件,那么当WaitForSingleObject()返回时,系统会自动将eventWriteD对象重置为无信号状态。
46、双击按钮IDC_WRITEW,添加其响应函数:void CMultiThread9Dlg:OnWritew()
47、{
48、CWinThread *pWriteW=AfxBeginThread(WriteW,
49、m_ctrlW,
50、THREAD_PRIORITY_NORMAL,
51、0,
52、CREATE_SUSPENDED);
53、pWriteW-ResumeThread();
54、CWinThread *pWriteD=AfxBeginThread(WriteD,
55、m_ctrlD,
56、THREAD_PRIORITY_NORMAL,
57、0,
58、CREATE_SUSPENDED);
59、pWriteD-ResumeThread();
60、}
61、编译运行程序,点击“写‘w’”按钮,体验事件对象的功能。
62、C.使用CMutex类
63、互斥对象非常类似于临界区对象。互斥对象和临界区对象的区别在于互斥对象可以在进程之间使用,而临界区对象只能在同一个进程的线程之间使用。当然,互斥体也可以在同一个进程的线程之间使用,但是在这种情况下,使用临界区会节省系统资源,效率更高。
64、d、使用CSemaphore类
65、当需要计数器来限制可以使用的线程数量时,可以使用“信号量”对象。CSemaphore
66、类的对象保存当前访问指定资源的线程的计数值,即当前仍能使用该资源的线程数。如果此计数达到零,则所有
67、对这个CSemaphore
68、访问由类对象控制的资源的尝试被放入队列中等待,直到超时或计数值不为零。当一个线程被释放并且访问了一个受保护的资源时,它被计数
69、数值减1;一个线程完成了对被控共享资源的访问时,计数值增1。这个被CSemaphore
70、类对象所控制的资源可以同时接受访问的最大线程数在该对象的构建函数中指定。
71、CSemaphore 类的构造函数原型及参数说明如下:
72、CSemaphore (LONG lInitialCount=1,
73、LONG lMaxCount=1,
74、LPCTSTR pstrName=NULL,
75、LPSECURITY_ATTRIBUTES lpsaAttributes=NULL);
76、lInitialCount:信号量对象的初始计数值,即可访问线程数目的初始值;
77、lMaxCount:信号量对象计数值的最大值,该参数决定了同一时刻可访问由信号量保护的资源的线程最大数目;
78、后两个参数在同一进程中使用一般为NULL,不作过多讨论;
79、在用CSemaphore
80、类的构造函数创建信号量对象时要同时指出允许的最大资源计数和当前可用资源计数。一般是将当前可用资源计数设置为最大资源计数,每增
81、加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减
82、小到0时,则说明当前占用资源的线程数已经达到了所允许的最大数目,不能再允许其它线程的进入,此时的信号量信号将无法发出。线程在处
83、理完共享资源后,应在离开的同时通过ReleaseSemaphore()函数将当前可用资源数加1。
84、下面给出一个简单实例来说明CSemaphore 类的用法。
85、例程10 MultiThread10
86、建立一个基于对话框的工程MultiThread10,在对话框IDD_MULTITHREAD10_DIALOG中加入一个按钮和三个编辑框控件,按钮的ID为IDC_START,
87、标题为“同时写‘A’、‘B’、‘C’”;三个编辑框的ID分别为IDC_A、IDC_B和IDC_C,属性都选中Read-only;
88、在MultiThread10Dlg.h文件中声明两个线程函数: UINT WriteA(LPVOID pParam);
89、UINT WriteB(LPVOID pParam);
90、UINT WriteC(LPVOID pParam);
91、使用ClassWizard分别给IDC_A、IDC_B和IDC_C添加CEdit类变量m_ctrlA、m_ctrlB和m_ctrlC;
92、在MultiThread10Dlg.cpp文件中添加如下内容:
93、为了文件中能够正确使用同步类,在文件开头添加:
94、#include 'afxmt.h'
95、定义信号量对象和一个字符数组,为了能够在不同线程间使用,定义为全局变量:CSemaphore semaphoreWrite(2,2);
96、//资源最多访问线程2个,当前可访问线程数2个
97、char g_Array[10];
98、添加三个线程函数:
99、UINT WriteA(LPVOID pParam)
100、{
101、CEdit *pEdit=(CEdit*)pParam;
102、pEdit-SetWindowText('');
103、WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
104、CString str;
105、for(int i=0;i10;i++)
106、{
107、pEdit-GetWindowText(str);
108、g_Array[i]=''A'';
109、str=str+g_Array[i];
110、pEdit-SetWindowText(str);
111、Sleep(1000);
112、}
113、ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
114、return 0;
115、}
116、UINT WriteB(LPVOID pParam)
117、{
118、CEdit *pEdit=(CEdit*)pParam;
119、pEdit-SetWindowText('');
120、WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
121、CString str;
122、for(int i=0;i10;i++)
123、{
124、pEdit-GetWindowText(str);
125、g_Array[i]=''B'';
126、str=str+g_Array[i];
127、pEdit-SetWindowText(str);
128、Sleep(1000);
129、}
130、ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
131、return 0;
132、}
133、UINT WriteC(LPVOID pParam)
134、{
135、CEdit *pEdit=(CEdit*)pParam;
136、pEdit-SetWindowText('');
137、WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
138、for(int i=0;i10;i++)
139、{
140、g_Array[i]=''C'';
141、pEdit-SetWindowText(g_Array);
142、Sleep(1000);
143、}
144、ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
145、return 0;
146、}
147、这三个线程函数不再多说。在信号量对象有信号的状态下,线程执行到WaitForSingleObject语句处继续执行,同时可用线程数减1;若线程执
148、行到WaitForSingleObject语句时信号量对象无信号,线程就在这里等待,直到信号量对象有信号线程才往下执行。
149、双击按钮IDC_START,添加其响应函数: void CMultiThread10Dlg:OnStart()
150、{
151、CWinThread *pWriteA=AfxBeginThread(WriteA,
152、m_ctrlA,
153、THREAD_PRIORITY_NORMAL,
154、0,
155、CREATE_SUSPENDED);
156、pWriteA-ResumeThread();
157、CWinThread *pWriteB=AfxBeginThread(WriteB,
158、m_ctrlB,
159、THREAD_PRIORITY_NORMAL,
160、0,
161、CREATE_SUSPENDED);
162、pWriteB-ResumeThread();
163、CWinThread *pWriteC=AfxBeginThread(WriteC,
164、m_ctrlC,
165、THREAD_PRIORITY_NORMAL,
166、0,
167、CREATE_SUSPENDED);
168、pWriteC-ResumeThread();
169、}
170、好吧,多线程编程就介绍到这里,希望本文能对您有所帮助。
本文到此结束,希望对大家有所帮助。