读书人

win32下线程阻塞与开启的有关问题

发布时间: 2012-05-01 12:48:58 作者: rapoo

win32下线程阻塞与开启的问题
代码如下,我想在输入的时候阻止输出,直到输入完成后再次开启输出线程,请问该如何修改

C/C++ code
#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);} 


[解决办法]
用同步啊, 可以在主线程创建两个事件 ,主线程里面reset一个事件唤起SendProc工作,然后再SendProc线程里面reset一个事件唤起RecvProc线程工作
[解决办法]
用getch,捕捉到有输入且不为'\r'的时候就进行SuspendThread,捕捉到是'\r'的时候就ResumeThread
[解决办法]
试试我这个,不对请指出

C/C++ code
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>>调用用互斥包起来,那么当用户没有输入的时候,线程二仍然得不到执行。

读书人网 >C++

热点推荐