win32多线程程序设计

HANDLE CreateThread(
     LPSECURITY_ATTRIBUTES lpThreadAttributes,
     DWORD  dwStackSize,
     LPTHREAD_START_ROUTINE lpStartAddress,
     LPVOID  lpParameter,
     DWORD  dwCreationFlags,
     LPDWORD lpThreadId
);
 
参数
lpThreadAttributes  描述施行于这一新线程的security属性。NULL表
  示使用缺省值。此参数在Windows 95中被忽略。
  本书并不论及security。
dwStackSize   新线程拥有自己的堆栈。0 表示使用缺省大小:
  1MB。 

lpStartAddress   新线程将开始的起始地址。这是一个函数指针。(译
  注:在C语言中函数名称即代表函数指针,所以这
  里可放一个函数名称)
lpParameter   此值将被传送到上述所指定之新线程函数去,作为
  参数。
dwCreationFlags   允许你产生一个暂时挂起的线程。默认情况是“立
  即开始执行”。
lpThreadId  新线程的ID会被传回到这里。
 
返回值
如果CreateThread( )成功,传回一个handle ,代表新线程。否则传回一个
FALSE。如果失败,你可以调用GetLastError( )获知原因。

 

 下面是各种 Win32  核心对象的清单。本书涵盖 pipes 之外的每一种核心对
象。 
 
进程(processes) 
线程(threads) 
文件(files) 
事件(events) 
信号量(semaphores) 

 

CloseHandle的重要性
 
当你完成你的工作后,应该调用CloseHandle 释放核心对象。
 
BOOL CloseHandle (
     HANDLE hObject
);
 
参数
hObject   代表一个已打开之对象handle
 
返回值
如果成功,CloseHandle( )传回TRUE。如果失败则传回FALSE,此时你可
以调用GetLastError( )获知失败原因。

 

线程结束代码可以藉着调用GetExitCodeThread( )(并给予CreateThread
所获得的线程ID作为参数)而得知:
 
BOOL GetExitCodeThread(
    HANDLE hThread,
     LPDWORD lpExitCode
);
 
参数
hThread  由CreateThread( )传回的线程handle
lpExitCode  指向一个DWORD,用以接受结束代码(exit code)
 
返回值
如果成功,GetExitCodeThread( )传回TRUE,否则传回FALSE。如果失败,
你可以调用GetLastError( )找出原因。如果线程已结束,那么线程的结束代
码会被放在lpExitCode参数中带回来。如果线程尚未结束,lpExitCode带回
来的值是STILL_ACTIVE。

 

VOID ExitThread(
    DWORD  dwExitCode
);
 
参数
dwExitCode               指定此线程之结束代码
 
返回值
    没有。此函数从不返回。
 
这个函数有点像C runtime library中的exit( )函数,因为它可以在任
何时候被调用并且绝不会返回。任何代码若放在此行之下,保证不会被执行。

 互斥器(mutexes)
管道(Pipes。分为named和anonymous两种)

// win32Thread.cpp : 定义控制台应用程序的入口点。
//

#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
DWORD WINAPI ThreadProc(void* pmsg)
{
	DWORD n = (DWORD)pmsg;

	Sleep(n*5000);

	return n * 10;
}

DWORD WINAPI ThreadProc1(void* pmsg)
{

	ExitThread(100);

	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hThread1, hThread2;
	DWORD dThreadID1,DThreadId2;
	DWORD dExitCode1,dExitCode2;

	hThread1 = CreateThread(NULL,0,ThreadProc,LPVOID(1), 0, &dThreadID1);

	hThread2 = CreateThread(NULL,0,ThreadProc1,LPVOID(2), 0, &DThreadId2);

	while(1)
	{
		printf("please Enter:");

		getchar();

		GetExitCodeThread(hThread1, &dExitCode1);
		GetExitCodeThread(hThread2, &dExitCode2);

		if (dExitCode1 == STILL_ACTIVE)
		{
			printf("Thread 1 running\n");
		}

		if (dExitCode2 == STILL_ACTIVE)
		{
			printf("Thread2 running\n");
		}
		if (dExitCode1 !=STILL_ACTIVE && dExitCode2 != STILL_ACTIVE)
		{
			printf("Thread Two End\n");
			break;
		}
	}

	CloseHandle(hThread1);
	CloseHandle(hThread2);

	printf("%d,%d\n",dExitCode1, dExitCode2);

	system("pause");

	return 0;
}

使用了以上的win32线程函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值