进程的创建

  1. STARTUPINFO si; //**成员DWORD dwFlags;表示结构体当中哪些成员有效。**STARTF_USESHOWWINDOW|STARTF_USEPOSITION
  2. PROCESS_INFORMATION pi;
  3. ZeroMemory(&si, sizeof(si));
  4. si.cb = sizeof(si);
  5. ZeroMemory(&pi, sizeof(pi));
  6. //LPTSTR pszCmdLine = TEXT("C:\\Windows\\System32\\notedap.exe");改成
  7. //TCHAR pszCmdLine[] = TEXT("C:\\Windows\\System32\\notedap.exe");
  8. //Windows核心编程专门有讲这个问题 CreateProcess会修改传递给它的命令行字符串, LPTSTR是字符串指针不能修改....* /
  9. //char* szCommandLine ="C:\\Program Files (x86)\\KuGou\\KGMusic\\KuGou.exe";
  10. TCHAR szCommandLine[] = TEXT("notepad ReadMe.txt");//父进程当前目录下的ReadMe.txt
  11. ::CreateProcess(NULL,//可执行文件名(必须添加.exe。若未添加路径则只会去当前目录找。so一般为NULL)
  12. (LPWSTR)szCommandLine,//传递给执行模块的参数,相当于在运行栏输入szCommandLine(可以在一些目录下自动搜寻exe)
  13. NULL,//进程安全性
  14. NULL, //线程安全性
  15. FALSE,//当前进程的可继承句柄是否可以被新进程继承
  16. NULL,//创建标志 如 CREAT_NEW_CONSOLE
  17. NULL, //环境变量
  18. NULL,//当前目录
  19. &si,//父给子进程的显示信息
  20. &pi);//此进程的标志信息 ID\句柄
  21. &pi.dwProcessId;//进程ID
  22. &pi.dwThreadId;//进程中主线程ID
  23. &pi.hProcess;//进程内核句柄
  24. &pi.hThread;//进程中主线程内核句柄

终止进程

  1. //::ExitProcess(0); //终止当前进程,退出代码0
  2. //BOOL bBet=::TerminateProcess(pi.hProcess,-1);//退出代码-1(关闭进程失败)
  3.  
  4. HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, //想得到的访问权限
  5. FALSE, //返回的句柄是否可以被继承
  6. pi.dwProcessId);//进程ID
  7. BOOL bBet = ::TerminateProcess(hProcess, -);//(关闭进程成功)
  8.  
  9. CloseHandle(hProcess);
  10. CloseHandle(pi.hProcess); //不使用就关闭

创建线程

  1. DWORD dwThreadId;
  2. HANDLE hHandle;
  3. hHandle = ::CreateThread(NULL, //线程安全属性
  4. NULL, //线程堆栈大小
  5. ThreadFun, //线程函数起始地址
  6. NULL, //传给线程函数的参数
  7. , //是否立即启动线程
  8. &dwThreadId);//取得线程ID
  9. //一般使用下面方法
  10. UINT uId;
  11. HANDLE hHandleCopy;
  12. hHandleCopy = (HANDLE)::_beginthreadex(NULL, //线程安全属性
  13. NULL, //线程堆栈大小
  14. ThreadProc, //线程函数起始地址
  15. NULL, //传给线程函数的参数
  16. , //是否立即启动线程
  17. &uId);//取得线程ID

线程函数如下:

  1. //============================================================================================
  2. //线程函数的定义
  3. //DWORD WINAPI ThreadFun() //参数LPVOID IpParam是必须的
  4. DWORD WINAPI ThreadFun(LPVOID IpParam)
  5. {
  6. STARTUPINFO si;
  7. PROCESS_INFORMATION pi;
  8. ZeroMemory(&si, sizeof(si));
  9. si.cb = sizeof(si);
  10. ZeroMemory(&pi, sizeof(pi));
  11. TCHAR szCommandLine[] = TEXT("C:\\Program Files (x86)\\KuGou\\KGMusic\\KuGou.exe");
  12. ::CreateProcess(NULL,(LPWSTR)szCommandLine,NULL,NULL,FALSE,NULL,NULL, NULL,&si,&pi);
  13. return ;
  14. }
  15. //=============================================================================================
  16. UINT _stdcall ThreadProc(LPVOID IpParam)
  17. {
  18. ::WaitForSingleObject(g_hEvent,INFINITE);
  19. STARTUPINFO si;
  20. PROCESS_INFORMATION pi;
  21. ZeroMemory(&si, sizeof(si));
  22. si.cb = sizeof(si);
  23. ZeroMemory(&pi, sizeof(pi));
  24. TCHAR szCommandLine[] = TEXT("notepad ReadMe.txt");
  25. ::CreateProcess(NULL, (LPWSTR)szCommandLine, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
  26. return ;
  27. }
  28. //================================================================================================

线程通信交互

  1. //线程之间的交互(事件内核对象)
  2. //HANDLE g_hEvent;
  3. g_hEvent = ::CreateEvent(NULL, //事件对象安全属性
  4. FALSE, //是否是手动重置事件对象为未受信(否则系统自动重置)
  5. FALSE, //初始状态(受信/未受信)执行中:未受信
  6. NULL); //事件对象名称(可用于OpenEvent()函数的第三个参数,类似进程)
  7.  
  8. ::WaitForSingleObject(hHandle, //对象句柄
  9. INFINITE); //等待时间(\毫秒)
  10. Sleep();
  11. SetEvent(g_hEvent);
  12. //RetEvent(g_hEvent); //自动模式下无需重置(自动重置)
  13. ::WaitForSingleObject(hHandleCopy,INFINITE); //等待
  14.  
  15. //::WaitForMultipleObjects(2, //对象句柄数量
  16. // h, //对象句柄数组
  17. // TRUE, //是否等待所有内核对象变为受信状态(否则有一个就可以)
  18. // INFINITE) //等待时间(\毫秒)
  19. //很实用,等待指定线程执行完毕(不加这句线程还未执行完毕主线程就已经结束了)

其中SetEvent(g_hEvent);中的g_hEvent是全局变量HANDLE g_hEvent;

SetEvent(g_hEvent)使得事件对象g_hEvent变为受信状态,

此时ThreadProc函数中的::WaitForSingleObject(g_hEvent,INFINITE);函数检测到其为受信时开始执行接下来的代码。

终止线程与终止进程类似,一般不使用终止进程和线程函数,一般使用通信机制告诉要关闭的进程或线程让其自行退出。

强行终止会使得来不及执行析构函数,回收内存,造成内存泄漏。

MFC进程的创建销毁、线程的创建与交互的更多相关文章

  1. MFC在子线程中创建窗口(PostMessage方法)

    1.创建子线程 C++创建线程的方式比较多 1)最简单易用的<thread>头文件,但是这种方法创建的子线程中无法给主线程PostMessage消息(也可能是我操作有误,总之没成功) 2) ...

  2. Thread和Runnable的区别和匿名内部类方式实现线程的创建

    如果一个类继承Thread,则不适合资源共享.但是如果实现了Runable接口的话,则很容易的实现资源共享. 总结:实现Runnable接口比继承Thread类所具有的优势: 1.适合多个相同的程序代 ...

  3. Java基础 继承的方式创建多线程 / 线程模拟模拟火车站开启三个窗口售票

    继承的方式创建多线程 笔记: /**继承的方式创建多线程 * 线程的创建方法: * 1.创建一个继承于Thread 的子类 * 2.重写Thread类的run()方法 ,方法内实现此子线程 要完成的功 ...

  4. java并发学习--第二章 spring boot实现线程的创建

    除了之前介绍的创建线程方式外,spring boot为我们了提供一套完整的线程创建方式,其中包括了:线程.线程池.线程的监控. 一.使用spring boot提供的方法创建线程与线程池 1.首先在sp ...

  5. 操作系统/应用程序、操作中的“并发”、线程和进程,python中线程和进程(GIL锁),python线程编写+锁

    并发编程前言: 1.网络应用 1)爬虫 直接应用并发编程: 2)网络框架 django flask tornado 源码-并发编程 3)socketserver 源码-并发编程 2.运维领域 1)自动 ...

  6. 线程概念( 线程的特点,进程与线程的关系, 线程和python理论知识,线程的创建)

    参考博客: https://www.cnblogs.com/xiao987334176/p/9041318.html 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运 ...

  7. python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建)

    昨日内容回顾 队列 队列 : 先进先出.数据进程安全 队列实现方式: 管道 + 锁 生产者消费者模型 : 解决数据供需不平衡 管道 双向通信 数据进程不安全 EOFError: 管道是由操作系统进行引 ...

  8. day33 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

    今日内容: 1.线程理论 2.锁: 牺牲了效率,保证了数据的安全(重点) 3.守护线程 4.GIL锁:(重点) 5.计算密集型和IO密集型 6.信号量,事件(了解) 7.补充. 子进程中不能input ...

  9. python全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python理论知识,线程的创建)

    昨日内容回顾 队列 队列:先进先出.数据进程安全 队列实现方式:管道+锁 生产者消费者模型:解决数据供需不平衡 管道 双向通信,数据进程不安全 EOFError: 管道是由操作系统进行引用计数的 必须 ...

  10. APUE学习之多线程编程(一):线程的创建和销毁

    一.线程标识      和每个进程都有一个进程ID一样,每个线程也有一个线程ID,线程ID是以pthread_t数据类型来表示的,在Linux中,用无符号长整型表示pthread_t,Solaris ...

随机推荐

  1. ZOJ 1259 Rails

    stack的应用 #include<iostream> #include<cstdio> #include<stack> using namespace std; ...

  2. 【转】jQuery.validate 用法

    名称                              返回类型                描述 validate(options)          返回:Validator       ...

  3. ELK冷热数据分离

      通常情况下,我们使用ELK日志分析平台最常用的数据时间为1周或一个月(因业务场景不同,可能存在差别),时间比较长的数据没有特殊情况可能我们就没有必要再进行查询了,但是因业务需求或者作为凭证,这些日 ...

  4. Flask系列07--Flask中的CBV, 蓝图的CBV

    一.CBV使用 class base view 和django中类似 class Login(views.MethodView): # methods=["POST"," ...

  5. Django(命名URL和URL反向解析)

    day67 参考: https://www.cnblogs.com/liwenzhou/articles/8271147.html#autoid-1-4-0 反向解析URL             本 ...

  6. Spring学习笔记2——表单数据验证、文件上传

    在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...

  7. git如何忽略已经加入版本控制的文件

    git移除已经追踪的文件 有时候新增一个文件,会自动追加到git的版本控制当中,但是又不想提交到仓库.可以按照下面的步骤: git status 查看管理状态: ml-py git:(master) ...

  8. 二进制入门-打造Linux shellcode基础篇

    0x01 前言   本文的目的不是为了介绍如何进行恶意的破坏性活动,而是为了教会你如何去防御此类破坏性活动,以帮助你扩大知识范围,完善自己的技能,如有读者运用本文所学技术从事破坏性活动,本人概不负责. ...

  9. JAVA虚拟机体系结构JAVA虚拟机的生命周期

    一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Jav ...

  10. 上传本地文件到github(码云)上(小乌龟方式,sourcetree方式)

    一:上传文件到 github 1.打开 https://github.com/ 登录github账号(没有的自己创建),点击右上角创建新仓库 在打开的页面中填写  名字 点击 Create repos ...