MFC开辟多线程为什么要关闭线程?

handanwxd 2011-07-05 04:18:25
在线程里处理完运算后为什么还要关闭这个线程,不关闭行不行?如果关闭怎么关闭?
...全文
453 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
cultsharp 2011-07-08
  • 打赏
  • 举报
回复
如ID为IDD_SCOMMTEST_DIALOG对话框标题为"ceshi"
HWND hWnd = FindWindow(NULL,"ceshi");
cultsharp 2011-07-08
  • 打赏
  • 举报
回复
HWND hWnd = FindWindow(NULL,"IDD_SCOMMTEST_DIALOG");

一般用这个ID(IDD_SCOMMTEST_DIALOG)对应对话框的名字
handanwxd 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 sichuanpb 的回复:]
这个真的不需要关闭,只执行一次而已。
另外,这个根本不需要线程方式。
再看看 HWND hWnd = FindWindow(NULL,"IDD_SCOMMTEST_DIALOG");应该有问题。
[/Quote]
我知道不需要线程,我在学习线程而已,
HWND hWnd = FindWindow(NULL,"IDD_SCOMMTEST_DIALOG");
这句问题好郁闷
hjfjoy 2011-07-06
  • 打赏
  • 举报
回复
线程会占用内存资源,会占用CPU,如果不停的创建但是不关闭线程,后果可想而知。。
sichuanwww 2011-07-06
  • 打赏
  • 举报
回复
这个真的不需要关闭,只执行一次而已。
另外,这个根本不需要线程方式。
再看看 HWND hWnd = FindWindow(NULL,"IDD_SCOMMTEST_DIALOG");应该有问题。
handanwxd 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zyc285230318 的回复:]
发详细代码 看看
[/Quote]
//主类头文件代码:(窗口类)
UINT ThreadFunc(LPVOID lpParam); //声明线程
class CSCommTestDlg : public CDialog
{
public:
float bomei(CString str);
CString Bomeichange(CString str,CString str1);
ConvertHexChar(char ch);
String2Hex(CString str, CByteArray &senddata);
CSCommTestDlg(CWnd* pParent = NULL);
CWinThread* pThread; //定义指针对象

//以下为主类中程序
***************************
***************************
pThread=AfxBeginThread(ThreadFunc,NULL,0,0,0,NULL); //启动线程
***************************
***************************
UINT ThreadFunc(LPVOID lpParam) //线程函数
{
HWND hWnd = FindWindow(NULL,"IDD_SCOMMTEST_DIALOG");
char cishu[40],baifenbi1[40],bomeidu1[40],wendu1[40],shijian1[80];
if(m_boolth1 ==1)
{
GetDlgItemText(hWnd,IDC_WENDU,wendu1,40);
GetDlgItemText(hWnd,IDC_BOMEIDU,bomeidu1,40);
GetDlgItemText(hWnd,IDC_BAIFENBI,baifenbi1,40);
GetDlgItemText(hWnd,IDC_NOWTIME,shijian1,80);
}
return 0;
}
////////////////////////////////////////////////////
各位帮忙,能追加分不,追加40分
LiuYinChina 2011-07-06
  • 打赏
  • 举报
回复
因为你的这个线程不是界面线程,这个线程里没有 HWND 的映射(说来复杂)。
你是不是直接用的 CreateThread 或者 _beginthreadex, 你应该用 CWinThread 启动UINT ThreadFunc(LPVOID lpParam),应该就可以了。
另外,一般不这么用,界面的东西都放在主界面线程,你这么做,后面如果有什么问题,可能比较难调试。
shiyunqiang 2011-07-06
  • 打赏
  • 举报
回复
不关闭当然不行了,会消耗资源的。
clown 2011-07-06
  • 打赏
  • 举报
回复
发详细代码 看看
lflljt 2011-07-06
  • 打赏
  • 举报
回复
CWnd::UpdateData()
na2650945 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 handanwxd 的回复:]
在线程里处理完运算后为什么还要关闭这个线程,不关闭行不行?如果关闭怎么关闭?
[/Quote]
关闭的是句柄吧。
进程运行结束会自动清理的。
handanwxd 2011-07-06
  • 打赏
  • 举报
回复
根据各位的建议我看了看,hWnd的值是0x00000000,这个算是无效吧,怎么解决呢?
另外我在线程里加了“UpdateData();”提示“UpdateData();”未定义。
这些问题是不是线程内部函数应该和外部有某种设置或者连接什么的吧
handanwxd 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luciferisnotsatan 的回复:]
GetDlgItemText调用成功了么?失败的话,getlasterror看看什么错
[/Quote]
调用成功,但就是空值
Allen_zhang 2011-07-05
  • 打赏
  • 举报
回复
1、你确定HWND hWnd = FindWindow( NULL , "IDD_SCOMMTEST_DIALOG " ); //获得窗口句柄
这个获取的句柄有效?

2、这么简单的东西不用放到线程中吧?

3、你控件填入信息的时候有调用了updatedata了吗?如果还没有线程就这样调用的话是没有d
sjy88813 2011-07-05
  • 打赏
  • 举报
回复
你那个FindWindow中,后面的要填窗口的名字,就是窗口的标题,你的"IDD_SCOMMTEST_DIALOG "怎么感觉后面有个空格??
UpdateData();
GetDlgItemText(hWnd,IDC_WENDU,wendu,40);
GetDlgItemText(hWnd,IDC_BOMEIDU,bomeidu,40);
GetDlgItemText(hWnd,IDC_BAIFENBI,baifenbi,40);
GetDlgItemText(hWnd,IDC_NOWTIME,shijian,80);
wltg2001 2011-07-05
  • 打赏
  • 举报
回复
你确定HWND hWnd = FindWindow( NULL , "IDD_SCOMMTEST_DIALOG " ); 这个句柄是有效的吗?
luciferisnotsatan 2011-07-05
  • 打赏
  • 举报
回复
GetDlgItemText调用成功了么?失败的话,getlasterror看看什么错
forwin 2011-07-05
  • 打赏
  • 举报
回复
看下什么时候调用ThreadFunc
是否在调用前已经赋值
nightkids_008 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 handanwxd 的回复:]
哦,原来如此,大家看一下我的代码:
////////////////////////////////////////////////////////////////////////
UINT ThreadFunc(LPVOID lpParam)
{
HWND hWnd = FindWindow( NULL , "IDD_SCOMMTEST_DIALOG " ); //获得窗口句柄
……
[/Quote]
将变量和控件关联。。然后UPDATADATE
handanwxd 2011-07-05
  • 打赏
  • 举报
回复
哦,原来如此,大家看一下我的代码:
////////////////////////////////////////////////////////////////////////
UINT ThreadFunc(LPVOID lpParam)
{
HWND hWnd = FindWindow( NULL , "IDD_SCOMMTEST_DIALOG " ); //获得窗口句柄
char cishu[40],baifenbi[40],bomeidu[40],wendu[40],shijian[80];

if(m_boolth1==1) //m_boolth1为全局变量
{
GetDlgItemText(hWnd,IDC_WENDU,wendu,40);
GetDlgItemText(hWnd,IDC_BOMEIDU,bomeidu,40);
GetDlgItemText(hWnd,IDC_BAIFENBI,baifenbi,40);
GetDlgItemText(hWnd,IDC_NOWTIME,shijian,80);
}
return 0;
}
//其中,IDC_WENDU,IDC_BOMEIDU,IDC_BAIFENBI,IDC_NOWTIME为窗口上的四个EDIT控件
///////////////////////////////////////////////////////////
结果是我不能读取这四个控件里的字符,单步调试每个数组得到的都是"",空字符,控件里确实有东西,求解什么地方不对
加载更多回复(5)
学习并掌握C++2.0(11+14+17+20)的新特性,学习线程线程池的应用 ---------------------------------------------------给小白学员的3年学习路径及计划技术方面分三块:1.纯开发技术方向2.音视频流媒体专业方向3.项目实战---------------------------------------------------1.纯开发技术方向(1) C++必须要过硬(至少学会10本经典好书)(2) 系统级编程(Windows、Linux),必须特别熟练系统API,灵活运用(3) 框架与工具(Qt、MFC):必须精通其中一种。(4) 架构与设计模式:需要提升一个高度,不再是简单的编码,而是思维模式。(5) 驱动级别(如果有兴趣,可以深入到驱动级:包括Windows、Linux)(6) 最好学习点Java+Html+javascript等WEB技术。2.音视频流媒体专业方向(1) 音视频流媒体基础理论:   必须认真学会,否则看代码就是看天书(2) 编解码方向:精通h.264,h.265(hevc), 包括理论和各个开源库(ffmpeg,libx264,libx265,...)。(3) 直播方向:  精通各种直播协议(rtsp,rtmp,hls,http-flv,...), 钻研各个开源库(live555,darwin,srs,zlmediakit,crtmpserver,...)(4) 视频监控:  理论+开源库(onvif+281818)(EasyMonitor、iSpy、ZoneMinder(web)、...) 3.项目实战(1) Qt项目:  至少要亲手练习10个实战项目(网络服务器、线程、数据库、图像处理、多人聊天、等等)(2)音视频项目:包括编解码、视频监控、直播等各个方向,都需要亲手实战项目,包括视频服务器、后台管理系统、前端播放器(多端)---------------------------------------------------  第1章 C++11新特性 41). nullptr关键字与新语法 42). auto和decltype类型推导 6 auto讲解 6 auto示例 7 decltype 83). for区间迭代 94). 初始化列表 105). 模板增强 11外部模板 11类型别名模板 12默认模板参数 126). 构造函数 13委托构造 13继承构造 147). Lambda 表达式 158). 新增容器 20std::array 20std::forward_list 21无序容器 22元组 std::tuple 239). 正则表达式 2610). 语言级线程支持 28线程库简介 2811). 右值引用和move语义 31右值引用和move语义 32转移左值 3412). constexpr 35第2章 C++14新特性 36Lambda 函数 36类型推导 37返回值类型推导(Return type deduction) 37泛型lambda 39[[弃用的]]  [[deprecated]]属性 40二进制数字和数字分隔符 41第3章 C++17新特性 42安装GCC10.2 42安装msys2-x86_64-20200720 42更新镜像 42更新软件库 43安装 MinGW64 等必要的软件 43环境变量Path 43编译命令 43constexpr 44typename 45折叠表达式 47结构化绑定 48条件分支语句初始化 49聚合初始化 50嵌套命名空间 52lambda表达式捕获*this的值 53改写/继承构造函数 54用auto作为非类型模板参数 55__has_include 56fallthrough 57nodiscard 57maybe_unused 58第4章 C++20新特性 59编译命令 59concept 59typename 60explicit 61constinit 62位域变量的默认成员初始化 62指定初始化 63基于范围的for循环初始化 64放宽基于范围的for循环,新增自定义范围方法 65嵌套内联命名空间 66允许用圆括弧的值进行聚合初始化 67unicode字符串字面量 68允许转换成未知边界的数组 68likely和unlikely 69第5章 C++2.0(11/14/17/20)总结与分析 705.1 C语言与C++ 715.2 语言可用性的强化 725.2.1 常量 725.2.2 变量及其初始化 735.2.3 类型推导 745.2.4 控制流 765.2.5 模板 775.2.6 面向对象 815.3 语言运行期的强化 835.3.1 Lambda 表达式 835.3.2 右值引用 865.4 容器 885.4.1 线性容器 885.4.2 无序容器 895.4.3 元组 895.5 智能指针与内存管理 905.5.1 RAII 与引用计数 905.5.2 std::shared_ptr 905.5.3 std::unique_ptr 915.5.4 std::weak_ptr 91第6章 C++2.0线程原理与实战 93什么是并发 93并发的方式 93为什么使用并发 95线程简介 96创建线程的三种方式 971. 通过函数 972.通过类对象创建线程 993.通过lambda表达式创建线程 101thread线程的使用 101互斥量与临界区 105期物Future 111条件变量 112原子操作 114内存模型 118第7章 C++2.0线程池原理与实战 120线程线程池的基本原理 1201)、线程 1202)、线程的生命周期 1213)、什么是单线程线程 1214)、线程池 1225)、四种常见的线程池 123线程池的架构与流程 123线程池代码实战 125    
FastCopy 是 Windows 平台上最快的文件拷贝、删除软件,它支持 UNICODE 和超过 MAX_PATH (260 个字符)的文件路径名。由于其功能强劲,性能优越,一时间便超越相同类型的所有其他软件。由于该软件十分小巧,你甚至可以在打开后,直接将安装目录中的文件复制到任何可移动存储设备中,方便携带,随取随用。 FastCopy 会根据源目录和目标目录是否在相同的硬盘(或 SSD)中,自动选择不同的方法。 不同的硬盘:读取和写入分别由单独的线程并行处理。 相同的硬盘:读取处理,直到大的缓冲区填满为止。当大缓冲区被填满时,开始写入并批量处理。 FastCopy 在不使用操作系统缓存的情况下处理读取/写入,不会影响其它应用程序运行时的速度。 FastCopy 可实现接近于设备限制的读取/写入性能。 FastCopy软件功能 1.Windows最快的文件复制,备份与删除工具。 2.您还可以复制(与删除)只能由UNICODE表示的文件名与超过MAX_PATH(260个字符)的文件。 3.读/写/验证独自的线程操作与异步I / O与直接I / O使性能接近设备的极限。 4.可以指定包含/排除过滤器(UNIX通配符格式)。 5.由于仅使用Win32API而不使用MFC等框架,所以它轻巧,紧凑且易于操作。 FastCopy软件特点 1.完全支持拖曳操作,支持拖曳多个文件到来源中。 2.支持外壳组合,方便使用右键菜单直接复制文件。 3.支持三种不同的HDD模式。 4.内建多种人性化的操作模式。 5.支持过滤,可以使用通配符。 6.支持任务管理。 7.支持命令行操作。 8.软件十分小巧,甚至可以在安装完后,直接将安装目录中的文件覆盖到任何可移动存储设备中,方便携带,随取随用。 9.易于使用,可以充分挖掘文件系统与硬盘的传输能力。 10.支持计数与计时,在很多实用的硬盘传输速率的评测中,FastCopy 成了不二之选。 FastCopy软件优势 1.FastCopy 可以在不使用系统缓存的情况下处理读取/写入,不会影响其它应用程序运行时的速度。 2.FastCopy 可以实现接近于设备限制的读取/写入性能。 3.FastCopy 可以指定包含/排除过滤器(UNIX 通配符样式)。 4.FastCopy 运行快、不占资源。 所有的复制操作都是通过“从介质(硬盘)读数据→写入数据→从缓存中读出→向介质(硬盘)写入数据”这几项步骤来完成的,并且这些步骤都是多个线程同时进行的,如果线程之间的协同运作不够完美,那速度就会大打折扣,有些线程忙得要命,而有些却必须等待,FASTCOPY就是优化了它们之间的工作顺序,大大提高了速度。 FastCopy软件主要特点 ├—FastCopy 是免费开源Windows上最快的复制/备份软件。 ├—支持UNICODE和超过MAX_PATH(260字符)的文件路径名。 ├—使用线程读/写/校验,重叠IO,直接IO,从而实现设备最高读写性能。 ├—可以使用 UNIX通配符 样式的 包含/排除 筛选器。 ├—运行速度快,不占资源,因为仅使用 Win32 API 和 C 运行时设计,没有使用 MFC。 为什么需要第三方文件复制软件? 相比Windows自带的文件复制/粘贴方式,第三方文件复制软件提供了:更高性能、更多的功能、更佳体验。它们的优化原理如下: 缓存机制:第三方文件复制软件,经常标榜“具备 XX MB 的写入缓存”。其原理是,在复制/移动的过程中,Windows会先读取一部分数据到缓存中;再从缓存中写入到新介质。其实,Windows 复制文件时,默认也开启了缓存机制,只是无法设置缓存大小。由于Windows默认的缓存太小,导致读取和转移这两过程基本都是同时进行,很容易出现瓶颈,致使“Windows复制文件快不起来”。而第三方文件复制软件会开辟一块更大的缓存空间,并把设置权重新交给用户。
4.1 SNGraph 一 点、向量 基本运算 二 直线(线段、射线) 直线(线段、射线)用起点、方向(单位向量)、线段长度表示。 包括如下功能:  点是否在直线上。  假定点在直线上,点到直线起点的有向距离。如果点在直线上,点到直线距离为n。如果n>=0,则点在射线上;如果(n>=0)&&(n <= 线段长度) ,则点在线段上。  两直线是否平行或重合。  两直线是否重合。  两直线是否垂直。  两直线交点。  两非平行直线距离。  求垂足。 三 平面 通过过平面一点和方向(单位矢量)表示平面。包括如下功能:  点到平面的有向距离。通过平面标准法向量和距离,可以求垂足;通过点到平面的距离的正负,可以看出多个点是否在同侧;如果点到平面的距离为0,则点在平面上,否则不在平面上。  直线是否在平面上  平面和直线的交点 通过调用其他功能可以实现的功能:  平面的法向量平行于直线,则平面和直线垂直  平面的法向量垂直于直线,则平面和直线平行  平面的法向量平行(垂直)则平面平行(垂直)  平行平面的距离等于平面任意一点到另一平面的距离 四 矩阵 包括以下功能:  初始化为单位矩阵。  为向x,y,z方向缩放建立矩阵。  为任意方向缩放建立矩阵。投影平面,可以通过向平面法线方向缩放0实现。平面镜像,可以通过向平面法线方向缩放-1实现。  为对一个点镜像建立矩阵。  为对一条直线镜像建立矩阵。  为对一条对称轴旋转建立矩阵。  求对应行列式的值。  求逆矩阵。  求转置矩阵。  左乘。  求对应行列式的代数余子式。  常见运算符。 4.2 SN 封装了许多基础的功能。 一 接口  读写锁。 二 避免依赖其它类库 有些类经常用于库间接口,所以需要避免依赖其它类库。  字符串类、函数,比如:宽字符、多字符间的转换。  时间类。  数组的封装。 三 其它  将错误信息记录到全局变量中,应用场景:构造函数和析构函数中throw会引起不可预料的问题。  安全缓存,额外开辟若干个字节的空间,并初始化为一个特定值,如果不越界,这些值不会改变。  智能指针,为了将关联降为依赖。CAutoPtr m_pC代替C m_c,头文件中不需要引用C类的头文件。只需要声明C类,在源文件中引用C类的头文件。  MD5。  RSA。  SHA。  考虑溢出的加减法。比如:int型的10亿加20亿,-10亿减20亿。  通过表名、列名、某些列的值生成sql语句。  安全指针和防野指针类。防野指针类:在构造函数中将状态初始为已初始化,在析构函数中将状态设置为已释放。安全指针在使用时之前判断 防野指针类释放是“已初始化”,否则抛出异常。  将有参数的函数统一成没参数返回值类型void的仿函数。  遍历文件夹的文件和子文件夹。  随机数和排列组合。  系列化和反系列化。将对象和变量转化成二进制,并将二进制转回变量和对象。  拆分,如字符串。 4.3 SNMFC 一 网络功能  网络基本功能:如获取本机IP,通过域名获取IP,IE版本。  HTML对话框的封装类。  用于服务端的,带“回调类”的绑定监听类,利用IO完成端口。  用于客户端的,带“回调类”连接类,利用select模式完成,可以指定是否开启新线程。连接时,可以指定超时时间,默认5秒。如果直接调用系统的connect,超时时间是75秒。  能够自动处理“粘包”、“拆包”的二进制解析类。  安全套接字的辅助类,如:设置发送、连接超时。  比较服务端的某个文件夹和客户端的某个文件夹,并更新那些md5不同的文件。 二 线程  用临界区实现的线程锁,和线程读写锁。  窗口辅助类。  开启一个线程并调用一个函数。  开启一个线程并循环调用一个函数。  支持线程的日志。  启动一个线程,等待若干秒后,Post或Send一个消息后,结束线程。 三 界面  三态树控件。  列表框扩展类和函数。  树控件的扩展。  组合框的扩展。  关于窗口功能的封装。比如:从左到右依次排列子窗口,排不下则下一行。可以指定行间距。页眉和页脚是行间距的一半。  位图的加载和显示。 四 其它  Ini文件。  数组封装类。  获取硬件信息,如网卡。  文件或文件夹的常用功能。  注册表的扩展。 4.4 SNSTL  数组(向量)扩展。  用于线程的向量。  JSON解析。  集合的扩展。  映射的扩展。  指针向量,可以存派生类。  指针映射,可以存派生类。 4.5 其它库  UnitTest,本机单元测试项目,对整个库的重要功能进行单元测试。  SNBCG,著名界面库的扩展,几乎没使用。  SNPicture,图形图像的处理(如转换bmp格式),几乎没使用。  SNMath,数学及数据结构库,几乎没使用。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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