0
点赞
收藏
分享

微信扫一扫

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 就已经提供了这个功能。

C++ CreateThread 线程函数传参_应用程序

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

代码:

// 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有一定的时间差所以显示的有些出入)

C++ CreateThread 线程函数传参_应用程序_02



举报

相关推荐

0 条评论