VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 891|回复: 7

关于BeginThreadex()函数,高手指教一下

[复制链接]

3

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-3-10 19:00:01 | 显示全部楼层 |阅读模式
问题(1)在一个类的成员函数的程序中我有以下语句:

h[0]=(HANDLE)::_beginthreadex(NULL,0,bank_allocation,NULL,0,&uld);

其中bank_allocation是类中另一个成员函数的名称,其声明如下:

UINT __stdcall Cresource::bank_allocation(LPVOID lpParam);

编绎出错(出错位置就是上面使用beginThreadex()处),提示如下:
G:\resource\resource.cpp(100) : error C2664: '_beginthreadex' : cannot convert parameter 3 from 'unsigned int (void *)' to 'unsigned int (__stdcall *)(void *)'
        None of the functions with this name in scope match the target type
出错原因是参数类型不对,想不通,bank_allocation()这个函数的类型我已经声明为UINT __stdcall 了啊,高手指教一下,
(2)如何使用beginThreadex向新线程传递参数?比如,要传一个整形变量
回复

使用道具 举报

0

主题

3

帖子

0.00

积分

新手上路

Rank: 1

积分
0.00
发表于 2020-3-12 09:26:14 | 显示全部楼层
如果线程入口是类的成员函数,则必须定义为 static UINT __stdcall ThreadRun(void* p)这种形式,函数名随意。
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-6-22 13:45:01 | 显示全部楼层
static unsigned __stdcall bank_allocation(LPVOID);

这样声明
回复

使用道具 举报

0

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-6-24 13:15:01 | 显示全部楼层
成员函数有this指针,这样在启动线程时,参数不匹配。
所以得用静态成员函数
回复

使用道具 举报

0

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-6-24 18:45:01 | 显示全部楼层
unsigned long _beginthreadex( void *security, unsigned stack_size, unsigned ( __stdcall *start_address )( void * ), void *arglist, unsigned initflag, unsigned *thrdaddr );

arglist就是参数
回复

使用道具 举报

0

主题

14

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-7-8 19:15:01 | 显示全部楼层
遇到过同样的问题,报错说参数不匹配,声明成static后无错误
回复

使用道具 举报

2

主题

16

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-7-14 00:15:01 | 显示全部楼层
两种方法:
只接在文件中声明,不在类之中
使用static
回复

使用道具 举报

3

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-7-16 12:00:01 | 显示全部楼层
static unsigned __stdcall bank_allocation(LPVOID);
这样声明不行吧,静态函数成员的参数不是要加一个类的引用吗?也就是下面的
static unsigned __stdcall bank_allocation(LPVOID,Cresource &);
但我做这样修改后编绎还是出错了,(不加也出错),提示如下:
c:\documents and settings\h\桌面\resource\resource.cpp(152) : error C2664: '_beginthreadex' : cannot convert parameter 3 from 'unsigned int (void *,class Cresource &)' to 'unsigned int (__stdcall *)(void *)'

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表