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);函数检测到其为受信时开始执行接下来的代码。

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

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

 

猜你喜欢

转载自www.cnblogs.com/cteng-common/p/progressandthread.html
今日推荐