• 013 Windows进程及线程


    Windows 进程及线程

      ● 进程的组成
        ○ 进程是“惰性”的,进程要做的任何事情,都必须让线程来运行,线程执行进程地址空间中包含的代码

          ◌ 进程本身无法运行任何东西

          ◌ 进程划定一个区域,存在一些代码,这些代码都是静态存在的


        ○ 一个进程可以拥有多个线程,所有的线程都能够在进程的地址弓箭中“同时”运行代码,每个线程都有他自己的一组CPU寄存器以及自己的堆栈。

          ◌ 一个进程最少可以有一个线程

          ◌ 如果一个进程里面没有线程会被销毁


        ○ 每个进程必须有一个线程,当系统创建一个进程时,会自动创建一个线程。这个线程我们称为主线程。如果没有线程要执行进程地址空间中的代码,进程就失去了存在的意义,此时系统会自动销毁进程以及它的地址空间

          ◌ 线程执行CPU的代码

           ◌ Windows是一个支持多进程技术的操作系统 


        ○ 操作系统会以轮询的方式为每一个线程分配CPU时间片,从营造出“并行”的假象。

        ○ 如果计算机拥有多个CPU,操作系统会更复杂的方式为线程分配CPU时间。



      ● 内核对象
        ○ 操作系统用来管理进程


      ● 地址空间
        ○ 包含了可执行文件及DLL模块的代码和数据


    应用程序类型

      ● 控制台用户界面
        ○ 控制台程序则是基于文本的它们一般不会创建窗口或进程消息,而且不需要GUI

          ◌ 通过文本交互的程序都叫做CUI

          ◌ 基于文本操作的叫做CUI

          ◌ 并不是说CMD执行的程序就叫做CUI

    //我们现在学习的win32api 都是跟C 函数模式的
    //跟C++关系不大,因为C++是类封装 

      ● 图形用户界面
        ○ GUI程序一个图形化的前端,它可以创建窗口,可以拥有菜单,能通过对话框与用户交互,还能使用所有标砖 “视窗化” 的东西 Windows 的几乎所有附件应用程序都是GUI程序

      ● 区别

        ○ 1.在 VS中,CUI程序的链接器开关位 /SUBSYSTEM:CONSOLE,GUI程序的链接器开关位 /SUBSYSTEM:WINDOWS.在加载时,会获取此值,如果是一个文本控制台窗口,操作系统会使用命令提示符启动这个程序,否则它只是加载这个,由应用程序来管理自己的窗口
        ○ 2.入口函数不同

    int WINAPI _tWinMain(
        HINSTANCE hInstanceExe,
        HINSTANCE hPreInstancec,
        PTSTR pszCmdLine,
        int nCmdShow);
    1 int _tmain(
    2     int argc,
    3     TCHAR *argv[],
    4     TCHAR *envp[]
    5     );

        ○ 启动函数不同,GUI的启动函数位 WinMainCRTStartup或wWinMainCRtatup,CUI的启动函数为mainCRTStartup或wmainCStartup

          ◌ 命令提示符是一个软件,完全独立软件

          ◌ 我们开发的程序是另外一个软件,如果里面设置了命令行,或者控制台,用户界面属性

     1 #include <Window.h>
     2 #include <tchar.h>
     3 //Main        CUI            ->
     4 //WinMin    GUI            ->新建或附加一个控制台程序
     5 
     6 //程序
     7 //无法解析外部符号 _main,该符号在函数 "int __cdecl invoke main(void)" (?invoke_main@@YAHXZ)中被引用
     8 //找Main函数
     9 //无法解析的外部符号 _WinMain@16,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用
    10 //找WinMain函数
    11 //CUI
    12 int main()
    13 {
    14     return 0;
    15 }
    16 //GUI程序的链接器开关位
    17 int WINAPI _tWinMain(
    18     _In_    HINSTANCE hInstance,        //进程句柄
    19     _In_    HINSTANCE hPrevInstance,      //前一个进程的句柄    尽量不要使用 或者不使用
    20     _In        LPTSTR lpCmdLine,        //命令行
    21     _In_    int nCmdShow)            //显示的方式 SW_SHOW SW_HIDE
    22 {
    23     return 0
    24 }

     

     1 #include <tchar.h>
     2 #include <windows.h>
     3 
     4 #include <stdio.h>
     5 
     6 int main( )
     7 {
     8     HINSTANCE hInstance = GetModuleHandle(NULL);        //获取窗口句柄
     9                                                             //程序基质0x400000
    10     printf("0x%x
    ",hInstance );
    11     
    12     TCHAR* const strCommline = GetCommandLine();
    13             //LPTSTR WINAPI GetCommandLine(void);
    14     _tprintf(TEXT("%s
    "),strCommline);
    15     int nNumArgv;
    16     LPWSTR* ppArgv = CommandLineToArgvW( strCommline, &nNumArgv);
    17     if( ppArgv != NULL)
    18     {
    19         for(int nIndex = 0; nIndex < nNumArgv; ++nIndex )
    20         {
    21             _tprintf( TEXT("%s
    "), ppArgv[nIndex] );
    22         }
    23     }
    24     
    25 
    26     system("pause");
    27     return 0;
    28 }
    1 //环境变量
    2 LPTCH strPath = GetEnvironmentString();
    3 _tprintf(TEXT("%s 
    "), strPath);
    4 //FreeEnvironmentStrings();
  • 相关阅读:
    netty源码学习
    大话数据结构读书笔记
    java编程思想读书笔记
    spring依赖注入源码分析和mongodb自带连接本地mongodb服务逻辑分析
    spring的xml的property和constructor-arg的解析
    junit测试用例加载spring配置文件
    (大二下)软件需求分析阅读笔记01
    课后作业——需求分析
    2018年春季个人阅读计划
    软件需求与分析——大二下需会知识点
  • 原文地址:https://www.cnblogs.com/sdk123/p/6939467.html
Copyright © 2020-2023  润新知