最近回去学习了一下进程和进程间的通信,有时候很多东西久不看了也就一下子忘了==
这里面有好几个互斥对象使用线程的
1 void mListText(CString str) 2 { 3 m_list_text.AddString(str); 4 m_list_text.SendMessage(WM_VSCROLL, SB_PAGEDOWN, 0); 5 } 6 7 8 9 DWORD WINAPI Thread1(LPVOID lpParameter) 10 { 11 //GetDlgItem(IDC_STATIC_THREAD) 12 //SetDlgItemText(NULL, IDC_STATIC_THREAD, L"Thread1 is running"); 13 //CString str1 = L"Thread1 is running"; 14 //C线程Dlg test; 15 //test.m_list_text.AddString(str1); 16 //SetDlgItemText(test, IDC_STATIC_THREAD, L"Thread1 is running"); 17 //AfxMessageBox(L"Thread1 is running"); 18 CString str2 = L"Thread1 is running"; 19 m_list_text.AddString(str2); 20 //Sleep(1000); 21 //mListText(str2); 22 return 0; 23 } 24 25 DWORD WINAPI Thread2(LPVOID lpParameter) 26 { 27 //GetDlgItem(IDC_STATIC_THREAD) 28 CString str2 = L"Thread2 is running"; 29 m_list_text.AddString(str2); 30 //Sleep(1000); 31 //mListText(str2); 32 //test.m_list_text.AddString(str2); 33 //SetDlgItemText( IDC_STATIC_THREAD, L"Thread2 is running"); 34 //AfxMessageBox(L"Thread2 is running"); 35 return 0; 36 } 37 38 39 //线程,不同步的 40 void C线程Dlg::OnStatThread() 41 { 42 // TODO: 在此添加控件通知处理程序代码 43 //SetDlgItemText( IDC_STATIC_THREAD,L"Thread2 is running"); 44 HANDLE T1, T2; 45 int i = 0; 46 while (i != 5) 47 { 48 T1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL); 49 T2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL); 50 Sleep(1000); 51 i++; 52 } 53 CloseHandle(T1); 54 CloseHandle(T2); 55 } 56 57 //线程3,线程4 使用InitializeCriticalSection()来操作临界对象 58 DWORD WINAPI Thread3(LPVOID lpParameter) 59 { 60 C线程Dlg test; 61 while (true) 62 { 63 EnterCriticalSection(&Section); //进入临界区 64 a1++; 65 if (a1 <= 10) 66 { 67 Sleep(1000); 68 CString str; 69 str.Format(L"Thread3 is running,count=%d", a1); 70 //AfxMessageBox(str); 71 mListText(str); 72 LeaveCriticalSection(&Section); //离开临界区 73 } 74 else 75 { 76 LeaveCriticalSection(&Section); 77 break; 78 } 79 } 80 return 0; 81 } 82 83 //线程4 84 DWORD WINAPI Thread4(LPVOID lpParameter) 85 { 86 C线程Dlg dlg; 87 while (true) 88 { 89 EnterCriticalSection(&Section); //进入临界区 90 a1++; 91 if (a1 <=10) 92 { 93 Sleep(1000); 94 CString str; 95 str.Format(L"Thread4 is running,count=%d", a1); 96 mListText(str); 97 //AfxMessageBox(str); 98 //AfxMessageBox(L"Thread4 is running"); 99 LeaveCriticalSection(&Section); //离开临界区 100 } 101 else 102 { 103 LeaveCriticalSection(&Section); 104 break; 105 } 106 } 107 return 0; 108 } 109 110 //同步线程 111 void C线程Dlg::OnSynchronous() 112 { 113 // TODO: 在此添加控件通知处理程序代码 114 HANDLE T3, T4; 115 T3 = CreateThread(NULL, 0, Thread3, NULL, 0, NULL); 116 T4 = CreateThread(NULL, 0, Thread4, NULL, 0, NULL); 117 118 CloseHandle(T3); 119 CloseHandle(T4); 120 121 //初始化临界区 122 InitializeCriticalSection(&Section); 123 if (a1 == 10) 124 { 125 DeleteCriticalSection(&Section); //删除临界区 126 } 127 } 128 129 //线程5,线程6使用CCriticalSection操作临界区 130 DWORD WINAPI Thread5(LPVOID lpvoid) 131 { 132 m_Section.Lock(); //对临界区锁定 133 a1++; 134 CString str; 135 str.Format(L"Thread5 is running,count=%d", a1); 136 mListText(str); 137 //AfxMessageBox(str); 138 m_Section.Unlock(); //解锁,释放临界区 139 return 0; 140 } 141 142 DWORD WINAPI Thread6(LPVOID lpvoid) 143 { 144 m_Section.Lock(); //对临界区锁定 145 a1++; 146 CString str; 147 str.Format(L"Thread6 is running,count=%d", a1); 148 //AfxMessageBox(str); 149 mListText(str); 150 m_Section.Unlock(); //解锁,释放临界区 151 152 return 0; 153 } 154 155 156 157 void C线程Dlg::OnCCriticalSectionThread() 158 { 159 // TODO: 在此添加控件通知处理程序代码 160 HANDLE T5, T6; 161 T5 = CreateThread(NULL, 0, Thread5, NULL, 0, NULL); 162 T6 = CreateThread(NULL, 0, Thread6, NULL, 0, NULL); 163 CloseHandle(T5); 164 CloseHandle(T6); 165 Sleep(3000); 166 } 167 168 169 void C线程Dlg::ListText(CString str) 170 { 171 m_list_text.AddString(str); 172 m_list_text.SendMessage(WM_VSCROLL, SB_PAGEDOWN, 0); 173 } 174 175 176 177 void C线程Dlg::OnMListClear() 178 { 179 // TODO: 在此添加控件通知处理程序代码 180 181 m_list_text.DeleteString(0); 182 183 184 185 //m_list_text.DeleteTempMap(); 186 }
由于之前测试的时候m_list_text.AddString()不是一个个显示的,所以在控制台下测试了一下,如下
1 #include<windows.h> 2 #include<iostream> 3 HANDLE hevent; //设置事件对象 4 HANDLE hmutex; //第二种方法,设置互斥事件对象 5 //CEvent event; 也可以用CEvent事件来操作,步骤和HANDLE差不多 6 7 int a=0; 8 9 //用事件操作临界区步骤: 10 //创建事件对象-->初始化时设置为无信号-->设置为有信号 11 //在线程中:等待事件-->设置为无信号事件-->进行操作-->设置为有信号事件 12 DWORD WINAPI Thread7(LPVOID lpParemt) 13 { 14 while (true) 15 { 16 17 WaitForSingleObject(hevent, INFINITE); //无限等待请求事件 18 ResetEvent(hevent); //设置为无信号事件 19 Sleep(100); 20 if (a < 20) 21 { 22 a++; 23 std::cout << "Thread7 is running and count= " << a << std::endl; 24 SetEvent(hevent); 25 } 26 else 27 { 28 SetEvent(hevent); 29 break; 30 } 31 } 32 return 0; 33 } 34 DWORD WINAPI Thread8(LPVOID lpParemt) 35 { 36 while (true) 37 { 38 39 WaitForSingleObject(hevent, INFINITE); //无限等待请求事件 40 ResetEvent(hevent); //设置为无信号事件 41 Sleep(100); 42 if (a < 20) 43 { 44 a++; 45 std::cout << "Thread8 is running and count= " << a << std::endl; 46 SetEvent(hevent); 47 } 48 else 49 { 50 SetEvent(hevent); 51 break; 52 } 53 } 54 return 0; 55 } 56 57 //线程9,10 使用互斥事件使线程同步 58 DWORD WINAPI Thread9(LPVOID lpParemt) 59 { 60 while (true) 61 { 62 WaitForSingleObject(hmutex, INFINITE); //请求互斥对象 63 if (a < 20) 64 { 65 a++; 66 Sleep(100); 67 std::cout << "mutex thread9 is running and the count=" << a << std::endl; 68 ReleaseMutex(hmutex); 69 } 70 else 71 { 72 break; 73 } 74 } 75 return 0; 76 } 77 78 DWORD WINAPI Thread10(LPVOID lpParemt) 79 { 80 while (true) 81 { 82 WaitForSingleObject(hmutex, INFINITE); //请求互斥对象 83 if (a < 20) 84 { 85 a++; 86 Sleep(100); 87 std::cout << "mutex thread10 is running and the count=" << a << std::endl; 88 ReleaseMutex(hmutex); 89 } 90 else 91 { 92 break; 93 } 94 } 95 return 0; 96 } 97 98 99 int main() 100 { 101 HANDLE H1, H2; 102 hevent = CreateEvent(NULL, false, false, NULL); //无信号的自动重置事件,第二个参数设置事件自动还是手动,第三是有无信号参数 103 SetEvent(hevent); //设置为有信号事件 104 H1 = CreateThread(NULL, 0, Thread7, NULL, 0, NULL); 105 H2 = CreateThread(NULL, 0, Thread8, NULL, 0, NULL); 106 CloseHandle(H1); 107 CloseHandle(H2); 108 Sleep(3000); 109 110 //使用互斥事件 111 a = 0; 112 HANDLE H3, H4; 113 hmutex = CreateMutex(NULL, FALSE, NULL); //设置对象为未能取得事件所有权 114 H3 = CreateThread(NULL, 0, Thread9, NULL, 0, NULL); 115 H4 = CreateThread(NULL, 0, Thread10, NULL, 0, NULL); 116 CloseHandle(H3); 117 CloseHandle(H4); 118 Sleep(3000); 119 120 //进程间的通信 121 122 123 return 0; 124 }
运行结果如下:
进程间的通信(邮慒通信)
服务端
1 #include<iostream> 2 #include<windows.h> 3 int main() 4 { 5 HANDLE mail; 6 mail = CreateMailslot(L"\\\\.\\mailslot\\mysolt", 0, MAILSLOT_WAIT_FOREVER, NULL); 7 if (mail == INVALID_HANDLE_VALUE) 8 { 9 std::cout << "创建邮慒失败" << std::endl; 10 CloseHandle(mail); 11 } 12 else 13 { 14 std::cout << "创建邮慒成功" << std::endl; 15 char text[100]; 16 std::string str; 17 DWORD readtext; 18 while (true) 19 { 20 21 if (ReadFile(mail, text, 100, &readtext, 0)) 22 { 23 std::cout << text << std::endl; 24 } 25 else 26 { 27 std::cout << "读取数据失败" << std::endl; 28 } 29 } 30 } 31 CloseHandle(mail); 32 Sleep(2000); 33 return 0; 34 }
客户端
1 #include<iostream> 2 #include<windows.h> 3 int main() 4 { 5 HANDLE mail; 6 char text[] = "just a test"; 7 DWORD wirtetext; 8 mail = CreateFile(L"\\\\.\\mailslot\\mysolt", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 9 if (mail == INVALID_HANDLE_VALUE) 10 { 11 std::cout << "邮慒打开失败" << std::endl; 12 } 13 else 14 { 15 while (true) 16 { 17 std::cout << "write data" << std::endl; 18 std::cin >> text; 19 //std::cin.getline(text); 20 if (WriteFile(mail, text, sizeof(text), &wirtetext, NULL)) 21 { 22 std::cout << "邮慒写入数据成功" << std::endl; 23 } 24 else 25 { 26 std::cout << "邮慒写入数据失败" << std::endl; 27 } 28 } 29 } 30 Sleep(1000); 31 return 0; 32 }
时间: 2024-10-08 16:09:29