李sir_Blog

博客园 首页 联系 订阅 管理

2011年1月13日

摘要: 简介  线程之间通信的两个基本问题是互斥和同步。  线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。  线程互斥是指对于共享的操作系统资源(指的是广义的"资源",而不是Windows的.res文件,譬如全局变量就是一种共享资源),在各线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。  线程互斥是一种特殊的线程同步。  实际上,互斥和同步对应着线程间通信发生的两种情况:  (1)当有多个线程访问共享资源而 阅读全文
posted @ 2011-01-13 19:17 李sir 阅读(673) 评论(0) 推荐(0)

摘要: 4. MFC线程、消息队列与MFC程序的"生死因果"  分析MFC程序的主线程启动及消息队列处理的过程将有助于我们进一步理解UI线程与消息队列的关系,为此我们需要简单地叙述一下MFC程序的"生死因果"(侯捷:《深入浅出MFC》)。  使用VC++ 6.0的向导完成一个最简单的单文档架构MFC应用程序MFCThread:  (1) 输入MFC EXE工程名MFCThread;  (2) 选择单文档架构,不支持Document/View结构;  (3) ActiveX、3D container等其他选项都选择无。  我们来分析这个工程。下面是产生的核心源代码: MFCThread.h 文件clas 阅读全文
posted @ 2011-01-13 19:12 李sir 阅读(579) 评论(0) 推荐(0)

摘要: 、创建和终止线程  在MFC程序中创建一个线程,宜调用AfxBeginThread函数。该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程。  工作者线程CWinThread *AfxBeginThread( AFX_THREADPROC pfnThreadProc, //控制函数 LPVOID pParam, //传递给控制函数的参数 int nPriority = THREAD_PRIORITY_NORMAL, //线程的优先级 UINT nStackSize = 0, //线程的堆栈大小 DWORD dwCreateFlags = 0, //线程的创建标志 LP 阅读全文
posted @ 2011-01-13 19:01 李sir 阅读(889) 评论(0) 推荐(0)

摘要: 最近,由于需求推动,自己得开始学一下在windows下如何开发驱动程序。 虽然,后来由于其他的原因使得学习没继续下去,但是我还是把一些粗略的学习经历与体会写在这里,方便自己日后卷土重来,也方便其他的对windows开发一窍不通的有志之士参考一下。(一)开发的目的我为什么要学这些知识呢? 原因是想弄远程的硬件控制,用一个简单的例子来说明就是做个软件能使得:我用自己的机子播放音频文件的时候,可在别人的机子上发出声音。一开始的方案是把整个软件划分成3部分:控制端部分、网络部分、受控端部分。 在控制端部分,自己是希望能做成类似total recorder里面的虚拟声卡,播放软件把数据包发给驱动程序后, 阅读全文
posted @ 2011-01-13 18:36 李sir 阅读(1208) 评论(0) 推荐(0)

摘要: 在浅尝boost之timer的post里,我提到boost::timer在linux和windows下的不同表现,并用ACE_OS::gettimeofday做了一个替代方案。不过,为了这个功能把ACE的DLL绑到一起,感觉不是那么愉快。 下面是另一个方案,利用boost::date_time库来解决#includeboost/date_time/posix_time/posix_time.hppclassElapsedTime{public:ElapsedTime():start_time_(boost::posix_time::microsec_clock::local_time()) 阅读全文
posted @ 2011-01-13 18:19 李sir 阅读(583) 评论(0) 推荐(0)

摘要: 我一直是在努力推介boost,因为boost是一块美玉,但,没有什么是完美的。现在,我将暴露出boost的一点瑕疵:boost::timer。虽说是瑕不掩瑜,但瑕疵就是瑕疵。先看一看下面的例子: //win2000中vc7.1编译运行 boost::timert; Sleep(1000); coutt.elapsed()endl; //redhat9中gcc3.2.3编译运行 boost::timert; sleep(1); coutt.elapsed()endl; 他们的结果是一样吗?不同的操作系统,时钟精度是不一样,结果自然不完全一样;但我说的不一样不是这一点小小的差异, 阅读全文
posted @ 2011-01-13 18:18 李sir 阅读(1775) 评论(0) 推荐(0)

摘要: Table11.5.Erase/Replace Algorithm nameDescriptionFunctionsreplace/erase_firstReplace/Erase the first occurrence of a string in the inputreplace_first() replace_first_copy() ireplace_first() ireplace_first_copy() erase_first() erase_first_copy() ierase_first() ierase_first_copy() replace/erase_lastRe 阅读全文
posted @ 2011-01-13 18:17 李sir 阅读(926) 评论(0) 推荐(0)

摘要: Table11.4.Find algorithms Algorithm nameDescriptionFunctionsfind_firstFind the first occurrence of a string in the inputfind_first() ifind_first() find_lastFind the last occurrence of a string in the inputfind_last() ifind_last() find_nthFind the nth (zero-indexed) occurrence of a string in the inpu 阅读全文
posted @ 2011-01-13 18:15 李sir 阅读(1438) 评论(0) 推荐(0)

摘要: Table11.3.PredicatesAlgorithm nameDescriptionFunctionsstarts_withCheck if a string is a prefix of the other onestarts_with()istarts_with() ends_withCheck if a string is a suffix of the other oneends_with()iends_with() containsCheck if a string is contained of the other onecontains()icontains() equal 阅读全文
posted @ 2011-01-13 18:13 李sir 阅读(601) 评论(0) 推荐(0)

摘要: Boost String Algorithms Library 是很有用的一个库,它让C++程序员不用一次又一次的为了字符串的处理制造一些小小的轮子。这里我将逐一用实例详细的说明每一个函数的使用,希望给自己给同道带来方便。 Boost String Algorithms Library 是很有用的一个库,它让C++程序员不用一次又一次的为了字符串的处理制造一些小小的轮子。《浅尝boost之String algorithms library》里我主要介绍了它的Split ,因为这个功能很出彩,其它则一带而过。不过,当多次向朋友推荐这个库后,反馈得到的信息让我觉得详细列出其每一个函数的使用,作为一 阅读全文
posted @ 2011-01-13 17:36 李sir 阅读(589) 评论(0) 推荐(0)

摘要: 很多时候我都想在自已的代码中全部使用std::string代替MS的CString来保证我的程序在未来易于移植,但老实说CString比std::string好用很多,每每还是被诱惑了;再看看C#的string,用起来感觉更好。不过有了这个库 我可以基本抵制住诱惑了... #includeboost/algorithm/string.hpp 很多时候我都想在自已的代码中全部使用std::string代替MS的CString来保证我的程序在未来易于移植,但老实说CString比std::string好用很多,每每还是被诱惑了;再看看C#的string,用起来感觉更好。不过有了这个库我可以基本 阅读全文
posted @ 2011-01-13 17:35 李sir 阅读(477) 评论(0) 推荐(0)

摘要: 虽然网上讨论不少Boost正则表达式的问题,推荐用其他正则库,但是还是用了下。[code]#include list#include boost/lexical_cast.hpp#include boost/regex.hpp //使用正则表达式 #include iostream//#include "../PStringConv/PStringConv.h"#include stringusing namespace std;using namespace boost;regex expression("[垃圾文字]{8}"); //模式int main(int arg 阅读全文
posted @ 2011-01-13 17:33 李sir 阅读(896) 评论(0) 推荐(0)

摘要: 一:编译boost的正则表达式需要编译(如果不需要全部Boost的功能的话,请不要build all boost,那会花掉好几个小时。我推荐仅仅build需要的库就好。)原有的boost 1.33似乎使用vc8编译的时候有问题。下载boost 1.34.1,使用“Visual Studio 2005 Command Prompt”,进入到boost_1_34_1\libs\regex\build:nmake vc8.makOK,生成的文件在vc80下。二:学习正则表达式deelx_zh.rar不错的正则表达式的学习资料,顺便推荐一下:http://www.regexlab.com/ 这个站长还 阅读全文
posted @ 2011-01-13 17:32 李sir 阅读(596) 评论(0) 推荐(0)

摘要: boost::algorithm学习#include boost/algorithm/string.hppusing namespace std;using namespace boost; 一:大小写转换1 to_upper() 将字符串转为大写Example:string str1(" hello world! ");to_upper(str1); // str1 == " HELLO WORLD! "2 to_upper_copy() 将字符串转为大写,并且赋值给另一个字符串Example:string str1(" hello world! ");string str2;str2 阅读全文
posted @ 2011-01-13 17:30 李sir 阅读(802) 评论(0) 推荐(0)

摘要: 一 Boost::bind 在STL中,我们经常需要使用bind1st,bind2st函数绑定器和fun_ptr,mem_fun等函数适配器,这些函数绑定器和函数适配器使用起来比较麻烦,需要根据是全局函数还是类的成员函数,是一个参数还是多个参数等做出不同的选择,而且有些情况使用STL提供的不能满足要求,所以如果可以我们最好使用boost提供的bind,它提供了统一的接口,提供了更多的支持,比如说它增加了shared_ptr,虚函数,类成员的绑定。 二 源码剖析1) bind1st,bind2st函数绑定器,把二元函数对象变为一元函数对象。2) mem_fun,把成员函数变为函数对象。3) f 阅读全文
posted @ 2011-01-13 17:01 李sir 阅读(2496) 评论(0) 推荐(0)

摘要: 一 Boost::array 在以前,如果我们要处理一组数据,我们可能使用一般数组存储,或者需要许多的对数组的数据的操作的时候,我们使用STL容器存储。但是如果我们的需求是,我们能够提前固定一组数据的大小,或提前知道这组数据的大小,但是我们又想这组数据进行一些操作,比如排序。。。显然对这个情况,上面的使用原始数组或STL容器都有点不太合适,因为原始的数组显得笨重,的我们自己实现一些重复的功能,但是如果是使用STL容器的话,有可能会导致空间和性能的下降。 基于上面的情况,所以在Boost中引入Boost::array,也可能会被加入下一代的C++标准中。Boost::array,内部仍然是固 阅读全文
posted @ 2011-01-13 17:00 李sir 阅读(1002) 评论(0) 推荐(0)

摘要: 一 Boost::smart_Ptr 我们学习C++都知道智能指针,例如STL中的std::auto_ptr,但是为什么要使用智能指针,使用它能带给我们什么好处呢?最简单的使用智能指针可以不会因为忘记delete指针而造成内存泄露。还有如果我们开发或者使用第三方的lib中的某些函数需要返回指针,这样的返回的指针被client使用的时候,lib就会失去对返回的指针的控制,这样delete的指针的任务一般就会交给调用方client,但是如果client忘记调用delete或是调用的时机不正确,都有可能导致问题,在这种情况下就最好使用智能指针。还有使用智能指针可以保证异常安全,保证程序在有异常抛出 阅读全文
posted @ 2011-01-13 16:53 李sir 阅读(946) 评论(0) 推荐(0)

摘要: Boost::tuple就为我们提供了一种类似于匿名struct的方法为我们解决函数的多个返回值的问题。既增强了代码的可读性有不增加代码量。其实在STL中已经有这样的特例,std::pair其实就是boost::tuple的2个参数的特例 一 Boost::tuple 很多的时候我们经常需要为我们的函数返回多个值,一般的做法是通过传入非常量的指针或引用,但是这样的话可能可读性就要差一些,使用者可能需要确切的文档才能确定到底哪个是返回值,为了更好的可读性,我们可以使用class或struct来封装我们要返回的多个值,然后返回封装struct或class,但是使用这种方法的弊端就是增加的程序的代 阅读全文
posted @ 2011-01-13 16:47 李sir 阅读(1098) 评论(0) 推荐(0)

摘要: 在boost中有boost::Any为我们提供了类似java或.net中的object类型,boost::Any能够代表任意类型,实现任意类型的类型安全存储以及安全的取回,常用在将不同类型的对象存储在标准容器中一 Boost::Any 很多时候我们想有一种可以代表任何类型的类型,比如像纯面向对象语言java或.net中的Object类型,但是对于C++本身并没有这样一个基类,所以我们如果要解决这类问题,首先我们考虑的是使用基类的指针,这能够解决以部分问题,但是更多的我们可以求助于void*,使用void*的缺点就是丢失了类型信息和缺乏类型安全。 幸好的是在boost中有boost::Any为我 阅读全文
posted @ 2011-01-13 16:29 李sir 阅读(929) 评论(0) 推荐(0)

摘要: Boost带领你远远地超越了C++标准库,它使得C++编程更优雅、更有活力、更高产。唯一的关于boost的book:Beyond the C++ Standard Library: An Introduction to Boost... 一 BOOSTBoost带领你远远地超越了C++标准库,它使得C++编程更优雅、更有活力、更高产。(引自:Beyond the C++ Standard Library: An Introduction to Boost)(慢慢体会哦!)二 参考主要:boost的在线document:http://boost.org/libs/libraries.htm唯一的 阅读全文
posted @ 2011-01-13 16:22 李sir 阅读(837) 评论(0) 推荐(0)

摘要: //return CDialog::OnEraseBkgnd(pDC);return TRUE;}接下来是在WM_PAINT的消息处理函数OnPaint()中添加代码。由于当背景位图比较大时,进行区域处理比较耗时,所以只在启动时进行一次处理。一种方法是OnInitDialog()处理,但这样会在从启动程序到窗口出现有相当的延迟,易引起程序尚未启动的误解。再一种方法就是在OnPaint()处理,但为了避免重复处理,可以加上一个判断标志。以下是OnPaint()的代码,正体为AppWizard生成,粗体为自己添加内容。void CTransDlg::OnPaint() {if (IsIconic( 阅读全文
posted @ 2011-01-13 13:53 李sir 阅读(940) 评论(0) 推荐(0)

摘要: 随着Microsoft凭借Windows在操作系统上取得的巨大成绩,Windows用户界面也日益成为业界标准。统一的界面给广大用户对应用软件的学习与使用带来了很大方便。但每天都面对同一副面孔,日久天长难免会产生一些厌倦,开发一些“离经叛道”,一改Windows应用程序千篇一律的“标准”界面,一定会给你带来一种清新的感觉。标准Windows应用程序窗口一般为带有标题栏的浅灰色矩形外观,因而“异形”对话框/窗口也主要是颜色与外形上动手脚。1:改变背景颜色 改变对话框(窗口)的背景颜色是最简单的改变Windows应用程序外观的方法,根据Windows创建与管理机理,一般有两种方法。一种是处理WM_C 阅读全文
posted @ 2011-01-13 13:51 李sir 阅读(1073) 评论(0) 推荐(0)