一:进程
//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创建结束线程。