win32下线程阻塞与开启的问题
代码如下,我想在输入的时候阻止输出,直到输入完成后再次开启输出线程,请问该如何修改
#include <iostream>#include <windows.h>#include <cstdio>using namespace std;DWORD WINAPI SendProc( LPVOID lpParameter // thread data);DWORD WINAPI RecvProc( LPVOID lpParameter // thread data);int main(int argc, char *argv[]){ HANDLE Hrecv=CreateThread(NULL,0,RecvProc,NULL,0,NULL); HANDLE Hsend=CreateThread(NULL,0,SendProc,NULL,0,NULL); Sleep(1111111); return 0;}DWORD WINAPI SendProc(LPVOID lpParameter ){ while(1) { string temp; cout<<"please type:"<<endl; if(cin>>temp) cout<<"You have typed:"<<temp<<endl; } return 0;}DWORD WINAPI RecvProc(LPVOID lpParameter ){ int i; for(i = 0;i<10;i++) { cout<<i<<endl; Sleep(1000); } Sleep(1000);} unsigned _stdcall ThreadFun1(LPVOID lp){while(1){if( WAIT_OBJECT_0==WaitForSingleObject(事件句柄,0) ){return; //停止输入}string temp;cin>>temp;cout<<temp;if(string("stop")==temp ){SetEvent( 事件句柄); //让其停止}} //end while} unsigned _stdcal ThreadFun2(LPVOID lp){while(1){if(WAIT_OBJECT_0 == WaitForSingleObject(事件句柄,0 ) ){//打印}}}
[解决办法]
试试这个,应该可以了
int main(int argc, char *argv[])
{
HANDLE Hsend=CreateThread(NULL,0,SendProc,NULL,0,NULL);
WaitForSingleObject(Hsend,INFINITE); HANDLE Hrecv=CreateThread(NULL,0,RecvProc,NULL,0,NULL);
Sleep(1111111);
return 0;
}
[解决办法]
只能一个字符一个字符的读取,当读取到第一个字符的时候,让输出线程不输出,等读取到回车的时候,重新让线程输出。
但仍然可能有问题,就是线程一读取到第一个字符,通知线程二停止输出的时候,线程二可能正在输出过程中,此时仍然出问题。
要想精确控件,只能让线程一自己实现输入输出的所有功能,线程二只是产生输出字符串,然后放到线程一的缓存里面。具体的实现比如:
弄一个全局的list,线程二按照自己的逻辑产生输出字符串,然后push_back到list中,线程一在没有读取的时候,从list中取出字符串,并显示。当然,操作list需要互斥。
6楼的问题在于,如果把cin>>调用用互斥包起来,那么当用户没有输入的时候,线程二仍然得不到执行。