笔记内容多是编程时所遇到的问题,通过上网查资料以及询问他人所得,将它们记录下来。
1、创建线程之后为什么要使用closehandle()来关闭句柄?为什么closehandle之后线程还继续执行呢?
创建线程后返回了线程句柄,新创建的线程内核对象的使用计数是2,一个是线程本身,一个是创建线程的线程,创建线程的线程closehandle后,新的线程的内核对象使用计数为1,当这个新线程结束运行后内核对象的使用计数还要减1,这时内核对象的使用计数是0,则系统会自动删除新线程的内核对象,这是正常的处理流程。你如果不显示的调用closehandle,则新线程结束运行后,由于内核对象使用计数为1,所以不会删除内核对象,会造成内存泄露(有些说法是这样的:将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄漏),不过当整个进程结束时操作系统会自动关闭该进程的所有的内核对象包括这个新线程的内核对象,所以你不调用closehandle问题不大,只是在你的进程运行的时候会造成内存泄露,进程结束后系统是会自动清理的。
2、如何将类的成员函数作为线程函数?
类的成员函数作为线程函数时,需要将线程函数声明为static,但是static函数只能调用static成员,如果线程函数想调用类中的其它成员,可以将this指针当作参数传递给线程函数,这样线程函数就可以调用类中的其它成员了,如下所示:
3、字符集和编码
常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
ASCII字符集对应的有ASCII编码。
GB2312字符集有GB2312编码。
GB2312编码将ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。
Unicode字符集有UTF-8、UTF-16、UTF-32编码。
http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html
http://polaris.blog.51cto.com/1146394/377468/
4、自定义消息
定义一个自定义消息号:const UINT WM_MYMESSAGE = WM_USER + n; // 自定义消息一般大于WM_USER,然后就可以为该消息添加映射了。
推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
<span style="font-size:18px;">#define <span style="font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif;">WM_MYMESSAGE </span>WM_USER+999 //消息的定义
afx_msg LRESULT OnMyMessage ( WPARAM wParam, LPARAM lParam ); //消息响应函数的声明
ON_MESSAGE ( WM_MYMESSAGE, OnMyMessage ) //消息与响应函数的映射关系
LRESULT cxx::OnMyMessage ( WPARAM wParma, LPARAM lParam ) //响应的函数的实现
{
...
}</span>
如果该消息不需要返回值,也不需要参数,那么可以使用宏ON_MESSAGE_VOID来映射
<span style="color: rgb(51, 51, 51); font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; line-height: 28px; text-align: justify;">const UINT WM_MYMESSAGE = WM_USER + n;</span>
afx_msg void OnMyMessage ();
ON_MESSAGE_VOID ( WM_MYMESSAGE, OnMyMessage )
void cxx::OnMyMessage ()
{
...
}