按ESC键结束线程的问题

paschen 版主 2012-05-03 05:00:10
下面这段代码是VS2010控制台下写的按ESC结束创建的线程
可按下ESC后,最后一句“线程已结束”为何不会输出到屏幕上,
单步的时候可以运行到那一句的,可也不会显示在屏幕上
是什么原因?


#include <iostream>
#include <Windows.h>
#include <stdio.h>
using namespace std;

DWORD WINAPI ThreadFunc(LPVOID lParam)
{
cout<<"线程开始运行"<<endl;
while(true)
{
cout<<"线程运行中.."<<endl;
}
return 0;
}

int main()
{
//创建线程
DWORD threadId;
HANDLE hTread = CreateThread(NULL,0,ThreadFunc,NULL,0,&threadId);

//判断是否按下了ESC,如果按下,终止线程
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
INPUT_RECORD irInBuf[1];
DWORD cNumRead;

while(true)
{
ReadConsoleInput(hStdin,irInBuf,1,&cNumRead);
if(irInBuf[0].Event.KeyEvent.bKeyDown && irInBuf[0].Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
{
cout<<"按下了ESC"<<endl;
TerminateThread(hTread,0);
break;
}
}
cout<<"线程已结束"<<endl;
//.....
return 0;
}
...全文
221 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2012-05-07
  • 打赏
  • 举报
回复
求帮助
bsnry 2012-05-07
  • 打赏
  • 举报
回复
getchar搞不定,呵呵,误导楼主了,

还是用api ReadConsoleInput函数解决。
paschen 版主 2012-05-07
  • 打赏
  • 举报
回复
好像和每个线程在同一时间输出有关,输出语句设为临界区就可以了,谢谢!
bsnry 2012-05-07
  • 打赏
  • 举报
回复
TerminateThread资源泄漏说的是dll没有 线程dll卸载,

线程栈没有释放,线程内核对象没释放。


所以泄漏,

但是进程死亡后,还是都收回。

楼主的代码 在我机子上没有问题。。。

他提供的什么读取 控制台的输入 函数,

没用过。


看是否 用户输入了 ESC.

我觉得 getchar貌似可以搞定吧???







[Quote=引用 5 楼 的回复:]

C/C++ code

int main()
{
//创建线程
DWORD threadId;
HANDLE hTread = CreateThread(NULL,0,ThreadFunc,NULL,0,&threadId);

//判断是否按下了ESC,如果按下,终止线程
HANDLE hStdin = GetStdHandle(STD_INP……
[/Quote]
chew351 2012-05-06
  • 打赏
  • 举报
回复
还可以这样啊?学习了
paschen 版主 2012-05-06
  • 打赏
  • 举报
回复
请牛人帮看
W170532934 2012-05-05
  • 打赏
  • 举报
回复

int main()
{
//创建线程
DWORD threadId;
HANDLE hTread = CreateThread(NULL,0,ThreadFunc,NULL,0,&threadId);

//判断是否按下了ESC,如果按下,终止线程
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
INPUT_RECORD irInBuf[1];
DWORD cNumRead;

while(true)
{
ReadConsoleInput(hStdin,irInBuf,1,&cNumRead);
if(irInBuf[0].Event.KeyEvent.bKeyDown && irInBuf[0].Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)
{
cout<<"按下了ESC"<<endl;
// TerminateThread(hTread,0);
CloseHandle(hTread);
break;
}
}
cout<<"线程已结束"<<endl;
return 0;
}

楼主,我把你的TerminateThread改为CloseHandle后就可以实现你需要的了。但是用TerminateThread为什么就不能输出线程已经结束,具体的我不是很清楚,但是TerminateThread这个函数虽然能够强力的关闭线程,但是你会发现这函数不是微软推荐使用的,他会泄露资源,以及如果存在访问具有锁的对象的时候会出问题。你可以谷歌下就知道了。为什么没有输出,我觉得有可能是:cout作为一个ios的对象,系统内共享这个变量,其内部实现机制有可能用到什么锁之类的东西了。当你使用TermianteThread函数的时候可能发生资源泄漏了,导致了无法输出你需要的信息了。
paschen 版主 2012-05-05
  • 打赏
  • 举报
回复
我知道这个,你们帮我调试下啊,不是因为那个,直接就没输出那句话,你可以加上调试一下,不知什么原因,难道是我的编译器的BUG?
paschen 版主 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

C/C++ code

int main()
{
//创建线程
DWORD threadId;
HANDLE hTread = CreateThread(NULL,0,ThreadFunc,NULL,0,&threadId);

//判断是否按下了ESC,如果按下,终止线程
HANDLE hStdin = GetStdHandle(STD_INP……
[/Quote]


可是CloseHandle(hTread);并没有结束线程,线程还在输出,我需要把线程结束了要怎么改呢??
Eleven 2012-05-04
  • 打赏
  • 举报
回复
return 0;前面加一句:system("Pause");
aopha 2012-05-04
  • 打赏
  • 举报
回复
单步时,在最后的return 0 打个断点,你就可以看到输出了。
运行时,命令行一闪就没了, 你当然看不到

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧