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


进程的创建

    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, -1);//(关闭进程成功)
 CloseHandle(hProcess); CloseHandle(pi.hProcess); //不使用就关闭

创建线程

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

线程通信交互

    //线程之间的交互(事件内核对象) //HANDLE g_hEvent;
    g_hEvent = ::CreateEvent(NULL, //事件对象安全属性
                             FALSE, //是否是手动重置事件对象为未受信(否则系统自动重置)
                             FALSE, //初始状态(受信/未受信)执行中:未受信
                             NULL); //事件对象名称(可用于OpenEvent()函数的第三个参数,类似进程)
 ::WaitForSingleObject(hHandle, //对象句柄
                          INFINITE);   //等待时间(\毫秒)
    Sleep(10000); 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);函数检测到其为受信时开始执行接下来的代码。

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

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM