- 博客(10)
- 资源 (11)
- 收藏
- 关注
原创 SendMessage导致的死锁问题
前言:试想这样一种场景:子线程通过SendMessage同步消息到主线程,假设子线程的结束是通过标志位来控制的。当主线程想要尝试结束子线程的时候一般是这样操作的,bFlag = false;WaitForSingleObject(hThread,INFINITE); //阻塞等待CloseHandle(hThread);将标志位置为false后,在子线程的主循环中肯定会判...
2019-09-28 20:33:54 10978
原创 MFC窗口实现最小化到托盘
以下为实现代码#define WM_SHOWTASK (WM_USER +1)//消息映射BEGIN_MESSAGE_MAP(Test, CDialog) ON_MESSAGE(WM_SHOWTASK,&Test::OnShowTask)END_MESSAGE_MAP()void Test::ShowTray(bool bShow){ NOTIFYICONDATA...
2019-09-26 19:39:56 9822
原创 VC++ TCP编程实例
直接上代码客户端:// TcpClient.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <winsock2.h>#pragma comment(lib, "WS2_32")#include <iostream>#include "../../public/Message.h"using na...
2019-09-24 20:09:52 10692
原创 memset陷阱
1、不能用memset操作对象memset甚至会修改虚表指针以下代码会崩溃:class Base{public: virtual void test() { printf("base \n"); }};class Test:public Base{public: virtual void test() { ...
2019-09-23 19:57:13 9971
原创 指向静态成员函数和普通成员函数的指针
相当于是熟悉一种语法吧class Test{public: static void StaticFunc() { printf("StaticFunc \n"); } void NormalFunc() { printf("NormalFunc \n"); }};int main(){ voi...
2019-09-22 20:17:51 9971
原创 switch语句的缺点及替代方案
前言switch语句是我们经常使用的,在平时的项目中基本不会有什么问题,但是某些场景下,switch的条件分支可能会成千上万个(如服务器或客户端处理消息id的逻辑),这会导致项目难以维护。switch语句缺点大量条件的switch语句缺点如下:每个条件处理逻辑太长,不便查看;当有从1-10000个条件是,如果条件是1w,那么该逻辑要判断上万次;break容易漏写,导致产生不...
2019-09-22 19:57:47 13209
原创 C/C++基于TCP的通信协议解决方案
经过本人的分析与项目实战,一种基于收发结构体的方案是非常可靠且方便的。具体方法是,所有的结构体继承自一个结构体,stBase,而stBase的成员只有一个整形的消息id,将收到的消息存到缓冲区后(处理好粘包),将缓冲区强制转换成stBase,通过id来判断对应的业务消息,再强制转换成对应的结构体。消息的定义:这里处理一个基结构体外,只写了两个业务结构体,struct stBa...
2019-09-19 21:37:02 11496
原创 符号扩展
符号扩展是指计算机对于小字节转换成大字节的规则。比如char(1字节)转换成int(4字节),多出来的3个字节到底填充什么?规则如下:当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展是一样的,因为符号位就是0,即全填充0。上面那句话的本意是指:负数扩展后,还是负数,且值不变;正数扩展后还是正数,值不变。看似简单的一句话,可常在面试中让人困惑不已...
2019-09-09 20:29:33 24106 2
原创 开源一个C/C++日志类
前言日志类可以作为一个练手项目,实现一个好的日志类并不容易,这里先出第一个版本,后期持续优化。功能简单对于新手非常友好,欢迎指正错误。介绍该日志类我命名为CClog,第一个C是class的意思,忽略这一点的话可以叫Clog。作用当然是日志记录,写日志操作是线程安全的,支持类似字符串Format的形式。环境基于Windows平台使用案例Demo// test.cpp :...
2019-09-05 19:33:53 11405
原创 new二维数组
二维数组本身是不存在的,会被解释成一维数组。比如int a[4][3]在内存中是这番景象:其中int[3]会被认为是一种类型。所以要new二维数组,返回值类型为 int (*pDoubArr)[3] = new [10000][3];解释:返回值为int[3]类型的指针,如同int *pArr = new int[100];返回int类型指针。在一维数组中int是一种类型,int[...
2019-09-03 18:56:44 10932
Scrollbar_png.zip
2019-11-20
DuiDesigner.rar
2019-11-14
VC AssistantX_适用VS2005.zip
2019-07-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人