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