C++ CreateThread 线程函数传参

HANDLE WINAPI CreateThread(
      _In_opt_  LPSECURITY_ATTRIBUTES  lpThreadAttributes,		// 内核对象的安全属性,一般传入NULL    
      _In_      SIZE_T                 dwStackSize,				// 线程栈空间大小,传入0表示使用默认大小
      _In_      LPTHREAD_START_ROUTINE lpStartAddress,			// 新线程所执行的线程函数地址
      _In_opt_  LPVOID                 lpParameter,				// 传给线程函数的参数
      _In_      DWORD                  dwCreationFlags,			// 指定额外的标志来控制线程的创建,0表示线程创建之后立即就可以进行调度
      _Out_opt_ LPDWORD                lpThreadId				// 返回线程的ID号,传入NULL表示不需要返回该线程ID号
);

如题,我们正常情况下调用 CreateThread 时的伪代码是这样的 :

DWORD WINAPI ThreadProc(PVOID pParam){
	while(1){
		// 你的代码...
		
		Sleep(1000);
	}
}

==================================================

CreateThread(0, 0, ThreadProc,0,0,0);

一开始我很疑惑,ThreadProc 这里没有 ‘()’ 如何传入参数呢?后来我发现是我没有好好看 API 文档的原因…惭愧。其实 CreateThread 的第四个参数 LPVOID lpParameter 就已经提供了这个功能。
在这里插入图片描述

我的目的是让线程通过参数返回一个数值,供给其他位置的代码调用。

代码:

// Test_Console.cpp : 定义控制台应用程序的入口点。
// 不需要的头文件可以删掉,我懒得删除了

#include "stdafx.h"
#include <afx.h>  
#include <tchar.h>
#include <afxwin.h>
#include <Windows.h>
#include <vector>
#include <iostream>
#include <assert.h>
#include <psapi.h>
#include <tlhelp32.h>
#include <WtsApi32.h>
#include <locale.h>
#include <ShObjIdl.h>
#include <stdio.h>
#include <fstream>
#include <string>

using namespace std;

struct Info { 
    int nCopunt; 
}; 

DWORD WINAPI ThreadProc(PVOID pParam)
{
	Info* pInfo = (Info*)pParam;
	pInfo->nCopunt = 0;
	while(1){
		pInfo->nCopunt++;

		Sleep(1000);
	}

    return 0;
}




int _tmain(int argc, wchar_t* argv[])
{
	Info* pInfo;
    HANDLE hThread = CreateThread(0, 0, ThreadProc,pInfo,0,0);
	
	while(1){
		cout << info->nCopunt  << endl;
		
		Sleep(1000);
	}
	
	getchar();
	return 0;
}

效果图:(因为线程的sleep和main函数的sleep有一定的时间差所以显示的有些出入)
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值