MFC进程的创建销毁、线程的创建与交互

时间:2022-09-21 17:55:25

进程的创建

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

终止进程

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

创建线程

    DWORD dwThreadId;
HANDLE hHandle;
hHandle = ::CreateThread(NULL, //线程安全属性
NULL, //线程堆栈大小
ThreadFun, //线程函数起始地址
NULL, //传给线程函数的参数
, //是否立即启动线程
&dwThreadId);//取得线程ID
//一般使用下面方法
UINT uId;
HANDLE hHandleCopy;
hHandleCopy = (HANDLE)::_beginthreadex(NULL, //线程安全属性
NULL, //线程堆栈大小
ThreadProc, //线程函数起始地址
NULL, //传给线程函数的参数
, //是否立即启动线程
&uId);//取得线程ID

线程函数如下:

//============================================================================================
//线程函数的定义
//DWORD WINAPI ThreadFun() //参数LPVOID IpParam是必须的
DWORD WINAPI ThreadFun(LPVOID IpParam)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
TCHAR szCommandLine[] = TEXT("C:\\Program Files (x86)\\KuGou\\KGMusic\\KuGou.exe");
::CreateProcess(NULL,(LPWSTR)szCommandLine,NULL,NULL,FALSE,NULL,NULL, NULL,&si,&pi);
return ;
}
//=============================================================================================
UINT _stdcall ThreadProc(LPVOID IpParam)
{
::WaitForSingleObject(g_hEvent,INFINITE);
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
TCHAR szCommandLine[] = TEXT("notepad ReadMe.txt");
::CreateProcess(NULL, (LPWSTR)szCommandLine, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
return ;
}
//================================================================================================

线程通信交互

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

其中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. Java基础 继承的方式创建多线程 &sol; 线程模拟模拟火车站开启三个窗口售票

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

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

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

  4. 操作系统&sol;应用程序、操作中的&OpenCurlyDoubleQuote;并发”、线程和进程,python中线程和进程(GIL锁),python线程编写&plus;锁

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

  5. 线程概念&lpar; 线程的特点&comma;进程与线程的关系&comma; 线程和python理论知识&comma;线程的创建&rpar;

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

  6. python 全栈开发,Day41&lpar;线程概念&comma;线程的特点&comma;进程和线程的关系&comma;线程和python 理论知识&comma;线程的创建&rpar;

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

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

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

  8. python全栈开发,Day41&lpar;线程概念,线程的特点,进程和线程的关系,线程和python理论知识,线程的创建&rpar;

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

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

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

  10. Linux 进程与线程三(线程比较--创建线程参数)

    int pthread_equal(pthread_t th1,pthread_t th2); pthread_equal函数比较th1与th2是否为同一线程,由于不可以讲pthread_t数据类型认 ...

随机推荐

  1. Junit mockito 测试Controller层方法有Pageable异常

    1.问题 在使用MockMVC+Mockito模拟Service层返回的时候,当我们在Controller层中参数方法调用有Pageable对象的时候,我们会发现,我们没办法生成一个Pageable的 ...

  2. 转:WebService通用接口

    看到许多中小项目的webservice接口的源代码,不禁有个吐槽的冲动.除了会用CXF,Axis2等神级框架,其他的懒得动了,都是Ctrl+V,Ctrl+C,把其他模块的Request,Respons ...

  3. 把页面上的图表导出为pdf文件,分享一种请求下载文件的方法

    最近客户提出一个需求,就是把页面上的图表导出为pdf文件. 找了很多资料.终于有了点头绪.最主要是参考了HighCharts的做法.http://www.hcharts.cn/ 实现原理:把页面图表的 ...

  4. HTTP真的很简单

    原文:HTTP Made Really Easy因为我本身网络基础就很差,所以看到这篇文章一方面是学习网络知识,另一方面为了锻炼我蹩脚的英语水平,文中如有错误,欢迎浏览指正! 前言 在看这篇文章的时候 ...

  5. WCF 入门 (16)

    前言 上周回母校见了一下大学老师,还有些同学,发现差距还是挺大的...圈子不一样,真的就什么都不一样了.. 第16集 WCF中的Soap错误 Soap faults in WCF 首先简单介绍一下什么 ...

  6. inupt textarea提示文字(点击消失,不输入恢复)

    <input name="textfield" type="text"  maxlength="20" value="请输入 ...

  7. awk命令简单学习

    请执行命令取出linux中eth0的IP地址(请用cut,有能力者也可分别用awk,sed命令答). 解答: 说明:此题解答方法已经给大家讲解了不下15种,还可以有很多,在这里给大家着重讲下awk的技 ...

  8. SRM 583 Div II Level Three:GameOnABoard,Dijkstra最短路径算法

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12556 用Dijkstra实现,之前用Floyd算法写了一个, ...

  9. Android 百度地图 SDK v3&period;0&period;0 (三) 加入覆盖Marker与InfoWindow使用

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...

  10. 采用ACE登录设施(一)HelloWorld

    (1)开始使用日志设施 使用日志设施,总是要包括头文件: #include "ace/Log_Msg.h" ACE日志的Hello World #ifdef _DEBUG #pra ...