进程,线程 相关问题

一:进程

//1.1:创建进程
        WCHAR cmdExe[MAX_PATH] = {0};
        _stprintf(cmdExe, _T("\"%s\" %s"), csEXE, csParam); //"cmd /c \"%s\"  \"%s\""

        STARTUPINFO si = { sizeof(si) };
        PROCESS_INFORMATION pi;
        si.dwFlags = STARTF_USESHOWWINDOW; // 指定wShowWindow成员有效
        si.wShowWindow = SW_NORMAL;        //此成员设为TRUE的话则显示新建进程的主窗口
        BOOL rc = CreateProcess(
            NULL,   // 不在此指定可执行文件的文件名
            (LPTSTR)cmdExe,//命令行参数
            NULL,   // 默认进程安全性
            NULL,   // 默认进程安全性
            FALSE,  // 指定当前进程内句柄不可以被子进程继承
            CREATE_NO_WINDOW,// 为新进程创建一个新的控制台窗口 CREATE_NEW_CONSOLE
            NULL,   // 使用本进程的环境变量
            NULL,   // 使用本进程的驱动器和目录
            &si,
            &pi) ;
        if (!rc)
            dw = GetLastError();

        WaitForSingleObject(pi.hProcess,INFINITE); //等待进程结束
        DWORD lResult = 0;  
        GetExitCodeProcess(pi.hProcess, &lResult); //获取进程结束返回码
        if (pi.hProcess)
            ::CloseHandle(pi.hProcess);
        if (pi.hThread)
            ::CloseHandle(pi.hThread);

二:线程

#ifndef SAFE_CLOSE_HANDLE
#define SAFE_CLOSE_HANDLE(x)  { if((x) != NULL){ CloseHandle(x); (x) = NULL;} }
#endif

    HANDLE m_hEvtStop = CreateEvent(NULL, TRUE, FALSE, NULL);
    DWORD   dwThreadID;
    HANDLE m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ProcThread, NULL, 0, &dwThreadID);
//2.1创建的线程:
    while (::WaitForSingleObject(m_hEvtStop, 100) != WAIT_OBJECT_0){  
         //线程逻辑
    }
//2.2终止线程:
    ::SetEvent(m_hEvtStop);
    if (WaitForSingleObject(m_hThread, 1000) == WAIT_TIMEOUT)
    {
        if (m_hThread != NULL){
            ::TerminateThread(m_hThread, 0);
        }
    }
    SAFE_CLOSE_HANDLE(m_hThread);


//2.3 等待多个线程终止
    #define DEVNUM  20
    DWORD   dwThreadID;
    HANDLE  handle[DEVNUM];
    for (int i = 0; i != DEVNUM;i++)
    {
        handle[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ProcThread, NULL, 0, &dwThreadID);
    }
    WaitForMultipleObjects(DEVNUM, handle, TRUE, INFINITE);

三:线程,进程的退出

线程可以通过以下四种方式终止运行:
1:线程函数返回。
2:线程调用ExitThread杀死自己。
3:其他线程调用TerminateThread。
4:进程终止导致线程终止。
3.1:ExitProcess,ExitThread只能由本进程的其他线程调用。
主线程ExitThread退出时子线程并不会退出。
3.2:TerminateProcess和TerminateThread却可以由任何其他进程的线程调用,它的第一个参数指定要终止进程的句柄。
但是TerminateThread这种方式结束的线程清理工作(C++对象的析构)不会执行。只有进程结束时,该进程内所有线程所使用的资源都会被释放。
而TerminateProcess是异步的,此函数调用后我们并不能保证进程已经被强行终止了。要确定进程是否终止可以调用WaitForSingleObject函数,并传入进程句柄。

其他:建议使用_beginthreadex和_endthreadex创建结束线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值