Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 头文件中定义的线程函数给出类型转换错误_C++_Multithreading_Visual Studio 2010 - Fatal编程技术网

C++ 头文件中定义的线程函数给出类型转换错误

C++ 头文件中定义的线程函数给出类型转换错误,c++,multithreading,visual-studio-2010,C++,Multithreading,Visual Studio 2010,请看一下下面的代码 Server.h #pragma once class Server { public: Server(void); ~Server(void); DWORD WINAPI serverThread(LPVOID param); private: SOCKADDR_STORAGE from; int retval, fromlen, socket_type; char servstr[NI_MAXSERV],hoststr[

请看一下下面的代码

Server.h

#pragma once
class Server
{
public:
    Server(void);
    ~Server(void);

    DWORD WINAPI serverThread(LPVOID param);

private:
    SOCKADDR_STORAGE from;
    int retval, fromlen, socket_type;
    char servstr[NI_MAXSERV],hoststr[NI_MAXHOST];
    SOCKET serverSocket, acceptSocket;
};
Server.cpp

这里显示了一小部分

此代码正在生成错误

 error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'LPTHREAD_START_ROUTINE'
那是从电话线传来的

hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) serverThread,(LPVOID)acceptSocket,0,&threadId);

为什么会这样?请帮忙

非静态方法与静态或全局方法的类型不同。请记住,非静态成员函数有一个隐藏参数,即
this
指针,因此您的
serverThread
函数本质上具有如下签名:

DWORD WINAPI serverThread(Server *this, LPVOID param);
所以,你可以看到为什么这不起作用(甚至连演员都不起作用——奇怪的恐怖会发生)

为了使其与LPTHREAD_START_例程兼容,您需要将其设置为静态,因为静态成员函数不在类的特定实例上操作,因此不需要
指针:

static DWORD WINAPI serverThread(LPVOID param);
而不是将acceptSocket作为lpParameter传递给CreateThread,而是传递该参数:

hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)serverThread, this,0,&threadId);

在serverThread内部,您仍然可以通过服务器对象访问acceptSocket成员。

非静态方法的类型与静态或全局方法不同。请记住,非静态成员函数有一个隐藏参数,即
this
指针,因此您的
serverThread
函数本质上具有如下签名:

DWORD WINAPI serverThread(Server *this, LPVOID param);
所以,你可以看到为什么这不起作用(甚至连演员都不起作用——奇怪的恐怖会发生)

为了使其与LPTHREAD_START_例程兼容,您需要将其设置为静态,因为静态成员函数不在类的特定实例上操作,因此不需要
指针:

static DWORD WINAPI serverThread(LPVOID param);
而不是将acceptSocket作为lpParameter传递给CreateThread,而是传递该参数:

hdl = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)serverThread, this,0,&threadId);

在serverThread内部,您仍然可以通过服务器对象访问acceptSocket成员。

A
DWORD(WINAPI服务器::*)(LPVOID)
不是
DWORD(WINAPI*)(LPVOID)
@chris:OK,那么您的意思是不能将其放入头文件?@JesseGood:不,不是。没有公认的答案。并且没有头文件。您必须将serverThread函数定义为静态函数,而不是类成员。
DWORD(WINAPI服务器:*)(LPVOID)
不是
DWORD(WINAPI*)(LPVOID)
@chris:OK,那么您的意思是不能将其纳入头文件?@JesseGood:不,不是。没有公认的答案。并且没有头文件。您必须将serverThread函数定义为静态函数,而不是类成员。hmmm。。。有趣!不管怎么说,不需要的静态内容会在将来产生问题,不是吗?在这种情况下,我需要在.cpp中定义它并初始化它,而不是在.h right?@Yohan中。这实际上是一个非常常见的静态成员函数的有效用法。您只需将其用作“垫片”,将传递给线程的参数转换为指向类实例的指针,然后在该指针上调用某个成员函数。我不知道你说的“初始化”是什么意思,因为你不必初始化函数。与所有成员函数一样,您可以在头文件中声明它并在单独的
.cpp
文件中定义它,也可以在头文件中声明它。谢谢!我真的很感谢你的帮助:)@NikBougalis:非常感谢你的编辑:)嗯。。。有趣!不管怎么说,不需要的静态内容会在将来产生问题,不是吗?在这种情况下,我需要在.cpp中定义它并初始化它,而不是在.h right?@Yohan中。这实际上是一个非常常见的静态成员函数的有效用法。您只需将其用作“垫片”,将传递给线程的参数转换为指向类实例的指针,然后在该指针上调用某个成员函数。我不知道你说的“初始化”是什么意思,因为你不必初始化函数。与所有成员函数一样,您可以在头文件中声明它并在单独的
.cpp
文件中定义它,也可以在头文件中声明它。谢谢!非常感谢您的帮助:)@NikBougalis:非常感谢您的编辑:)