/**
title: windows vc++ thread simple test
environment:vc++6.0+windows xp
author: chinayaosir
filename: SimpleThreadTest.cpp
//
function list:
1.CreateThread(6parameters) 建立线程
2.WaitForSingleObject(2parameters)//线程等待
3.CloseHandle(1parameters)//关闭线程
4.ThreadFuncTest() //用户自定义函数
//
CreateThread函数来创建我们的线程了,CreateThread函数有六个参数分别是
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes
DWORD dwStackSize, // initial thread stack size
LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
LPVOID lpParameter, // argument for new thread
DWORD dwCreationFlags, // creation flags
LPDWORD lpThreadId // pointer to receive thread ID
第1个参数我们设置为NULL,使这个句柄不能被继承;
第2个参数设置为0,使用默认的堆栈大小;
第3个参数为线程函数的起始地址,也就是线程函数的函数名;
第4个参数为NULL,没有值要传递给线程函数;
第5个参数为0,创建好之后马上让线程运行;
第6个参数设置为指向线程ID的地址。
//
WaitForSingleObject函数来等待线程函数变成受信(signaled)状态,
它的两个参数分别是
HANDLE hHandle, // handle to object to wait for
DWORD dwMilliseconds // time-out interval in milliseconds
第1参数为线程函数的句柄,
第2个参数设置为INFINITE,等待线程一直执行完。
//
关闭线程
CloseHandle()关闭一个内核对象。
其中包括文件、文件映射、进程、线程、安全和同步对象等。
在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,
CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。
BOOL CloseHandle( HANDLE hObject);
参数 hObject :代表一个已打开对象handle。
返回值 TRUE:执行成功;FALSE:执行失败,可以调用GetLastError()获知失败原因。
*/
#include <windows.h>
#include <iostream>
using namespace std;
//用户自定义函数原型
DWORD WINAPI ThreadFuncTest(LPVOID para);
//main函数
int main(int argc,char* argv[]){
HANDLE Thread;
DWORD dwThreadId;
bool flag = true;
bool *para = &flag;
Thread=::CreateThread(NULL,0,ThreadFuncTest,(LPVOID)para,0,&dwThreadId);
cout<<"The new thread ID is :"<<dwThreadId<<endl;
// ::WaitForSingleObject(Thread,2000);//如果执行了此行,则Thread一直执行,知道返回,才会执行下面的程序。
if(::CloseHandle(Thread) == false)
cout<<"false"<<endl;
//CloseHandle的执行并未真正中止线程的运行,Thread Handle 指向的是“线程核心对象”,不是线程本身。当调用CloseHandle唯一做的事情是引用指针减一,直至为0,自动销毁线程核心对象。要,当指针计数为0,且线程结束了,对象才会被真正消除。当线程返回时,指针计数也会减一。
char a;
cout<<"terminate the thread:"<<endl;
cin>>a;
flag = !flag;//此参数可以控制线程的运行。
return 0;
}
//用户自定义函数实现
DWORD WINAPI ThreadFuncTest(LPVOID para){
bool *flag = (bool*)para;
int i;
for(i=0; ;i++) {
cout<<"running "<<i<<endl;
if(para)//线程外控制线程内变量
cout<<"stop for a while"<<endl;
}
return 0;
}