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; };