深入浅出MFC学习笔记(二)

系统空闲时间处理 OnIdle
所谓的空闲时间是指"系统中没有任何消息等待处理"的时间,

//只需要改消息循环为这个样子
while(true)
{
    if (PeekMessage( &msg, NULL, NULL, PM_REMOVE))
    {
        if (msg.message == WM_QUIT)
            break;

        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    else
    {
        OnIdle();
    }
}

//在消息队列中没有消息时的下次循环中,GetMessage会过门而不入,而
//PeekMessage则会取回自己的控制时间


对话框的运行
两类 modal的(模态对话框), modeless的(非模态)对话框
常用的模态对话框需要准备两样东西
1.对话框模板(dialog template)
简单的说就是在VC资源编辑器里面画的那个东西
2.对话框过程(dialog procedure)
类似于窗口函数,但是只处理WM_INITDIALOG和WM_COMMAND两则消息,对话框中各个控件也是窗口,他们以消息与其父窗口,即对话框沟通,所有控件传来的消息也都是WM_COMMAND, 由其参数来分辨是那一种控件及那一种通知消息(notification);

模块定义文件
定义了模块名称, 程序段, 数据段的内存特性, 模块堆(heap)的大小, 模块栈(stack)的大小, 所有的callback函数名称的登记等

Console执行文件
Console并不是一定工作于V86模式的, Console程序仍然是所谓的PE格式 即(Portable Excutable)而非DOS下的工作的MZ格式.

线程与进程(Thread and Process)
在Windows中, 线程是cpu的调度单位, 而进程则是一种组织管理程序形成的数据结构

核心对象,核心对象是系统的一种资源,系统对象一旦产生, 任何应用程序都可以开启并使用改对象, 系统给与核心对象一个计数值(usage count)作为管理计数只用.

核心对象每被产生一次都会获得一个handle作为标志,每被使用一次,其计数值加1,核心对象的结束只需要调用CloseHandle即可.


进程的诞生和死亡
首先shell调用CreateProcess 激活App.exe
然后系统产生一个核心对象
系统为核心对象分配一个4GB的内存空间
加载必要的代码,包括程序代码,包括程序的代码, 在程序执行文件的.idata节中提到调用的dll
系统为此进程建立一个主线程,线程是CPU的时间分配对象
系统调用C runtime函数库的startup code
startup code调用winmain函数
app开始运行

当关闭主窗口时
winmain消息循环结束, winmain结束
返回startup code
回到系统, 系统调用ExitProcess结束进程( 尚未能验证, 感觉不对);

 产生子进程使用CreateProcess函数
其形式如下
BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName, //可执行文件名字
  __inout_opt  LPTSTR lpCommandLine, //新进程的命令行
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,// 安全属性及是否被继承
  __in         DWORD dwCreationFlags,//许多常数的组合,影响进程的创建
  __in_opt     LPVOID lpEnvironment,//环境变量,为NULL则继承父进程的
  __in_opt     LPCTSTR lpCurrentDirectory,//当前子进程的工作目录与驱动器
  __in         LPSTARTUPINFO lpStartupInfo,//一个指向StartupInfo的指针
  __out        LPPROCESS_INFORMATION lpProcessInformation //另一个指针
);
其中 最后一个指针所对应的PPRCESS_INFORMATION结构如下所示

typedef struct _PROCESS_INFORMATION
{
    HANDLE hProcess;
    HANDLE hThread;
    DWORD  dwProcessId;
    DWORD  dwThreadId;
} PROCESS_INFORMATION;

当系统产生进程对象和线程对象的时候会把两个对象的handle填入此结构体的相关字段中.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值