按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;
}
...全文
204 13 打赏 收藏 转发到动态 举报
写回复
用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 打个断点,你就可以看到输出了。
运行时,命令行一闪就没了, 你当然看不到
1.linux系统介绍 以windows为内核的操作系统有哪些:win10   win8   win7  xp  系统    windows server 以linux为内核的操作系统有哪些:centos  ubuntu  debian   windows和linux  linux:服务器   安全    稳定 高效    windows:办公  家用  2.安装linux注意事项 对centos系统 的基本使用   有哪些文件夹   对文件/文件夹 进行操作  创建 删除  修改 移动 复制   写入 home 存放所有用户文件的根目录  soft :安装软件 cd  ll mkdir 创建文件  touch 空文件  echo sdsd>a.txt       vi a.txt vi c.txt  打开文件  按下i  改为写入的模式    写完之后保存: 先按下esc再按下:w 保存 :q退出  :wq    写完之后不想保存 强制退出  esc  :q! 删除文件/文件夹 rm -rf a.txt  b.txt rm -rf soft 复制 如果复制文件 cp  要复制的文件名   复制出来的文件名子    cp  a.txt   a1.txt 如果复制的是文件夹的 cp -r soft/   soft1 展示一个文件中的内容 cat  移动文件  mv  temp1   temp2 重命名 mv  temp1   temp2 查找: find /(查找的路径)  -name   *.txt    b 清屏  clear tab 按 可以帮助我们把输入的内容补全   3.配置局域网  需要通过ssh软件远程操作linux系统 远程操作centos系统  在windows操作系统中通过一款软件来远程操作虚拟电脑中的centos系统  ssh软件: xshell  secureCRT 第一步在win10系统中下载并且安装ssh软件 secureCRT    第二步:只要知道centos系统所在电脑的公网IP  登录账户和密码      /  win10和centos系统所在的两台电脑在同一个局域网内  局域网IP  登录账户和密码 第三步:centos系统 进行局域网的设置 往网卡中写入一些数据   win10写入的方式:桌面的化操作和centos系统写入的方式是不一样的  ip 网关 子网掩码 NM_conteolle。。。 命令  找到往网卡写入数据的文件    重新启动网络服务 开启22端口   重启防火墙服务 网络桥接网络  *************************端口是否开启  4.配置外网  下载软件1.下载并且安装到系统中 node.js环境   npm install bootstrap   默认的镜像库 centos系统    yum install  服务名     默认的镜像库  2.自己下载服务  wget 服务的网络地址 自己单独安装  比较灵活 安装难度大 windows系统  exe文件 linux       rpm包

64,670

社区成员

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

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