今天在我的 AMD Turion 64 X2 1.61 / 1.93GB 的烂康柏笔记本上使用 QueryPerformance* API函数测试发现 Sleep 函数的精度在 15 毫秒差不多。
Sleep(0) // >15毫秒
Sleep(16) // >30毫秒
...
没兴趣再深入测试了,本来还想设置一下线程亲缘性看看是否一样。想想我用 QueryPerformanceFrequency 得到的频率不是 CPU 频率,所以没必要了。
前几天遇到了传说中的R6025错误,经过网络上搜索一番知道这是由于运行时调用了鸡肋的纯虚函数,一般出现在构造函数和析构函数中间接的调用了纯虚函数。但问题是,这不是我的情况。因此,我进行了两天的代码调试,总算是发现了元凶。
问题出在完成端口!在我的完成端口模型中,完成键是一个对象,它随一个SOCKET句柄关联到完成端口。当一个完成包被成功获取,则使用这个完成键(对象)执行完成任务。这没错,并且我把对象使用引用计数来管理生命周期,一切尚在预期之中。但问题出在,我需要更换这个SOCKET句柄的完成键。当这个SOCKET需要收发数据,则被封装在一个叫NetSession的类中,完成键就是...
在一个线程A中检测AcceptEx的存量,如果小于某个数值则投递一定数量的AcceptEx到完成端口。这个线程非常简单,但是在程序退出时必须清理掉投递到完成端口中的那些AcceptEx,以达到释放资源。因此,在程序退出前我必须发出信号给线程A,告诉它要终止运行。然,线程A是终止运行了,但存在完成端口中的AcceptEx还没清理,我尝试了一下几种清理方式:
第一天、直接closesocket(listensocket)关闭这个关联到完成端口的监听SOCKET。
这种方式,失败了!完成端口鸟都没鸟这已经关闭的listensocket,没有发生出队一个失败的完成包。
第二天、先调...
template <typename T>class InterfaceT{public: InterfaceT(void) { } virtual ~InterfaceT(void) = 0 { } T t;};class InterfaceA{public: virtual ~InterfaceA(void) = 0 {} virtual void TestFun1(void) = 0; virtual void TestFun2(void) = 0;};#define TEST 1#if TEST == 1class...