如何在 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?哪种用的多?

如何在 MFC 中使用 _beginthreadex

在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)