HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);
该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,其中各参数说明如下:
lpThreadAttributes:指向一个 SECURITY_ATTRIBUTES 结构的指针,该结构决定了线程的安全属性,一般置为 NULL;
dwStackSize:指定了线程的堆栈深度,一般都设置为0;
lpStartAddress:表示新线程开始执行时代码所在函数的地址,即线程的起始地址。一般情况为(LPTHREAD_START_ROUTINE)ThreadFunc,ThreadFunc 是线程函数名;
lpParameter:指定了线程执行时传送给线程的32位参数,即线程函数的参数;
dwCreationFlags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数ResumeThread被调用;
lpThreadId:该参数返回所创建线程的ID;
如果创建成功则返回线程的句柄,否则返回NULL。
Xxxtpye m_data
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
&m_data,
0,
NULL);
DWORD WINAPI ThreadFunc(LPVOID pParam)
{
Xxxtype *p_data=(Xxxtype*)pParam;
Return 0;
}
protected:
HANDLE hThread;
DWORD ThreadID;
线程1
我们建立一MFC对话框工程,并添加一按键按键,在其中编写:
Sleep(5000),即休眠5秒,此时会感觉到程序像死机一样,不可拖动
1此时我们在对话框类中添加:
protected:
HANDLE hThread;
DWORD ThreadID;
2在对话框源文件的开头添加:
DWORD WINAPI ThreadFunc(LPVOID pParam)
{
Sleep(5000);
return 0;
}
3将按键响应函数中的替换为:
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
NULL,
0,
&ThreadID
);
4此时再次编译运行程序,就会发现不那么“卡”了
注:本线程函数没有传递参数,故第3步的第4个参数为NULL
线程2
1以上线程函数是没有参数的,接下来传递一个参数,原工程不变,我们把线程函数改为如下形式
DWORD WINAPI ThreadFunc(LPVOID pParam)
{
int *N=(int*)pParam;
int i;
for(i=0;i<*N;i++)
{
Beep(1000,1000);
Sleep(100);
}
// Beep(1000,1000);
return 0;
}
2将创建线程函数改为
int i=5;
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
&i,
0,
&ThreadID
);
3再次运行,发现有时有声音,有时没有声音,那么我们再次修改2
int i=5;
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
&i,
0,
&ThreadID
);
WaitForSingleObject(hThread,INFINITE);
4再次编译运行,点击按键后,是不听到有声音了
注:WaitForSingleObject函数,
其函数原型为:DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);
当在某一线程中调用该函数时,线程暂时挂起,系统监视hHandle所指向的对象的状态。如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止
Linux下的多线程编程
VC++多线程编程(Win)