如何在 MFC 中使用 _beginthreadex
Posted
技术标签:
【中文标题】如何在 MFC 中使用 _beginthreadex【英文标题】:How to use _beginthreadex in MFC 【发布时间】:2011-03-18 06:46:47 【问题描述】:我想使用_beginthreadex()
创建一个工作线程。但是,编译器说:
Error 1 error C2276: '&' : illegal operation on bound member function expression
这是我的代码:
.cpp 文件
hThread = (HANDLE)_beginthreadex( NULL, 0, &Udp_Thread, NULL, 0, &threadID ); // Function caller in main()
unsigned __stdcall CUdpSocket::Udp_Thread(void *arguments)
...
.h 文件
public:
unsigned __stdcall Udp_Thread(void *arguments);
我完全按照 MSDN 所做的,但它在我的程序中不起作用。我该怎么办?
谢谢。
【问题讨论】:
【参考方案1】:C2276:编译器发现创建指向成员的指针的语法存在问题。
您需要指定类范围。
进一步_beginthreadex
采用函数指针而不是成员函数指针。所以你必须传递一个static函数的地址。
使用这个:
classs CUdpSocket
public:
unsigned static __stdcall Udp_Thread(void *arguments);
// Function caller in main()
hThread = (HANDLE)_beginthreadex( NULL, 0, &CUdpSocket::Udp_Thread, NULL, 0, &threadID );
【讨论】:
【参考方案2】:看起来 Udp_Thread 是一个类的成员。在这种情况下,它必须是静态的,否则函数的原型不是 _beginthreadex 所期望的,因为它有一个额外的隐含成员,即指针 this。
【讨论】:
@harper:是的,它会的。该错误明确表明该函数是非静态的。 @harper,取决于编译器;你的 VC6 和这个 &CUdpSocket::Udp_Thread 不会编译(如果我没记错的话)。 :) @Marius:刚刚用 VC6 检查过。它可以与此 VC++ 版本以及较新版本的 VC++ 一起正常编译。 哦,那么糟糕。自从我使用 VC++ 以来已经有一段时间了,不知道为什么我记得它没有编译 @Marius:您必须从 VC6 更改为 VC7。使用 VC6,您可以省略 CUdpSocket:: 前缀。以上是关于如何在 MFC 中使用 _beginthreadex的主要内容,如果未能解决你的问题,请参考以下文章
_beginthread 和 CreateThread 区别
CreateThread,_beginthread与AfxbeginThread之间的区别
error: ‘_beginthreadex‘ undeclared (first use in this function); did you mean ‘SDL_beginthread‘?(代码片
win32程序创建线程用c语言库的_beginthread还是API的CreateThread?哪种用的多?
在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)