Win32创建线程

1.进程和线程

转载:进程和线程的详解和区别

 2.第一个多线程的程序

注意区分线程句柄和线程ID的意义

线程句柄就是一块令牌,有了令牌就可以进行使用,但是没有令牌也并不能影响线程的生命

线程ID是身份证明,具有唯一性,因此系统进行线程调度的时候需要用到

线程函数具有固定的格式,因此不必须按照格式书写

注意向线程传递参数的方法只有两种

一个是通过定义全局变量

一个是线程函数有void*类型的指针来接收参数

要注意以下情况:

向线程函数并不是我们调用的,是我们在创建线程时,把线程函数的指针传参给线程,系统调用的线程函数

因此,我们在创建线程时向线程函数传参会出现创建线程函数被调用完毕之后,堆栈被摧毁,我们通过&num传参给线程函数后,参数的位置已经被销毁,所以传参就会失败

所以向线程函数传参时要注意此类情况

// CreatThread.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<windows.h>

int a=2;
DWORD WINAPI ThreadProc(LPVOID lpParameter)	
{
	for(int i=0;i<1000;i++)
	{
		printf("---------------------\n");

		Sleep(1000);
	}

	return 0;
}

void MyTest()
{
	
	HANDLE hThread = ::CreateThread(NULL, 0, ThreadProc,a, 0, NULL);			
				
			
	::CloseHandle(hThread);				

}
int main(int argc, char* argv[])
{
	MyTest();

	for(int i=0;i<1000;i++)
	{
		printf("++++++++++++++++\n");

		Sleep(1000);
	}
	
	return 0;
}

在这里打印的时候两个线程之间有交错的现象,

是因为cpu一次只能进行一个线程,

但是cpu在一瞬间会进行无数次线程之间的切换,

在切换的同时还会保存当前线程的进度

注意:这里必须要有主线程,如果主线程很快就结束了,那其他线程也不在了

2.图形界面倒计时程序

// Create.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include<Windows.h>
#include"resource.h"
#include<string.h>
#include<stdio.h>

HWND hEdit;
void InitEdit(HWND hwndDlg)
{


	hEdit = GetDlgItem(hwndDlg, (DWORD)IDC_EDIT1);
	SetWindowText(hEdit, "1000");

}

DWORD WINAPI ThreadProc(LPVOID lpParameter)	
{
	TCHAR buffer[10];
	memset(buffer,0,sizeof(buffer));

	GetWindowText(hEdit,buffer,10);

    //将Edit文本框里面的字符串转为数字类型
	DWORD dwTimer;
	sscanf(buffer,"%d",&dwTimer);

	
	while(dwTimer)
	{
		Sleep(50);
		memset(buffer,0,sizeof(buffer));
        
        //将数字类型转为字符串
		sprintf(buffer,"%d",--dwTimer);
		SetWindowText(hEdit,buffer);

	}

	return 0;
}
void MyTest()
{
	HANDLE hThread = ::CreateThread(NULL, 0, ThreadProc,NULL, 0, NULL);			
				
			
	::CloseHandle(hThread);	
    //这里使用::符号是因为该符号代表全局函数
    //避免和其他重名函数出现调用错误			

}
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{

		case  WM_CLOSE:
		{
			EndDialog(hwndDlg, 0);
			return TRUE;
		}
		case  WM_INITDIALOG:
		{
			InitEdit(hwndDlg);
		}
		case  WM_COMMAND:
			switch (LOWORD(wParam))
			{
				case IDC_BUTTON1:		//退出按钮
				{
					MyTest();

					return TRUE;
				}
			
			}
	}
	return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MIAN), NULL, DialogProc);
	return 0;
}



3.作业

// Create.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include<Windows.h>
#include"resource.h"
#include<string.h>
#include<stdio.h>

HWND hEdit;
HWND hEdit1;

void InitEdit(HWND hwndDlg)
{
	hEdit = GetDlgItem(hwndDlg, (DWORD)IDC_EDIT1);
	SetWindowText(hEdit, "1000");
	
	hEdit1=	GetDlgItem(hwndDlg, (DWORD)IDC_EDIT2);
	SetWindowText(hEdit1, "0");
}



DWORD WINAPI ThreadProc(LPVOID lpParameter)	
{
	TCHAR buffer[10];
	memset(buffer,0,sizeof(buffer));

	GetWindowText(hEdit,buffer,10);

	DWORD dwTimer;
	sscanf(buffer,"%d",&dwTimer);

	
	while(dwTimer)
	{
		Sleep(50);
		memset(buffer,0,sizeof(buffer));
		sprintf(buffer,"%d",--dwTimer);
						
		SetWindowText(hEdit,buffer);

	}

	return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lpParameter)	
{
	TCHAR buffer1[10];
	memset(buffer1,0,sizeof(buffer1));

	GetWindowText(hEdit1,buffer1,10);

	DWORD dwTimer1;
	sscanf(buffer1,"%d",&dwTimer1);

	
	while(dwTimer1<1000)
	{
		Sleep(50);
		memset(buffer1,0,sizeof(buffer1));
		sprintf(buffer1,"%d",++dwTimer1);
						
		SetWindowText(hEdit1,buffer1);
	
	}

	return 0;
}
void MyTest()
{
	HANDLE hThread = CreateThread(NULL, 0, ThreadProc,NULL, 0, NULL);			
				
			
	CloseHandle(hThread);				

}
void MyTest1()
{
	HANDLE hThread1 = CreateThread(NULL, 0, ThreadProc1,NULL, 0, NULL);			
				
			
	CloseHandle(hThread1);				

}
void all()
{
	MyTest();
	MyTest1();
}
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{

		case  WM_CLOSE:
		{
			EndDialog(hwndDlg, 0);
			return TRUE;
		}
		case  WM_INITDIALOG:
		{
			InitEdit(hwndDlg);
		}
		case  WM_COMMAND:
			switch (LOWORD(wParam))
			{
				case IDC_BUTTON1:		//退出按钮
				{
					all();
					return TRUE;
				}
			
			}
	}
	return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MIAN), NULL, DialogProc);
	return 0;
}



 这里被0加到1000那里的while循环坑惨了,找半天不知道为什么第二个文本框为什么不懂,原来是dwTime作为循环参数,但是它本身是0,因此循环不进行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值