DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

2013年11月21日

摘要: 工作线程,在一些技术文章被称为辅助线程,是相对于主线程而言的。在工作线程中使用界面需要一些技巧。我就曾在工程线程中弹出对话框中遇到过莫名奇妙的错误。下面就我的经验谈谈如何从工作线程中弹出对话框(暂时只讲方法,原理还没彻底弄清楚)。实际上在工作线程中直接弹出模式对话框中在debug模式下有时出错(这里的有时的意思是必然会出错,但是不是每次都出错),弹出模式对话框的代码如下:DWORDWINAPIRecvThread(LPVOIDlpParam)//工作线程函数{CAIDlgProductNamedlg;if(dlg.DoModal()==IDOK){……}}错误截图:如果跟踪DoModal函数, 阅读全文
posted @ 2013-11-21 11:04 DoubleLi 阅读(1388) 评论(0) 推荐(0)

摘要: 信息来源:csdn C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证了这句话。在 C/C++ 应用程序开发过程中,动态分配的内存处理不当是最常见的问题。其中,最难捉摸也最难检测的错误之一就是内存泄漏,即未能正确释放以前分配的内存的错误。偶尔发生的少量内存泄漏可能不会引起我们的注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种 各样的征兆:从性能不良(并且逐渐降低)到内存完全耗尽。更糟的是,泄漏的程序可能会用掉太多内存,导致另外一个程序垮掉,而使用户无从查找问题的真正根源。此外,即使 阅读全文
posted @ 2013-11-21 11:02 DoubleLi 阅读(474) 评论(0) 推荐(0)

摘要: 声明:本文章是我整合网上的资料而成的,其中的大部分文字不是我所为的,我所起的作用只是归纳整理并添加我的一些看法。非常感谢引用到的文字的作者的辛勤劳动,所参考的文献在文章最后我已一一列出。对关注性能的程序开发人员而言,一个好的计时部件既是益友,也是良师。计时器既可以作为程序组件帮助程序员精确的控制程序进程,又是一件有力的调试武器,在有经验的程序员手里可以尽快的确定程序的性能瓶颈,或者对不同的算法作出有说服力的性能比较。在Windows平台下,常用的计时器有两种,一种是timeGetTime多媒体计时器,它可以提供毫秒级的计时。但这个精度对很多应用场合而言还是太粗糙了。另一种是QueryPerf. 阅读全文
posted @ 2013-11-21 11:01 DoubleLi 阅读(1656) 评论(0) 推荐(0)

摘要: 晚上编一个小程序,涉及到如何设置对话框的背景颜色和静态文本颜色。这在VC6.0中本来是一句话就搞定的事。在应用程序类中的InitInstance()函数添加: //设置对话框背景和文本颜色SetDialogBkColor(RGB(160,180,220),RGB(0,0,0));谁知这在VS 2005上竟不起作用,到网上一查,原来SetDialogBkColor函数在VS 2003中就已经不支持了。只得另辟蹊径。另外的办法就是响应WM_CTLCOLOR消息,在消息映射函数中添加:[cpp]view plaincopy HBRUSHCFileSpltDlg::OnCtlColor(CDC*pDC 阅读全文
posted @ 2013-11-21 10:58 DoubleLi 阅读(3272) 评论(0) 推荐(1)

摘要: 在很多系统中出于美观的需要常常要设置背景图片。下面我介绍一种在客户区设置背景图片的简单方法。1.将背景bmp图片导入到工程,资源ID这里假设为IDB_BITMAP12.在视图类添加如下代码:[cpp]view plaincopy voidCSetBkMapView::OnDraw(CDC*pDC){CSetBkMapDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(!pDoc)return;//TODO:在此处为本机数据添加绘制代码//获取客户区大小CRectrcClient;GetClientRect(&rcClient);CBitmapbmp 阅读全文
posted @ 2013-11-21 10:56 DoubleLi 阅读(647) 评论(0) 推荐(0)

摘要: 开发时有一个工程的一个文件的断点无效,VS 2005提示说当前不会命中断点。源代码与原始版本不同,请在断点选项里设置允许源代码与原始版本不同。这个是针对单个断点进行设置。如果要对所有的断点进行设置,则要在“工具”——〉“选项”——〉“调试”——〉“要求源文件与原始版本完成匹配”去掉勾。 实际上有比这个办法更好的办法,就是将出问题的文件用notepad打开,然后另存为Unicode编码,覆盖原来的文件。 网上另外有一种办法是:通过重新格式化出问题的源文件亦可以解决,即在VS2005中选择 “编辑”——〉“高级”——〉“设置选定内容的格式”。 阅读全文
posted @ 2013-11-21 10:54 DoubleLi 阅读(910) 评论(0) 推荐(0)

摘要: 以前看《Window核心编程》,感觉多字节和宽字节之间还比较麻烦的,至少MultiByteToWideChar函数和WideCharToMultiByte函数有足够多的参数的意义让我们去理解。近日接触了ATL的一个很好的字符串的转换宏:A2W和W2A。用法很简单,A2W的用法:[cpp]view plaincopy #includeDoSomething(LPWSTRstr);//函数声明USES_CONVERSION;DoSomething(A2W("SomeString"));W2A的用法:[cpp]view plaincopy #includeDoSomething( 阅读全文
posted @ 2013-11-21 10:53 DoubleLi 阅读(959) 评论(0) 推荐(0)

摘要: 转载地址:http://www.cnblogs.com/chio/archive/2008/08/05/1261296.html目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称"静态库"),另一种为动态连接库(DLL,以下简称"动态库")的导入库(Import Libary,以下简称"导入库")。静态库是一个或者多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确的找到是哪个obj有错,即静态lib只是壳子。动态 阅读全文
posted @ 2013-11-21 10:49 DoubleLi 阅读(451) 评论(0) 推荐(0)

摘要: DLL的动态链接有两种方法。一种是加载时动态链接(Load_time dynamic linking)。Windows搜索要装入的DLL时,按以下顺序:应用程序所在目录→当前目录→Windows SYSTEM目录→Windows目录→PATH环境变量指定的路径。 前天看到这几句,突然设计出一道自认绝妙的笔试题:"如果采用加载时动态链接的方式,Windows搜索要装入的DLL采用怎样的顺序?"这个是基础题,估计你很容易答出(答案就是上面的)。呵呵,我还有后着呢:"你是如何证明Windows搜索要装入的DLL遵循这样的顺序呢,说出你的证明步骤" 你可以思考一 阅读全文
posted @ 2013-11-21 10:47 DoubleLi 阅读(842) 评论(0) 推荐(0)

摘要: 本文阅读基础:有一定的C++基础知识(了解继承、回调函数),对MFC的消息机制有一定了解,对COM的基础知识有一定了解,对ActiveX控件有一定了解。一. 前言 ActiveX控件和它的容器程序如何通讯是一个值得研究的问题,因为这涉及到ActiveX控件和它的容器程序如何交互的问题。VC知识库的杨老师写了一系列博客介绍了一些通讯方式。链接如下:COM 组件设计与应用(十三)--事件和通知(VC6.0)COM 组件设计与应用(十四)--事件和通知(vc.net)COM 组件设计与应用(十五)--事件和通知(VC6.0)COM 组件设计与应用(十六)--事件和通知(vc.net) 这些文章写得真 阅读全文
posted @ 2013-11-21 10:44 DoubleLi 阅读(2748) 评论(0) 推荐(0)

摘要: 使用VS 2008新建一个MFC ActiveX工程,因为在工程里要用到GDI+。我习惯把初始化GDI+库的代码放在应用程序类的InitInstance函数,对应的销毁代码放在ExitInstance函数。具体如下:先在应用程序类里定义一个数据成员:[cpp]view plaincopy ULONG_PTRm_gdiplusToken;然后添加初始化GDI+库的代码和对应的销毁代码:[cpp]view plaincopy BOOLCImagePreviewXApp::InitInstance(){BOOLbInit=COleControlModule::InitInstance();if(bI 阅读全文
posted @ 2013-11-21 10:41 DoubleLi 阅读(1404) 评论(0) 推荐(0)

摘要: 1、不同线程的处理方法如何在2K/xp下使窗口获取焦点在2K/XP下我们可以用 AttachThreadInput 和SetForegroundWindow来有效的获取焦点。//捕捉并设置当前焦点窗口为我们的窗口AttachThreadInput( GetWindowThreadProcessId( ::GetForegroundWindow(),NULL), GetCurrentThreadId(),TRUE);//置我们的为焦点窗口SetForegroundWindow();SetFocus(); //释放threadAttachThreadInput( G... 阅读全文
posted @ 2013-11-21 10:36 DoubleLi 阅读(962) 评论(0) 推荐(0)

摘要: 转载地址:http://www.cnitblog.com/martin/archive/2006/04/21/9460.html 首先,应该是MFC报告我们发现内存泄漏。注意:要多运行几次,以确定输出的内容不变,特别是{}之间的数值,不能变,否则下面的方法就不好用了。我们来看看:F:/CodeSample/Test/TestPipe/LeakTest/MainFrm.cpp(54):{86}normalblockat0x00422E80,10byteslong.Data:1F1F1F1F1FCDCDCDCDCDF:/CodeSample/Test/TestPipe/LeakTest/MainF 阅读全文
posted @ 2013-11-21 10:34 DoubleLi 阅读(1475) 评论(0) 推荐(0)

摘要: 基于文档视图结构程序的双缓冲绘图框架比较多,那么如何在对话框上绘图呢?以前通常的做法是拖一个静态文本控件或其它控件当作绘图区域或者在这个区域上创建一个视图出来。看了微软的一个示例程序DrawCli(一个绘图的单文档程序),产生了一些灵感,决心把它移植到对话框绘图上,摸索了一下,搞了一个基于对话框的简单双缓冲绘图框架。 具体代码如下,对话框头文件代码:[cpp]view plaincopy #include//@brief直线结构体structstLine{stLine(CPoint&Begin,CPoint&End){m_Begin=Begin;m_End=End;}//@br 阅读全文
posted @ 2013-11-21 10:32 DoubleLi 阅读(758) 评论(0) 推荐(0)

摘要: MFCGrid control是一款非常优秀的网格控件,支持非常丰富的界面元素,如下图:因而在数据库程序及报表程序应用较为广泛,其源码可以在下面下载到:MFC Grid control2.27源码下载 MFC Gridcontrol的作者并没有将其封装为DLL,因为在程序的多个模块复用这个控件比较麻烦(需要在多个工程中加入其源码),因此最好将其封装为一个DLL。今天有同事反映在DLL的对话框中无法使用封装好的MFC Grid control,于是上网查了下资料,晚上摸索了一下,解决了这个问题。 MFC Grid control的作者在设计该控件并没考虑到在DLL中使用该控件,因此在其控件类CG 阅读全文
posted @ 2013-11-21 10:29 DoubleLi 阅读(613) 评论(0) 推荐(0)

摘要: 一般而言,在 Windows编程中创建对话框需要先定义一个对话框资源。我想能不能不用资源文件单纯通过代码创建对话框呢?晚上搜索了一些资料,研究了一下,基本实现了。我写了一个KDialog,代码如下(代码中有一些注释,相信大家能基本看懂):头文件的代码:[cpp]view plaincopy //kdialog.h#ifndefKDIALOG_H_INCLUDED#defineKDIALOG_H_INCLUDED#defineID_HELP150#defineID_EDIT180#defineID_TEXT200classKDialog{public:KDialog(HINSTANCEhinst 阅读全文
posted @ 2013-11-21 10:28 DoubleLi 阅读(903) 评论(0) 推荐(0)

摘要: 最近需要一个浮点数编辑框。所谓浮点数编辑框,就是限制输入只在”-1234567890.” 这些字符,其它字符不予输入(用户输错了冒一个气泡进行提示)。本想使用BCG库的CBCGPMaskEdit类,无奈该类允许重复输入小数点,不满足我的需求。于是上网搜了一个,发现是基于VS2010的。VS 2010的编辑框已经实现了自动冒泡提示了。但是我的工程是VS 2005的。于是我设法在VS 2005实现编辑框的冒泡提示。实际上这个也不难,主要是使用Edit_ShowBalloonTip宏。下面是编辑框的主体代码:[cpp]view plaincopy BEGIN_MESSAGE_MAP(CMyFloat 阅读全文
posted @ 2013-11-21 10:22 DoubleLi 阅读(955) 评论(0) 推荐(0)

摘要: 在CodeProject上找到一个动态调整对话框窗口大小的窗口类的资源:Dynamicchild window positioning,我感觉挺好用的。窗口基类是:cdxCDynamicWnd, cdxCDynamicWndEx。假如链接无效之后可以搜下这个。 阅读全文
posted @ 2013-11-21 10:20 DoubleLi 阅读(300) 评论(0) 推荐(0)

摘要: 根据我的实践,在Windows平台下设计并实现一个C++插件系统,需要解决几个关键技术问题。下面我谈谈需要解决的几个关键技术问题以及我想到的简单的解决思路。由于我主要专注于Windows平台C++程序的开发,这里假设以VS为编译环境,MFC界面库来说明。1. 主程序和插件的关系问题 插件架构一般可以用下面的图来表示:(注:此图来自李先静的博客文章:http://blog.csdn.net/absurd/archive/2006/07/04/877063.aspx,略有修改,特向李大侠表示感谢) 一般来说:应用程序框架所完成的功能应为一个软件系统的核心和基础,这些基本功能主要包括一些核心功能,即 阅读全文
posted @ 2013-11-21 10:17 DoubleLi 阅读(1793) 评论(0) 推荐(0)

摘要: C++编写的桌面软件中传统的App+Dll的架构已经显现出的模块之间的强耦合、维护性差、升级不方便等诸多弊端,为此我进行了一些思考,有兴趣的朋友请看我以前的一个思考片断:《Windows平台下C++插件系统实现的几个关键技术问题及其解决思路》,今天则具体介绍的我的一个具体设计和实现。 我的目标是要去除功能模块的相互依赖,在模块调用必须采用动态加载的办法,但同时各个模块可以进行自由地进行通讯。我的设想大致是这样的:在动态加载各个模块后调用统一接口后生成插件对象,在某个插件对象都能通过标识符找到其它的插件对象,通过统一的接口将数据传给它们。系统架构图如下:系统流程图如下: 大家可以看到,要构建这样 阅读全文
posted @ 2013-11-21 10:16 DoubleLi 阅读(919) 评论(0) 推荐(0)

摘要: 一.《Google C++ 编程风格指南》里的观点 公司在推行编码规范,领导提议基本上使用《Google C++ 编程风格指南》。其中《Google C++ 编程风格指南》对于头文件的包含顺序是这样的:Names and Order of Includeslink ▽Use standard order for readability and to avoid hidden dependencies:C library, C++ library, other libraries' .h, your project's .h.All of a project's head 阅读全文
posted @ 2013-11-21 10:12 DoubleLi 阅读(882) 评论(0) 推荐(0)

摘要: 在VC中访问Oracle,可以使用ADO或ODBC,如果你比较强大,也可以直接使用OCI API,但我个人认为OTL是最佳选择,它是一套数据库访问C++模板库,全部代码都在otlv4.h头文件中,通过OTL不但可以访问Oracle数据库(使用OCI API),还可以访问DB2,或者使用ODBC连接字符串访问其他数据库。 otl的源码只有一个头文件——otlv4.h。下面以一个例子来说明如何使用otl。[cpp]view plaincopy #defineOTL_ORA10G#includevoidCAboutDlg::OnBnClickedOk(){//TODO:在此添加控件通知处理程序代码o 阅读全文
posted @ 2013-11-21 10:10 DoubleLi 阅读(1466) 评论(0) 推荐(0)

摘要: C++中防止头文件被多次include 的常见方式有:1) 用#ifndef ... #define ... #endif 宏#ifndef __MYHEADER_H__#define __MYHEADER_H__// Here is my class ...#endif2) 用 #pragma once#pragma once// Here is my class ...建议使用 #pragma once ,原因:1) 代码简洁,维护性比较好。 #pragma once 显然比 #ifndef ... 要简短许多,而且避免了__MYHEADER_H__ 重定义 或者 #endif 包含范围错 阅读全文
posted @ 2013-11-21 10:03 DoubleLi 阅读(383) 评论(0) 推荐(0)

摘要: 开发DLL的时候,需要十分注意 DllMain 函数,因为在多线程环境下DLLMain里面的代码很容易引发线程死锁。 这篇MSDN文章《Best Practices for Creating DLLs》深入讨论了开发DLL的时候应该注意哪些事项, 非常推荐。简单来说,系统在装载DLL 的时候会自动产生一个Loader Lock, 避免多个DLL同时被装载。 LoaderLock从API函数LoadLibrary调用的开始就自动加锁, 直到DllMain 退出为止。 常见到一些开发者喜欢在DllMain 里面写大量的初始化代码(比如 CoInitializeEx, LoadLibraryEx,C 阅读全文
posted @ 2013-11-21 10:02 DoubleLi 阅读(453) 评论(0) 推荐(0)

摘要: 在一些情况下(比如屏幕软键盘或者输入法程序),自己的窗口没有输入焦点但是想要当前焦点窗口的键盘输入消息,可以使用Win32 API函数AttachThreadInput()来解决这个问题。AttachThreadInput把一个线程(idAttach)的输入消息连接到另外线程(idAttachTo)。函数定义:BOOL WINAPI AttachThreadInput( __in DWORD idAttach, __in DWORD idAttachTo, __in BOOL fAttach);用法示例:AttachThreadInput( ::GetWindowThreadProcessId 阅读全文
posted @ 2013-11-21 09:58 DoubleLi 阅读(472) 评论(0) 推荐(0)

摘要: --克服用例图的恐惧在实际工作中,大部分程序员很少接触到需求分析,即使有需求分析,也是草草了事,没有用正规的方式来表达,所以一般程序员使用用例图的机会是不多的。但是却又常常在各种媒体上看见用例图,于是对一种常常出现,自己又不太熟悉的技术,会产生恐惧。如果说对MDA或者CORBA这样的技术产生恐惧还是值得的话,对用例图产生恐惧是非常不值的。因为MDA和CORBA这样的技术也许要花上半年的时间才能够初步了解,而克服用例图恐惧症,则只要不到一天的时间。用例图初感UML是一组图示符号的标准。所谓图示符号,就是一组定义好的图示,它们可以表达定义好的各种意思。用UML进行软件建模,就是用规定好的符号画图, 阅读全文
posted @ 2013-11-21 09:49 DoubleLi 阅读(1479) 评论(0) 推荐(1)

摘要: 例子代码就在我的博客中,包括六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具工程,和此小工具的所有运行时库、资源和执行程序。代码的压缩包位置是http://www.blogjava.net/Files/wxb_nudt/socket_src.rar。1前言在一些常用的编程技术中,Socket网络编程可以说是最简单的一种。而且Socket编程需要的基础知识很少,适合初学者学习网络编程。目前支持网络传输的技术、语言和工具繁多,但是大部分都是基于Socket开发的,虽说这些“高级”的网络技术屏蔽了大部分底层实现,号称能极大程度的简化开发,而事实上如果你没有一点Socket基础 阅读全文
posted @ 2013-11-21 09:46 DoubleLi 阅读(1731) 评论(0) 推荐(0)

摘要: 在工程计算相关项目中,常常利用Matlab来完成计算、算法、绘图等功能。使用Matlab来完成这些功能非常简单,Matlab提供的m编程语言功能强大,代码量少。为了在自己的C/C++项目中加入这些功能,需要一系列繁琐的过程,令很多人望之却步。主要的困难在于:l如何从m文件生成VC可用的C/C++代码;l如何设置编译参数,在VC中编译这些代码;l如何在C/C++语言中设置输入输出参数,使之与M代码生成的C++代码一同运行;l如何制作包含matlab运行时库的安装程序。下面结合网络上面的资料,对以上问题进行了总结,较好的解决了上面的问题。我使用的相关开发环境如下:Matlaba6.5;VC6;Wi 阅读全文
posted @ 2013-11-21 09:41 DoubleLi 阅读(5749) 评论(0) 推荐(1)

摘要: 关于结构体和C++类的内存地址问题今天终于有时间写点东西了~ 太爽了 *_*很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的。下面我们以类来说明问题,如果类的问题通了,结构体也也就没问题啦。类分为成员变量和成员函数,我们先来讨论成员变量。一个类对象的地址就是类所包含的这一片内存空间的首地址,这个首地址也就对应具体某一个成员变量的地址。(在定义类对象的同时这些成员变量也就被定义了)我们来以一段代码说明问题://类的定义class K{public:K(){k = 12;}~K(){}int k;};//类的使用//...K kTem 阅读全文
posted @ 2013-11-21 09:11 DoubleLi 阅读(1505) 评论(0) 推荐(0)

摘要: 动态内存使用最多的是在C++应用程序的代码中。有过编程经验的程序员虽然都知道new操作符的使用一定要与delete匹配,在某些场合仍然可能有内存溢出。当异常被掷出时,程序的正常控制流程被改变,因此导致潜在的内存溢出。例如,void g() //可能掷出{ if (some_condition == false) throw X();}void func() { string * pstr = new string; g(); //如果 g 掷出一个异常,内存溢出 delete pstr; //如果 g 掷出一个异常,则此行为不能达到的代码行。}int main... 阅读全文
posted @ 2013-11-21 09:10 DoubleLi 阅读(684) 评论(0) 推荐(0)

摘要: 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。其格式一般为: #pragma Para。其中Para 为参数,下面来看一些常用的参数1.message 参数 Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为: #pragma message(“消息文本”) 当编译器遇到这... 阅读全文
posted @ 2013-11-21 09:08 DoubleLi 阅读(407) 评论(0) 推荐(0)

摘要: 下面的代码是介绍如何在windows平台发消息到非UI线程.主要是'PeekMessage||GetMessage'这两个API的应用.当他们被调用的时候,如果当前线程还没有消息循环,就会创建一个.利用这个特性比自己手动的去创建一个消息循环要方便得多.发消息主要是使用线程PostThreadMessage#include#include#include"cassert"#include"windows.h"#include"process.h"enum{MSG_TEST=WM_USER+100,MSG_EXIT};un 阅读全文
posted @ 2013-11-21 09:05 DoubleLi 阅读(490) 评论(0) 推荐(0)

摘要: .\\与API函数GetModuleFileName获取应用程序目录有何不一样? 采用.\\也能获得应用程序目录,采用GetModuleFileName也能获得,二者有何不同? 一样!一个是相对路径,一个是绝对路径 .\\是的到应用程序的当前目录,但当前目录不一定等于应用程序执行文件的所在目录,一个应用程序被启动时,当前目录是可以被任意设置的。GetModuleFileName()得到模块的完整路径名,例如,你载入c:\windows\system32\a.dll,得到模块句柄h,则你可以用GetModuleFileName()得到h模块的完整路径名。 .\\一般用在包含头文件的语句中。另一个 阅读全文
posted @ 2013-11-21 09:03 DoubleLi 阅读(3927) 评论(0) 推荐(0)

摘要: 一.深入浅出Win32多线程程序设计之基本概念[转]引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。 理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易。许多程序员从来没有学习过嵌入式系统领域著名的操作系统VxWorks,但是立马就能在上面做开发,大概要归功于平时在Win32多线程上下的功夫。 因此, 阅读全文
posted @ 2013-11-21 09:02 DoubleLi 阅读(1036) 评论(0) 推荐(0)

摘要: 下载源代码八、线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误;又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过。 使隶属于同一进程的各线程协调一致地工作称为线程的同步。MFC提供了多种同步对象,下面我们只介绍最常用的四种.. 阅读全文
posted @ 2013-11-21 09:01 DoubleLi 阅读(459) 评论(0) 推荐(0)

摘要: 掌握文本文件读写的方法了解二进制文件的读写方法C++文件流:fstream // 文件流ifstream // 输入文件流ofstream // 输出文件流//创建一个文本文件并写入信息//同向屏幕上输出信息一样将信息输出至文件#include#includevoid main(){ ofstream f1("d:\\me.txt"); //打开文件用于写,若文件不存在就创建它 if(!f1)return; //打开文件失败则结束运行 f1>运算符 只能进行文本文件的读写操作,用于二进制文件可能会产生错误。 使用函数成员 get、... 阅读全文
posted @ 2013-11-21 09:00 DoubleLi 阅读(388) 评论(0) 推荐(0)

摘要: 下载源代码一、问题的提出编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleThread,在主对话框IDD_SINGLETHREAD_DIALOG添加一个按钮,ID为IDC_SLEEP_SIX_SECOND,标题为“延时6秒”,添加按钮的响应函数,代码如下:void CSingleThreadDlg::OnSleepSixSecond() { Sleep(6000); //延时6秒} 编译并运行应用程序,单击“延时6秒”按钮,你就会发现在这6秒期间程序就象“死机”一样,不在响应其它消息。为了更好地处理这种耗时的操作,我们有必要学习——多线程编程。 二、多线程概述 进程和线... 阅读全文
posted @ 2013-11-21 08:59 DoubleLi 阅读(615) 评论(0) 推荐(0)

摘要: 下载源代码五、MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。 工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务。 在MFC中,一般用全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用... 阅读全文
posted @ 2013-11-21 08:57 DoubleLi 阅读(569) 评论(0) 推荐(0)

摘要: 下载源代码七、线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明。使用全局变量进行通信由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。对于标准类型的全局变量,我们建议使用volatile 修饰符,它告诉编译器无需对该变量作任何的优化,即无需将它放到一个寄存器中,并且该值可被外部改变。如果线程间所需传递的信息较复杂,我们可以定义一个结构,通过传.. 阅读全文
posted @ 2013-11-21 08:55 DoubleLi 阅读(634) 评论(0) 推荐(0)