Windows多线程笔记
最近手头上的东西终于有了一点小突破,这段时间代码上遇到一些问题,有些困了我蛮久。因为之前根本没接触过Windows下面的SDK,Windows核心编程和MSDN都翻了不少,也没少向集训队的学长请教。把这段时间遇到的几个问题整理下,如果能帮到别人就更好了。
子进程的标准输入输出重定向问题:
没有仔细看MSDN的例子和注释,代码写好后,子进程的标准输入输出还是在父进程的命令行下进行。
主要原因是 CreateProcess 之前, STARTUPINFO 这个结构不仅仅是指定一下hStdInput, hStdOutput这几个句柄就行了,dwFlags 这个变量需要设置为 STARTF_USESTDHANDLES 才能使以上几个句柄有效。CreateProcess 时,bInheritHandles 需要设置为 TRUE。不仅如此,还有一个容易遗忘的细节,就是 CreateFile 时的 LPSECURITY_ATTRIBUTES 也需要设置为TRUE(同样,CreatePipe 的 SECURITY_ATTRIBUTES 结构的 bInheritHandle 也要设置为TRUE)。
ReadFile堵塞问题:
如果父进程和子进程通过匿名管道来通信,且把子进程的标准输入输出重定向到了管道,那么会碰到下面这个问题。当子进程的输出被存在缓冲区内,没有刷新的话,管道中就一直没有数据,这时候如果用ReadFile读取管道中的数据则ReadFile被堵塞,于是父进程也被堵塞。目前我还没找到在不修改子进程代码的情况下解决这个问题的办法。只能用不使用缓冲区的输出函数来解决。
但是如果子进程确实没有输出,那么还是有办法防止父进程被堵塞的,就是事先用 GetFileSize 来检查管道文件容量是否为0。还有一个办法是使用异步I/O来完成通信。
ReadFile读取控制:
如果父进程在一个工作流程中,只需要从子进程发回的信息中读取一行的话,则只让ReadFile读取一个字符的数据,直到碰到换行符为止,Windows下文件的换行符为”\r\n”。
预留地
Posted by twcai in Some parts on February 17, 2010
2.16
今晚不想写代码了
想到明天有点小激动
我觉得这段时间的生活差不多应该写个总结了
留块预留地,备明天更新
2.17
代码还是要写,该看的书还是得看
我又向自己证明了YY和现实的差距
总结是需要的,拖个几天是必然的
预留地已用,栽上一颗杯具
p.s. 今天看了全城热恋,故事蛮温馨,学友叔跟刘若英的爱情很欢乐,还是对得起这个票价的。
DropBox
Posted by twcai in Geek Stuff on February 7, 2010

DropBox是一个基于云端的跨平台“同步、存储、分享”的服务,大致内容就是提供一定容量的免费空间(2G-5G+),可以和用户本地的文件夹同步,并提供外链服务。
优点:
1.跨平台:支持Windows、Linux、Mac、iPhone
2.容量:开通2G(通过邀请,最大可达到5G)
3.共享功能:可共享给指定用户,支持外链。
4.同步功能:具体见月光博客的对比,便捷,更智能,带来最实际的好处就是快。
5.强大备份功能:同步文件夹内的每次改变都会被DropBox保存,DropBox官网的Tour把这比喻成时间机器,还放了张很有爱的Back to The Future里的时光车。
如果你点这个链接注册并下载安装DropBox,那么你和我都能增加额外的250M空间。
广告打完了,我来说点闲话:这个服务用起来确实挺快的,不过我文档有Google Docs,图片有Flickr,而且相信Google Drive也就在不久的将来;我现在也只是出于尝尝鲜的心理,而且这个东东确实挺方便的啦,可以随便放点小程序和配置文件什么的。
谁来帮我想个有爱的标题
晚上某人在聊天时公然指责我“戒心太重“,我在蒙受莫须有罪名之余只好自曝高中糗事一则以洗清嫌疑。
话说那时已经是高三了,整个人都被高考的压力弄得神经兮兮。某天英语课,英语老师(80后美女)擦黑板时不小心把板擦掉到地上,遂弯下腰捡。我被板擦落地之声惊吓,猛地脱口而出:“有凶兆!” =_=
接着是全班的缓不过神 & 我在嘴闭上之前就开始后悔 & 英语老师直起腰后稍微有点脸红。结局是全班的爆笑,而我直接趴在桌子上不敢抬头,英语老师还在故作镇定……
某人自称看到我自曝糗事后已内牛满面。
第一次在自己博客上讲冷笑话,其实我也不想被人说古板的。不过糗事不就是要发生在长着一张古板脸孔的人身上才好玩么?真是矛盾啊。
C++学习笔记整理
最近一直在翻Windows核心编程,记笔记时发现以前看C++写的一些东西,决定好好整理下,当作复习。
指针和迭代器:
const_iterator是指向const的对象的迭代器,类似const ctype *ptr,无法通过它给所指的对象赋值。
注意:用iterator访问vector时,vector长度的改变可能使iterator失效; 把const的对象地址赋给一个非const的指针是非法的。
常量指针:
- ctype *const ptr = &val;
- // 下面是另一种用法:
- typedef string *pstring;
- const pstring cstr;
指向多维数组的指针的使用:
- int a[3][5];
- int (*p)[5] = a;
delete函数:
在释放指向数组的指针指向的内存时,不要遗漏方括号。这是内存泄漏的原因之一。
正确做法:delete [] arrayname;
Read the rest of this entry »









