关闭

进程,线程 相关问题

183人阅读 评论(0) 收藏 举报
分类:

一:进程

//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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:52873次
    • 积分:925
    • 等级:
    • 排名:千里之外
    • 原创:39篇
    • 转载:19篇
    • 译文:0篇
    • 评论:1条