多线程创建和使用

来源:互联网 发布:编程怎么晓得代码 编辑:程序博客网 时间:2024/06/03 18:42

1 编写线程函数

2 建立多线程句柄

3 在测试函数中直接使用线程:挂起,恢复,结束等

线程方法:

static unsigned _stdcall sleepTest2(void *param)//函数返回值类型以及函数参数类型需要匹配{int count = 2;DWORD exitCode = 0;while(1){Sleep(1500);cout<<"  我是  线程2  启动的循环输出"<<endl;count--;if (count == 0){//GetExitCodeThread(thread2, &exitCode);cout<<endl<<"the exit num is:"<<exitCode<<endl;//ExitThread(exitCode);}}return 1;}

测试函数

void threadTest2(){HANDLE thread;DWORD exit1code = 0;thread = (HANDLE)_beginthreadex(NULL,0, sleepTest, NULL, 0, 0);char c = 'y';while(c){Sleep(1000);cout<<"我是 进程 启动循环"<<endl;cin>>c;if (c == 's'){SuspendThread(thread);}else if (c == 'r'){ResumeThread(thread);}else if ((c == 'n') || (c == 'N')){GetExitCodeThread(thread, &exit1code);CloseHandle(thread);_endthreadex(exit1code);cout<<endl<<" test finish;"<<endl;break;}elsecontinue;}}

直接在主函数中调用此方法,但运行的结果是,在执行_endthreadex(exit1code)后,线程任然没能关闭
但若把线程函数中

//GetExitCodeThread(thread, &exitCode);
cout<<endl<<"the exit num is:"<<exitCode<<endl;
//ExitThread(exitCode);
注释去掉,建立全局函数thread,线程就可以在自己跑完后结束掉
另外也可以用CreateThread  Win api创建线程(经量少用)
其定义与 _beginthreadex(NULL,0, sleepTest, NULL, 0, 0) 的使用差不多,各参数的意义:
CreateThread(NULL,0,ThreadProc,NULL,NULL,NULL);
第一个参数是指向安全属性的指针,NULL就行
第二个参数是初始线程堆栈大小,0就可以,WINDOWS会自动分配
第三个参数指向线程函数,必须是这样DWORD WINAPI ThreadProc (LPVOID pParam) 
第四个参数是传给线程函数的参数,有就传,没有就NULL
第五个参数是线程启动方式,可以是挂起CREATE_SUSPENDED,或者马上启动NULL
最后一个参数是创建的线程ID。
用其举例,若创建线程是有参数时:
线程函数定义原型:
static unsigned _stdcall sleepTest2(void *param)
线程函数:
void printLeft(LPVOID a = 0)
{
int c = (int )a;
cout<<endl<<"I am print left;and a = "<<c<<endl;
}
创建时:
HANDLE thread;
DWORD id;
thread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)printLeft, LPVOID(3), 0, &id);


参考blog:
http://wenku.baidu.com/view/8f7ba26c011ca300a6c3904b.html
http://wenku.baidu.com/view/7b6a1b6348d7c1c708a14516.html
http://www.cnblogs.com/lgxqf/archive/2009/02/10.html
http://www.cnblogs.com/lidabo/archive/2012/08/15/2640204.html
http://www.cnblogs.com/luxiaoxun/archive/2012/10/09/2716514.html