博文

生死MFC程序:MFC 封装(2006-09-24 21:34:00)

摘要:生死MFC程序 (白乔) 关键词  MFC 封装
摘要
正文 MFC将大部分函数都进行了封装,程序员只要改写部分重要的virtual函数即可,这往往使初学者摸不着头脑,连个WinMain函数都看不到,程序从哪开始从哪结束?基本的条理搞不清,永远也不会有提高。下面简单讲下基运行过程. 1,CMyWinApp theApp  程序从这里开始 2,_tWinMain()   在APPMODUL.CPP 它实际上只调用AfxWinMain函数 3,AfxWinMain()   WINAMIN.CPP,去掉一些次要信息,它作的事就是: int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { int nReturnCode = -1; CWinThread* pThread = AfxGetThread(); CWinApp* pApp = AfxGetApp();  ->实际上就是取得CMyWinApp对象指针 AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow) pApp->InitApplication() pThread->InitInstance() pThread->Run(); AfxWinTerm(); return nReturnCode; } 其中: AfxGetApp();   AFXWIN.CPP中 InitApplication()  AFXWIN.CPP中 InitInstance()   AFXWIN.CPP中 实际上AfxWinMainy就是调用: CWinApp::InitApplication 因为我们程序没有改写它 CMyWinApp::InitInstance  我们改写了它且必须改写它,为什么?看源码就能证明一切 BOOL CWinApp::InitIns......

阅读全文(205) | 评论:0

预编译头文件(precompiled header)(2006-09-24 21:31:00)

摘要:预编译头文件 (vcer.net)
正文 今天在改一个很大的程序,慢慢看,慢慢改。突然发现一个.c文件,里面什么也没有, 就几个头文件,我一看,我靠,这不是把简单的问题搞复杂了吗,随手删掉那个c文件。 结果不能编译了,我靠: fatal error C1083: Cannot open precompiled header file: \'Debug/v13_3.pch\': No such file or directory 怎么rebuild all都不行。 上网查了一下,才搞懂了: ----------------总结------ 如果工程很大,头文件很多,而有几个头文件又是经常要用的,那么 1。把这些头文件全部写到一个头文件里面去,比如写到preh.h 2。写一个preh.c,里面只一句话:#include "preh.h" 3。对于preh.c,在project setting里面设置creat precompiled headers,对于其他 .c文件,设置use precompiled header file // 哈哈 我试了一下,效果很明显,不用precompiled header,编译一次我可以去上个厕所,用 precompiled header,编译的时候,我可以站起来伸个懒腰,活动活动就差不多啦 ---------转载的文章---------- 预编译头的概念: 所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是 以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的 C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会 被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编 译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及 时清理那些没有用的预编译头文件。 也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它 只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过 的文件。那么为什么还要预编译头文件呢?答案在......

阅读全文(376) | 评论:0

白乔原创:VC之美化界面篇(2006-09-24 21:23:00)

摘要:   白乔原创:VC之美化界面篇 http://vcer.net/showTip.jsp?tipid=1046595482643 关键词界面美化
摘要 本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理; 2. 熟悉Windows消息机制,熟悉MFC的消息映射和反射机制; 3. 熟悉OOP理论和技术; 本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助。
  正文 1. 美化界面之开题篇 相信使用过《金山毒霸》、《瑞星杀毒》软件的读者应该还记得它们的精美界面:   图1 瑞星杀毒软件的精美界面 程序的功能如何如何强大是一回事,它的用户界面则是另一回事。千万不要忽视程序的用户界面,因为它是给用户最初最直接的印象,丑陋的界面、不友好的风格肯定会影响用户对软件程序的使用。 “受之以鱼,不若授之以渔”,本教程并不会向你推荐《瑞星杀毒软件》精美界面的具体实现,而只是向你推荐一些常用的美化方法。 2. 美化界面之基础篇 美化界面需要先熟悉Windows下的绘图操作,并明白Windows的幕后绘图操作,才能有的放矢,知道哪些可以使用,知道哪些可以避免…… 2.1 Windows下的绘图操作 熟悉DOS的读者可能就知道:DOS下面的图形操作很方便,进入图形模式,整个屏幕就是你的了,你希望在哪画个点,那个地方就会出现一个点,红的、或者黄的,随你的便。你也可以花点时间画个按钮,画个你自己的菜单,等等…… Windows本身就是图形界面,所以Windows下面的绘图操作功能更丰富、简单。要了解Windows下的绘图操作,要实现Windows界面的美化,就必须了解MFC封装的设备环境类和图形对象类。 2.1.1 设备环境类 Windows下的绘图操作说到底就是DC操作。DC(Device Context设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可......

阅读全文(324) | 评论:0

Windows基本的数据类型(2006-09-24 20:49:00)

摘要:Windows基本的数据类型     下面列出较为常用的数据类型,大体包括了字符型、整型、浮点型、布尔型、
指针型以及Windows应用程程特有的句柄型,表示指针型的数据类型往往以P或LP
作为前缀,而句柄型总是冠以H。 类型                    定义
-------------------------------------------------------------
ATOM                    原子(字符串在原子表中的参考值)
BOOL                    布尔型(逻辑型)变量(应为TRUE或FALSE)
BOOLEAN                 布尔型(逻辑型)变量(应为TRUE或FALSE)
BYTE                    字节(8位)
CCHAR                   Windows字符
CHAR......

阅读全文(2347) | 评论:1

多线程:线程同步--使用临界区,使用信号量(2006-09-24 15:17:00)

摘要: 学习多线程之三:线程同步--使用互斥 下载本文配套代码

互斥跟临界区很相似,便远比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。通过CMutex来完成线程间的互质,即:CMutex Mutext;



从而我们可以这样来定义数据对象:#include "afxmt.h" class CDataArray{private:               int iArray[10];    CMutex Mutex;public:    CDataArray(){};    ~CDataArray(){};     void SetData(int iValue);    void GetDataArray(int aArray[10]);}; 成员函数实现如下:void CDataArray::SetData(int iValue){               CSingleLock SingleLock(&Mutex);               SingleLock.Lock();               for (int i=0;i<10;i++)          &......

阅读全文(342) | 评论:0

多线程:线程通信--利用事件对象 线程同步--使用临界区(2006-09-24 14:35:00)

摘要: 学习多线程之一:线程通信--利用事件对象
作者:龚辉斌 下载本文示例代码

在线程之间传送信号可以使用事件对象,用MFC的CEvent来表示。一个事件对象有两种状态:信号态与非信号态。线程能监视于信号态的事件,以便在适当的时间完成对事件的操作。



创建事件的语句如下: CEvent ThreadBegin; 事件被创建后就自动处于非信号态,要使用它处于信息态,必须使用对件对象的成员函数SetEvent(),即: ThreadBegin.SetEvent(); 线程监视这个信号来知道事件已准备就绪,从而可以进行其它的操作。而线程通过调用API函数WaitForSingleObject()来监视这个信号。 ::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE); 该函数的两个参数分别表示要检查的事件句柄与函数等待事件时间。

INFINITE告诉WaitForSingleObject()在特定的事件不处于信号态时不要返回,即把它放在线程的开始的话,那么系统将挂起这个线程,直到事件处于信号态时才继续执行下去。当已经准备好线程继续执行下去的条件时,调用SetEvent(),当线程获得了相应信号态信号后便会继续执行下去。 一旦线程不再被挂起时,它便可以完成相关事务。但若要在主程序中通过线程结束,那么线程必须监视接下来的这个事件,看它是否处于信号态。线程可以通过对事件进行轮询,这时只要调用WaitForSingleObject()即可,只是等待时间参数的值被置为0,即: ::WaitForSingleObject(ThreadBegin.m_hObject,0); 当返回WAIT_OBJECT_0时,表示事件处于信号态,否则处于非信号态。 UINT ThreadProc(LPVOID param) {        ::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE);        ::MessageBox((HWND)param,"Thread Activ......

阅读全文(313) | 评论:0

C54X DSP 的基本知识点(2006-09-24 14:22:00)

摘要:C54X DSP 的基本知识点  1、DSP芯片内部采用改进的哈佛结构,允许同时取指令和取数据,而且还允许在程序空间和数据空间之间相互传送数据。
所谓哈佛结构,是将程序和数据的存贮空间分开,各有各的地址总线和数据总线。这样同一条指令可以同时对不同的存贮空间进行读操作或写操作,从而提高了处理速度。
和哈佛结构相配合的就是流水线操作。如果一条指令仅仅对一个数据空间操作,哈佛结构就失去其存在的意义。而DSP指令又不可避免地需要一些单操作数指令。
所谓流水线操作,就是将各条指令执行过程的几个阶段(取指、译码、取操作数、执行)重迭进行,执行完第一条指令的第一步后,紧接执行该指令的第二步,同时执行下条指令的第一步,使得指令执行加快,使大多数指令都可以在单个指令周期内完成。
2、DSP芯片内部采用多总线结构,´C54X内部有8条16位总线,即1条程序总线,3条数据总线,和4条地址总线。程序总线PB传送取自程序存贮器的指令代码和立即操作数或系数表中的数据;数据总线CB和DB传送读自数据存贮器的操作数;数据总线EB传送写到存贮器的数据;地址总线传送执行指令所需的地址。
3、DSP执行一条指令,需要经过取指、译码、取操作数和执行等几个阶段。由于采用流水线结构,使指令执行的这几个阶段重迭进行。´C54X有一个6级深度的流水线,在任何一个机器周期内,可以有1~6条不同的指令在同时工作,每条指令工作在不同级的流水线上。
4、´C54X可寻址64K字程序空间,64K字数据空间,64K字I/O空间,总共可寻址192K字空间,而´C548和´C549的程序空间可扩展到8M(即8192K)字。
5、´C54X中,内部存贮器的形式有DARAM、SARAM和ROM三种,RAM(包括DARAM和SARAM)总是安排到数据存贮空间,也可以构成程序存贮空间;ROM一般构成程序存贮空间,也可部分地安排到数据存贮空间。所谓双寻址RAM(DARAM)就是每个机器周期内可以进行两次存取操作的RAM存贮器,而单寻址RAM(SARAM)就是每个机器期间内只能进行一次存取操作的RAM存贮器。
6、在处理器工作方式状态寄存器PMST中有3个状态位MP/ 、OVLY和DROM,用来安排´......

阅读全文(512) | 评论:0

用MFC编写多线程程序实例 (2006-09-24 13:56:00)

摘要:用MFC编写多线程程序实例 作者:林俊             线程技术使不同的代码可以同时运行。当然,只有在多C P U的计算机上,多个线程才能够真正地同时运行。然而,由于操作系统把C P U的时间分成很短的片段分配给每个线程,这样给人的感觉好像是多个线程真的同时运行。      线程的概念与1 6位环境中的多任务有很大的不同。或许曾听人们这样讲: Win32是一种抢占式操作系统,而Windows 3.1 是一种协作式的多任务环境。其关键区别在于:在抢占式多任务环境中,操作系统负责管理哪个线程在什么时候执行。如果当线程1暂停执行时,线程2才有机会获得CPU时间,我们说线程1是抢占的。如果某个线程的代码陷入死循环,这并不可怕,操作系统仍会安排时间给其他线程。在Windows 3.1下,程序员必须保证应用程序能够把控制权返还给Windows。如果这一步失败,将导致整个操作环境锁死,或许你已经有过这样的痛苦经历。只要稍微想想便会明白, 16位的Windows是如此脆弱,它依赖于应用程序的运行情况,并且不允许程序陷入死循环或无穷递归以及任何封闭状态。这是因为所有的应用程序都必须协助Windows工作,这种工作类型被称为协作式多任务系统。      在很多情况下,需要采用多线程技术进行程序设计。例如,常用的字处理软件Word,当输入文字的时候,Word同时进行拼写和语法的检验,也就是将文档中的词语与词库中的词语进行比较,并对文档中的语句进行语法分析。这些操作都比较耗费时间,但是我们在使用Word的时候并没有感觉到输入过程有明显的滞后现象。这里Word就采用了多线程技术,其中一个线程接收输入,另一个线程进行拼写和语法的检验。      而对于在VC下编写多线程的程序有多种方法可以直接使用WINDOWS提供的API函数编写,当然最为方便的还是使用MFC编写,今天我们在这里以几个具体的例子来说明一下如何用MFC来编写多线程程序。      一、用户界面线程示例:    ......

阅读全文(3169) | 评论:0

实现Windows 多线程的最简编码(2006-09-24 13:54:00)

摘要:实现Windows 多线程的最简编码 下载:源码 可执行文件     多线程是Windows 开发者不可回避的内容。但是对于初学者,上百行的实例代码是很不容易学习的,而且其中很多无关线程的编码也影响了我们的视线。这里我整理出来一个最简单的实现多线程的代码(这个程序将创建2个新的线程,每个线程都向控制台窗口输出一句话,如果在控制台输入数字“1”就开始线程,其它的输入就暂停线程。): 新建一个Console 工程; 修改stdafx.h 头文件,使之包含下面的内容:
#include <windows.h> //使用多线程必须的 #include <iostream> //这是观看效果用的
using namespace std; 然后是主文件的main 函数的改造: 首先在主文件main 函数的外部声明2个函数,给多线程调用。
DWORD WINAPI MTOne(LPVOID param);
DWORD WINAPI MTTwo(LPVOID param); 线程函数的实现如下:
DWORD WINAPI MTOne(LPVOID param){
  while(true)
  {
    Sleep(1000);
    cout<<"hi! ";
  }
  //一旦返回,这个线程就结束了。
  return 0;
} DWORD WINAPI MTTwo(LPVOID param){
  while(true)
  {
    Sleep(1000);
    cout<<"joy! ";
  }
  return 0;
} 然后在main 函数里......

阅读全文(3261) | 评论:0

用VC++实现多线程的调度和处理(2006-09-24 13:52:00)

摘要:用VC++5.0 实 现 多 线 程 的 调 度 和 处 理
张 万 春 一 多 任 务, 多 进 程 和 多 线 程 ---- Windows95 和WindowsNT 操 作 系 统 支 持 多 任 务 调 度 和 处 理, 基 于 该 功 能 所 提 供 的 多 任 务 空 间, 程 序 员 可 以 完 全 控 制 应 用 程 序 中 每 一 个 片 段 的 运 行, 从 而 编 写 高 效 率 的 应 用 程 序。 ---- 所 谓 多 任 务 通 常 包 括 这 样 两 大 类: 多 进 程 和 多 线 程。 进 程 是 指 在 系 统 中 正 在 运 行 的 一 个 应 用 程 序; 线 程 是 系 统 分 配 处 理 器 时 间 资 源 的 基 本 单 元, 或 者 说 进 程 之 内 独 立 执 行 的 一 个 单 元。 对 于 操 作 系 统 而 言, 其 调 度 单 元 是 线 程。 一 个 进 程 至 少 包 括 一 个 线 程, 通 常 将 该 线 程 称 为 主 线 程。 一 个 进 程 从 主 线 程 的 执 行 开 始 进 而 创 建 一 个 或 多 个 附 加 线 程, 就 是 所 谓 基 于 多 线 程 的 多 任 务。 ---- 开 发 多 线 程 应 用 程 序 可 以 利 用32 位Windows 环 境 提 供 的Win32 API 接 口 函 数, 也 可 以 利 用VC++ 中 提 供 的MFC 类 库 进 行 开 发。 多 线 程 编 程 在 这 两 种 方 式 下 原 理 是 一 样 的, 用 户 可 以 根 据 需 要 选 择 相 应 的 工 具。 本 文 重 点 讲 述 用VC++5.0 提 供 的MFC 类 库 实 现 多 线 程 调 度 与 处 理 的 方 法 以 及 由 线 程 多 任 务 所 引 发 的 同 步 多 任 务 特 征, 最 后 详 细 解 释 一 个 实 现 多 线 程 的 例 程。 二 基 于MFC 的 多 线 程 编 程 ---- 1 MFC 对 多 线 程 的 支 持 ---- MFC 类 库 提 供 了 多 线 程 编 程 支 持, 对 于 用 户 编 程 实 现 来 说 更 加 方 便。 非 常 重 要 的 一 点 就 是, 在 多 窗 口 线 ......

阅读全文(332) | 评论:0