为了账号安全,请及时绑定邮箱和手机立即绑定

如下还要定义什么东西?还有填进去的东西到底是什么意思?

如下还要定义什么东西?还有填进去的东西到底是什么意思?

API
慕哥6287543 2022-07-14 15:11:24
CreateThread()里的六个参数里的第3个和第四个参数(LPTHREAD_START_ROUTINE lpStartAddress和 LPVOID lpParameter)要怎么填?
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

一、Windows API函数。该函数在主线程的基础上创建一个新线程。微软在Windows API中提供了建立新的线程的函数CreateThread。

二、CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤:

1.在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回

2.把线程退出码置为STILL_ACTIVE,把线程挂起计数置1

3.分配context结构

4.分配两页的物理存储以准备栈,保护页设置为PAGE_READWRITE,第2页设为PAGE_GUARD

5.lpStartAddr和lpvThread值被放在栈顶,使它们成为传送给StartOfThread的参数

6.把context结构的栈指针指向栈顶(第5步)指令指针指向startOfThread函数

三、MSDN中CreateThread原型:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD

SIZE_T dwStackSize,//initialstacksize

LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction

LPVOID lpParameter,//threadargument

DWORD dwCreationFlags,//creationoption

LPDWORD lpThreadId//threadidentifier

)

processthreadsapi.h中CreateThread原型:

WINBASEAPI

_Ret_maybenull_

HANDLE

WINAPI

CreateThread(

_In_opt_LPSECURITY_ATTRIBUTES lpThreadAttributes,

_In_SIZE_T dwStackSize,

_In_LPTHREAD_START_ROUTINE lpStartAddress,

_In_opt___drv_aliasesMemLPVOID lpParameter,

_In_DWORD dwCreationFlags,

_Out_opt_LPDWORD lpThreadId

);

四、示例:


查看完整回答
反对 回复 2022-07-18
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

关于六个参数:第一个是所创线程的安全属性,多设置为NULL; 第二个是所创线程堆栈的大小,多设为0; 第三个是你创建的线程的地址;(此处应为你的线程函数的函数名) 第四个是传递给你的线程函数的参数; 第五个是表示你创建的线程是否立即执行,设为0则立即执行; 第六个则是你创建线程的ID号,设为NULL就行。关于线程你要知道他有一个对应的线程函数,你创建线程后即执行你的函数(若你指定第五个参数为0立即执行,所执行的函数即为第三个参数)对于二楼他设置了一个等待,若无此等待可能会导致创建线程的函数已经退出,而你的线程却还在运行。

查看完整回答
反对 回复 2022-07-18
?
RISEBY

TA贡献1856条经验 获得超5个赞

(1)LPTHREAD_START_ROUTINE lpStartAddress 指定了线程函数的起始地址,新建线程将从此地址开始执行,直到return语句返回,把控制权交给操作系统。
(2)LPVOID lpParameter 则是传递给线程函数的参数,也即传递给(1)中指定的线程函数的地址。
以下是一个例子:创建线程后,将转到线程函数执行,遇到return语句后返回到main函数。

#include <iostream>
#include <windows.h>

using namespace std;

/*ThreadProc为LPTHREAD_START_ROUTINE lpStartAddress
*参数指定的线程函数.lpParam则是LPVOID lpParameter指
*定的传递给线程函数的参数*/

DWORD WINAPI ThreadProc(LPVOID lpParam)
{
for (int i = 0;i < 20;++i)
{
cout << "I am from a thread,count = " << i <<endl;
}

return 0;
}

int main()
{
HANDLE hThread;
DWORD dwThreadID;

hThread = ::CreateThread(
NULL,
NULL,
ThreadProc, // 线程入口地址
NULL,
0,
&dwThreadID);

::WaitForSingleObject(hThread,INFINITE);
::CloseHandle(hThread);

return 0;
}


查看完整回答
反对 回复 2022-07-18
  • 3 回答
  • 0 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号