创建一个进程可以用CreateThread或AfxBeginThread,二者有什么优缺点...偶是菜鸟就不是很知道了,
只知道一点,CreateThread调用的Callback函数可以DWORD,而AfxBeginThread必须是UNIT类型的,不然就不能编译通过
使用CreateThread函数创建线程,CreateThread的原型如下:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags, // creation flags
LPDWORD lpThreadId
);
其中:
lpThreadAttributes表示创建线程的安全属性,NT下有用。
dwStackSize指定线程栈的尺寸,如果为0则与进程主线程栈相同。
lpStartAddress指定线程开始运行的地址。
lpParameter表示传递给线程的32位的参数。
dwCreateFlages表示是否创建后挂起线程(取值CREATE_SUSPEND),挂起后调用ResumeThread继续执行。
lpThreadId用来存放返回的线程ID。
用户界面线程的AfxBeginThread的原型如下:
CWinThread* AFXAPI AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority,
UINT nStackSize,
DWORD dwCreateFlags,
LPSECURITY_ATTRIBUTES lpSecurityAttrs)
其中:
参数1是从CWinThread派生的RUNTIME_CLASS类;
参数2指定线程优先级,如果为0,则与创建该线程的线程相同;
参数3指定线程的堆栈大小,如果为0,则与创建该线程的线程相同;
参数4是一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。
参数5表示线程的安全属性,NT下有用。
// CreateThread.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <windows.h>
class CThread
{
public:
CThread()
{
m_hThread = NULL;
m_hEventExit = NULL;
}
virtual ~CThread()
{
if (m_hThread)
CloseHandle(m_hThread);
if (m_hEventExit)
CloseHandle(m_hEventExit);
}
HANDLE CreateThread(void)
{
m_hEventExit = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!m_hEventExit)
return NULL;
m_hThread = ::CreateThread(
NULL,
0,
ThreadProc,
this,
0,
&m_dwThreadID);
DWORD dwRet = GetLastError();
}
static DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
CThread* pThread = reinterpret_cast<CThread *>(lpParameter);
if (pThread)
return pThread->Run();
return -1;
}
virtual DWORD Run()
{
cout << "Run..." << endl;
for (;;)
{
DWORD dwRet = WaitForSingleObject(m_hEventExit, 0);
if (dwRet == WAIT_TIMEOUT)
{
cout << "Wait...." << endl;
SuspendThread(m_hThread); //悬挂线程
Sleep(10);
}
else if (dwRet == WAIT_OBJECT_0)
{
cout << "Wait_Object_0..." << endl;
break;
}
else if (dwRet == WAIT_ABANDONED)
{
cout << "ABABDONED..." << endl;
return -1;
}
}
return 0;
}
void Wait(DWORD dwMillseconds = INFINITE)
{
//SetEvent(m_hEventExit);
ResumeThread(m_hThread);//恢复线程
WaitForSingleObject(m_hThread, dwMillseconds);
}
private:
HANDLE m_hThread;
DWORD m_dwThreadID;
HANDLE m_hEventExit;
};
int main(int argc, char* argv[])
{
CThread ct;
HANDLE handle = ct.CreateThread();
Sleep(1000);
ct.Wait();
system("pause");
return 0;
}