_beginthread创建进行,这个函数是标准库函数,可移植,其实这个函数也是调用CreateThread系统函数,不推荐使用CreateThread函数

#include <process.h>/* function prototypes */_CRTIMP uintptr_t __cdecl  //返回值为HANDLE hStdOut的新线程句柄,如果失败返回-1
_beginthread (
_In_ void (__cdecl * _StartAddress) (void *), //线程函数启动地址,_StartAddress为线程函数启动地址
_In_ unsigned _StackSize, //堆栈空间大小
_In_opt_ void * _ArgList //传递给_StartAddress线程函数的参数列表,没有参数时设置为NULL
);_CRTIMP void __cdecl _endthread(void); //暴力结束 线程_CRTIMP uintptr_t __cdecl
_beginthreadex(
_In_opt_ void * _Security, //安全属性,默认安全属性为NULL
_In_ unsigned _StackSize, //堆栈空间大小_In_ unsigned (__stdcall * _StartAddress) (void *),  //启动线程函数_In_opt_ void * _ArgList,  //参数列表
_In_ unsigned _InitFlag,  //新线程的工作状态,0表示立即执行,还有CREATE_SUPPEND表示创建后挂起
_Out_opt_ unsigned * _ThrdAddr //输出线程ID
);_CRTIMP void __cdecl _endthreadex(_In_ unsigned _Retval);

MFC中创建线程
AfxBeginThread创建线程,

CWinThread* AFXAPI  //返回值是线程指针
AfxBeginThread(
CRuntimeClass* pThreadClass, //线程函数,全局函数或是类的静态函数
int nPriority,
UINT nStackSize,//堆栈大小
DWORD dwCreateFlags, 创建标记
LPSECURITY_ATTRIBUTES lpSecurityAttr //安全属性
s)

实例练习

// ThreadB.cpp : 定义应用程序的入口点。
//#include "stdafx.h"
#include "ThreadB.h"
#include <process.h>#define MAX_LOADSTRING 100VOID ThreadB(PVOID pVoid);
VOID ThreadC(PVOID pVoid);// 全局变量:
HINSTANCE hInst;                                // 当前实例
TCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名HWND hWnd;
int ixClient = 0;
int iyClient = 0;
int iLeft,iRight,iTop,iBottom;
int iRed,iGreen,iBlue;
BOOL bRunning = TRUE;
TCHAR szBuffer[256];// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR    lpCmdLine,int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);// TODO: 在此放置代码。MSG msg;HACCEL hAccelTable;// 初始化全局字符串LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_THREADB, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// 执行应用程序初始化:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_THREADB));// 主消息循环:while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam;
}//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
//  注释:
//
//    仅当希望
//    此代码与添加到 Windows 95 中的“RegisterClassEx”
//    函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
//    这样应用程序就可以获得关联的
//    “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style           = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra      = 0;wcex.cbWndExtra        = 0;wcex.hInstance     = hInstance;wcex.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_THREADB));wcex.hCursor       = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName  = MAKEINTRESOURCE(IDC_THREADB);wcex.lpszClassName  = szWindowClass;wcex.hIconSm       = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));return RegisterClassEx(&wcex);
}//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{hInst = hInstance; // 将实例句柄存储在全局变量中hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;RECT rect;switch (message){case WM_CREATE:GetWindowRect(hWnd,&rect);ixClient = rect.right;iyClient = rect.bottom;wsprintf(szBuffer,TEXT("x = %d\ny = %d\n"),ixClient,iyClient);MessageBox(hWnd,szBuffer,TEXT("测试"),MB_OK);break;case WM_SIZE:GetWindowRect(hWnd,&rect);ixClient = rect.right;iyClient = rect.bottom;_beginthread(ThreadB,0,NULL);_beginthread(ThreadC,0,NULL);break;case WM_COMMAND:wmId    = LOWORD(wParam);wmEvent = HIWORD(wParam);// 分析菜单选择:switch (wmId){case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_EXIT:DestroyWindow(hWnd);break;case IDM_STOPRUN:bRunning = FALSE;MessageBox(hWnd,TEXT("停止绘图"),TEXT("调试"),MB_OK);break;case IDM_STARTRUN:bRunning = TRUE;_beginthread(ThreadB,0,NULL);_beginthread(ThreadC,0,NULL);MessageBox(hWnd,TEXT("开始绘图"),TEXT("调试"),MB_OK);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}break;case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: 在此添加任意绘图代码...EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}break;}return (INT_PTR)FALSE;
}VOID ThreadB(PVOID pVoid)
{HDC hdc = GetDC(hWnd);//RECT rect = {100,100,500,400};srand(GetTickCount());while(bRunning){iLeft   = rand() % ixClient;iRight  = rand() % ixClient;iTop    = rand() % iyClient;iBottom = rand() % iyClient;iRed    = rand() % 255;iGreen  = rand() % 255;iBlue   = rand() % 255;HPEN hPen = CreatePen(rand()%8,rand()%10,RGB(iRed,iGreen,iBlue));SelectObject(hdc,hPen);iRed    = rand() % 255;iGreen  = rand() % 255;iBlue   = rand() % 255;HBRUSH hBrush = CreateSolidBrush(RGB(iRed,iGreen,iBlue));SelectObject(hdc,hBrush);Rectangle(hdc,min(iLeft,iRight),min(iTop,iBottom),max(iLeft,iRight),max(iTop,iBottom));Sleep(1300);}ReleaseDC(hWnd,hdc);
}VOID ThreadC(PVOID pVoid)
{HDC hdc = GetDC(hWnd);//RECT rect = {100,100,500,400};srand(GetTickCount());while(bRunning){iLeft   = rand() % ixClient;iRight  = rand() % ixClient;iTop    = rand() % iyClient;iBottom = rand() % iyClient;iRed    = rand() % 255;iGreen  = rand() % 255;iBlue   = rand() % 255;HPEN hPen = CreatePen(rand()%8,rand()%10,RGB(iRed,iGreen,iBlue));SelectObject(hdc,hPen);iRed    = rand() % 255;iGreen  = rand() % 255;iBlue   = rand() % 255;HBRUSH hBrush = CreateSolidBrush(RGB(iRed,iGreen,iBlue));SelectObject(hdc,hBrush);Ellipse(hdc,min(iLeft,iRight),min(iTop,iBottom),max(iLeft,iRight),max(iTop,iBottom));Sleep(800);}ReleaseDC(hWnd,hdc);
}

53.创建线程_beginthread相关推荐

  1. 创建线程——_beginthread 和 _beginthreadex【方法2】

    并不是Windows标准API,创建线程函数,该函底层调用CreateThread. 头文件 #include <process.h> 函数原型 unsigned long _begint ...

  2. _beginthread和CreateThread 创建线程

    建立一个线程. unsigned long beginthread(void(cdecl *startaddress)(void*),unsigned stacksize, void *arglist ...

  3. 29-30Python多线程、多线程、使用threading模块创建线程;JSON数据解析、编码为JSON类型转换对应表、Python类型转换对应表、json.dumps与json.loads

    29Python3多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些 ...

  4. windows系统中创建线程常用哪几个函数,有什么区别?

    windows系统中创建线程常用哪几个函数? 在windows系统中创建线程的函数有: CreadThread,AfxBeginThread,_beginthread,_beginthreadex. ...

  5. C++创建线程实现自动保存队列中的数据

    多线程 互斥量mutex CreateMutex()函数可用来创建一个有名或无名的互斥量对象 互斥量: 采用互斥对象机制.互斥锁,像一个物件,这个物件只能同时被一个线程持有. 只有拥有互斥对象的线程才 ...

  6. c语言createthread函数,C++中CreateThread函数创建线程的用法和实例

    CreateThread是一种微软在Windows API中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程.线程终止运行后,线程对象仍然在系统中,必须通过CloseHandle函数来关 ...

  7. c++创建线程:CreateThread 和pthread_create和 _beginthreadex

    CreateThread 在 Windows 中,您可以使用 CreateThread() 来创建线程,创建的线程在调用进程的虚拟地址空间中运行.  HANDLE CreateThread(   LP ...

  8. C++:多线程中的小白(2)线程启动、结束、创建线程、join、detach

    目录 一.范例演示:线程运行的开始和结束 二.其他创建线程的手法 一.范例演示:线程运行的开始和结束 (1)thrad (2)join()函数 (3)detach()函数 (4)joinable()函 ...

  9. Linux创建线程时 内存分配的那些事

    文章目录 问题描述 问题分析 针对问题1 的猜测: 针对问题2 的猜测: 原理追踪 总结 问题描述 事情开始于一段内存问题,通过gperf工具抓取进程运行过程中的内存占用情况. 分析结果时发现一个有趣 ...

  10. C++多线程:thread类创建线程的多种方式

    文章目录 描述 函数成员简介 总结 描述 头文件 <thread> 声明方式:std::thread <obj> 简介 线程在构造关联的线程对象时立即开始执行,从提供给作为构造 ...

最新文章

  1. 关于html5和css3的新特性
  2. SAP不同的产品是如何支持用户创建自定义字段的
  3. java bean 监听_事件监听器?将JavaBeans接通起来的方法
  4. 【ARC103D】Distance Sums【树论】【构造】
  5. 7种方法让你养出干净的肺
  6. Spring Security相关
  7. 以后别写程序了,几个程序员很有用的源码网站奉献给大家
  8. xtrabackup 升级 mysql_使用percona-xtrabackup-2.0.8将MySQL从5.1.73升级到5.6.36
  9. HDU 5387 Clock(分数类+模拟)
  10. Blueprint:一个让你获取示例代码的Flash Builder扩展
  11. python setup_简述python setup.py install的过程
  12. 回溯算法与八皇后问题
  13. BZOJ 4516 后缀数组+ST+set
  14. java listbook,java,_Java泛型问题,在编译时,提示警告: 需要: ListT 找到: ListBookDetails,java - phpStudy...
  15. 1万字说清楚Receiver Operating curve(ROC) 受试者操作特征曲线
  16. 下载虚拟机安装linux镜像(图形化)
  17. 金融用计算机,CFA考试指定计算器使用攻略
  18. 属于C语言类型标识符的是,【单选题】以上不属于简单比较法的缺点的是( )
  19. 微信登录的时候总是显示错误
  20. AMD CPU 历史表

热门文章

  1. 数据库查询优化-添加索引
  2. 虚拟人的手工前世和AI今生
  3. 书籍推荐系列之一 -- 《凤凰项目:一个IT运维的传奇故事》
  4. rpg存档修改网站_Switch上国宝级欧美版RPG游戏推荐
  5. 微信红包发送关键代码
  6. Apache + svn 服务搭建
  7. 基于微信小程序的线上点餐平台
  8. mysql 笛卡尔积
  9. Dwg,png,jpg,Dxf格式转换
  10. Q学习(Q-learning)简单理解