同步线程和进程间的通信

最近回去学习了一下进程和进程间的通信,有时候很多东西久不看了也就一下子忘了==

这里面有好几个互斥对象使用线程的

  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 }

 

posted @ 2014-12-17 14:05  尽子轨  阅读(153)  评论(0编辑  收藏  举报