28win32编程基础——线程和进程1


 

程序放在硬盘就是二进制文件
跑起来的程序就是进程
进程怎么跑起来,就是靠线程跑起来
程序跑起来有一条线,就是线程
进程是静止不动的,就是4GB的空间(32位系统)
线程的动态的。
经典:
  进程就是4GB
  线程就是EIP
进程就像1个房子,线程共享房子里面的资源。


 线程,主要是学好CreateThread这个函数,这个函数大有文章

  

 

HANDLE WINAPI CreateThread(
  __in_opt   LPSECURITY_ATTRIBUTES lpThreadAttributes,  //安全属性
  __in       SIZE_T dwStackSize,                //堆栈空间
  __in       LPTHREAD_START_ROUTINE lpStartAddress,      //线程执行的函数
  __in_opt   LPVOID lpParameter,                  //传递给线程的参数
  __in       DWORD dwCreationFlags,                //以什么方式创建线程,挂起还是直接运行(等待CPU分配时间片)
  __out_opt  LPDWORD lpThreadId                  //内核中的线程id
);`

  

主要是线程传参的方法:

1、全局变量

2、线程函数中传参

#include <windows.h>
#include "resource.h"
#include <stdio.h>
#include "OutPut.h"
HINSTANCE hins;


INT_PTR CALLBACK DiaProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR  lpCmdLine,int       nCmdShow)
{
	HINSTANCE hins = hInstance;
	DialogBox(hInstance, MAKEINTRESOURCE(ID_DIALOG_THREAD),NULL,DiaProc);
	OutputDebugStringF("%d",GetLastError());
	getchar();
	return 0;
}

//线程函数
DWORD WINAPI ThreadProc(__in  LPVOID hnd){

	TCHAR sz[20];
	HWND  hwd = GetDlgItem((HWND)hnd,IDC_EDIT1);
	//SetWindowText(hwd,TEXT("1000"));
	//获取1000
	GetWindowText(hwd,sz,20);
	int Timer;
	//转为数字
	sscanf(sz,"%d",&Timer);
	while(Timer>0){
		Timer--;
		//转为字符串
		sprintf(sz,"%d",Timer);
		//放到
		SetWindowText(hwd,sz);
		Sleep(1000);
	}

	return 0;
};



void BeginCalc(HWND hwndDlg){

	HANDLE MyThread1 = ::CreateThread(NULL,NULL,ThreadProc,(LPVOID)hwndDlg,0,NULL);

	//注意这里并不是关闭线程,只是关闭句柄,只是这里不用了,线程还是存在的。
	//句柄相当于1个标识,你可以这样理解,你在学校有个学号,把你的学号撕掉了,并不代表你就死亡了,
	//如果还要使用,还有别的方法找到该线程。
	::CloseHandle(MyThread1);
}

INT_PTR CALLBACK DiaProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam){
	
	switch(uMsg)
	{
	case WM_CLOSE:
		EndDialog(hwndDlg,0);
		return 0;
	case WM_INITDIALOG:
		{
			HWND  hwd = GetDlgItem(hwndDlg,IDC_EDIT1);
			SetWindowText(hwd,TEXT("1000"));
			return 0;
		}
	case WM_COMMAND:
		{
			WORD wConid = LOWORD(wParam);
			WORD wEvent = HIWORD(wParam);
			switch(wConid)
			{
			case IDC_BUTTON_Begin:
				{
					
					if(wEvent == BN_CLICKED)
					{
						BeginCalc(hwndDlg);
						return 0;
					}else
					{
						MessageBox(0,0,0,0);
						return 0;
					}
					/*
					BeginCalc(hwndDlg);
					return 0;*/
				}
			}
		}

	}
	return 0;
};

  

posted @ 2023-10-30 16:31  一日学一日功  阅读(5)  评论(0编辑  收藏  举报