Windows多线程程序设计
- 格式:doc
- 大小:53.00 KB
- 文档页数:9
Windows多线程程序设计- -
1、产生一个线程,只是个框架,没有具体实现。理解::CreateThread函数用法。
#include
DWORD WINAPI ThreadFunc(LPVOID);
int main()
{
HANDLE hThread;
DWORD dwThreadID;
hThread = ::CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)(ThreadFunc),
NULL,
0,
&dwThreadID);
...;
return 0;
}
DWORD WINAPI ThreadFunc(LPVOID lParam)
{
...;
return 0;
}
2、一个真正运转的多线程程序,当你运行它的时候,你会发现(也可能会害怕),自己试试吧。说明了多线程程序是无法预测其行为的,每次运行都会有不同的结果。
#include
#include
using namespace std;
DWORD WINAPI ThreadFunc(LPVOID);
int main()
{
HANDLE hThread;
DWORD dwThreadID;
// 产生5个线程
for(int i=0; i<5; i++)
{
hThread = ::CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)(ThreadFunc),
(LPVOID)&i,
0,
&dwThreadID);
if(dwThreadID)
cout << "Thread launched: " << i << endl;
}
// 必须等待线程结束,以后我们用更好的处理方法
Sleep(5000);
return 0;
}
DWORD WINAPI ThreadFunc(LPVOID lParam)
{
int n = (int)lParam;
for(int i=0; i<3; i++)
{
cout << n <<","<< n <<","<< n << ","< }
return 0;
}
3、使用CloseHandle函数来结束线程,应该是“来结束核心对象的”,详细要参见windows 多线程程序设计一书。
修改上面的程序,我们只简单的修改if语句。
if(dwThreadID)
{
cout << "Thread launched: " << i << endl;
CloseHandle(dwThreadID);
}
4、GetExitCodeThread函数的用法和用途,它传回的是线程函数的返回值,所以不能用GetExitCodeThread的返回值来判断线程是否结束。
#include
#include
using namespace std;
DWORD WINAPI ThreadFunc(LPVOID);
int main()
{
HANDLE hThread1;
HANDLE hThread2;
DWORD dwThreadID1;
DWORD dwThreadID2;
DWORD dwExitCode1 = 0;
DWORD dwExitCode2 = 0;
hThread1 = ::CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)(ThreadFunc),
(LPVOID)1,
0,
&dwThreadID1);
if(dwThreadID1)
cout << "Thread launched: " << dwThreadID1 << endl;
hThread2 = ::CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)(ThreadFunc),
(LPVOID)2,
0,
&dwThreadID2);
if(dwThreadID2)
cout << "Thread launched: " << dwThreadID2 << endl;
while(1)
{
cout<<"Press any key.";
cin.get();
GetExitCodeThread(hThread1, &dwExitCode1);
GetExitCodeThread(hThread2, &dwExitCode2);
if( dwExitCode1 == STILL_ACTIVE )
cout< if( dwExitCode2 == STILL_ACTIVE )
cout< if( dwExitCode1 != STILL_ACTIVE && dwExitCode2 != STILL_ACTIVE ) break;
}
CloseHandle(hThread1);
CloseHandle(hThread2);