
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
在你想创建一个控制台的地方:
AllocConsole();//为进程创造一个新的控制台
HANDLE hOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);//获得控制台输出句柄
DWORD nRet = 0;//用来记录实际输出的字符个数
TCHAR buf[100];//用来输出字符的缓冲区
lstrcpy(buf, L"Hello");//现在是将hello输出到控制台,加l的函数是为了宽字符做的一套函数用法一样
WriteConsole(hOutputHandle, buf, lstrlen(buf), &nRet, NULL );//现在就是输出到控制台的函数,此函数对中文兼容性比较不错。
}
DWORD ThreadID = 0;
CreateThread(NULL,0,ThreadProc,NULL,0,&ThreadID);//这句代码加在你想加多线程的地方
可能是执行的过快造成的吧。
建议如下:
1 定义两个信号量CEvent,初始化为非信号;
2 在AfxBeginThread()创建线程后,加入短暂的休眠Sleep()函数让线程有机会初始化。
3 在Sleep函数后用WaitForSingleObject等待对应线程的准备就绪信号量置位
4 在线程执行体内,准备就绪后,添加置位对应的信号量的语句。
这样通过检测信号量可以使得两个线程都准备就绪,然后再开始通信。
另外,请注意线程中循环体内的休眠时间,理应比通信速度要快,才能有效检测。其实最好的方法就是通过信号量等对象来控制多线程间的异步时序关系。
1、不要在子线程 *** 作UI控件
2、如果你 *** 作了,也绝对不能调用UpdateData来更新界面,否则程序Crash
3、这一条建立在第一条基础上---你在子线程 *** 作UI控件,不可以让主线程等待某些条件(如等待子线程关闭,而子线程正在 *** 作UI、等待进
入临界区,而子线程已经进入,并且 *** 作UI),否则会出现假死
4、最好方案:子线程 *** 作数据,完成之后,通知主线程进行更新
1用AfxBeginThread创建的线程结束时,不必调用什么函数,只要return 就可以了,主线程可以通过消息或事件(推荐)来结束线程。如下:
HANDLE hStop;
UINT TestThread(LPVOID)
{
while(true)
{
DWORD ret=WaitForSingleObject(hStop,0);
if (ret==WAIT_OBJECT_0) //有停止事件
{
break;
}
//do somthing
}
return 0L;
}
CTestView::OnAAAClick()
{
hStop=CreateEvent(NULL,FALSE,FALSE,NULL);
AfxBeginThread(TestThread,NULL); //开始线程
}
CTestView::OnBBBClick()
{
SetEvent(hStop); //结束线程
CloseHandle(hStop);
}
以上就是关于mfc的程序如何利用多线程打开一个控制台详细代码全部的内容,包括:mfc的程序如何利用多线程打开一个控制台详细代码、MFC多线程编程、MFC多线程编程的几点经验等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)