C++ Win32 CreateThread()参数为零';预计起飞时间?
形势C++ Win32 CreateThread()参数为零';预计起飞时间?,c++,multithreading,sockets,winapi,C++,Multithreading,Sockets,Winapi,形势 static HANDLE UDPListen(ListenData UDPListenData) { HANDLE NetworkThread; NetworkThread = CreateThread( NULL, //Default security 0, //Default th
static HANDLE UDPListen(ListenData UDPListenData)
{
HANDLE NetworkThread;
NetworkThread = CreateThread(
NULL, //Default security
0, //Default thread stack size
Network::Operations::Listen, //Thread function name
&UDPListenData, //Thread arguments
0, //Default creation flags
NULL);
//CloseHandle(NetworkThread);
return NetworkThread;
}
static DWORD WINAPI Listen(void *param)
{
ListenData *UDPServ = (ListenData*)param;
SOCKET Socket = UDPServ->LocalUDPSocket;
std::vector<Net> *Network = UDPServ->pNetwork;
直到昨天,我的线程代码还可以正常工作。但是现在,我的线程参数在传递到线程时被归零并移动
main.cpp中的相关代码
//First socket: UDP | Second Socket: TCP
std::pair<SOCKET, SOCKET> ServerSockets = Network::Operations::Server();
SOCKET UDPSocket = ServerSockets.first;
//Need to pass two arguments to the thread, when it only accepts one pointer. So create a struct and send the pointer.
ListenData UDPServ;
UDPServ.pNetwork = &Network;
UDPServ.LocalUDPSocket = UDPSocket;
//Set up the listener.
HANDLE UDPListener = Network::Operations::UDPListen(UDPServ);
在这种状态下,值与它们应该的一样
Listen()中的相关代码
静态DWORD WINAPI侦听(void*param)
{
ListenData*UDPServ=(ListenData*)参数;
套接字SOCKET=UDPServ->LocalUDPSocket;
std::vector*Network=UDPServ->pNetwork;
然而现在,UDPSocket
是零,pNetwork
是103。这是一个谜
我真正更改的唯一代码是初始化服务器的代码,我将其修改为包含绑定TCP套接字。该函数用于返回单个
socket
,但现在返回一个std::pair
,您将指针传递到堆栈中的本地数据-&UDPListenData
,但该数据随后就变得未定义erUDPListen
return。您可能需要这样的代码
ListenData* UDPServ = new ListenData;
// init UDPServ
HANDLE NetworkThread = CreateThread(
NULL, //Default security
0, //Default thread stack size
Network::Operations::Listen, //Thread function name
UDPServ, //Thread arguments
0, //Default creation flags
NULL);
if (!NetworkThread) delete UDPServ;
//...
static DWORD WINAPI Listen(void *param)
{
ListenData *UDPServ = (ListenData*)param;
SOCKET Socket = UDPServ->LocalUDPSocket;
std::vector<Net> *Network = UDPServ->pNetwork;
//...
delete UDPServ;
}
listenda*UDPServ=新的listenda;
//初始化UDPServ
HANDLE NetworkThread=CreateThread(
NULL,//默认安全性
0,//默认线程堆栈大小
网络::操作::侦听,//线程函数名
UDPServ,//线程参数
0,//默认创建标志
无效);
如果(!NetworkThread)删除UDPServ;
//...
静态DWORD WINAPI侦听(void*param)
{
ListenData*UDPServ=(ListenData*)参数;
套接字SOCKET=UDPServ->LocalUDPSocket;
std::vector*Network=UDPServ->pNetwork;
//...
删除UDPServ;
}
我怀疑您应该通过引用传递UDPListenData
:静态句柄UDPListen(listenda&UDPListenData)
。当前,您似乎正在获取通过值传递的临时参数的地址:&UDPListenData
仍然丢失值:S@SyntheticAscension-所以您的代码中仍然存在一些错误,这些错误是不可见的。但在以前的代码中,将堆栈中的临时对象指针传递到另一个线程中肯定会出现错误。现在,请不要担心,谢谢s、 关于UDPListen()
在另一个函数访问值之前返回一个值的问题,您是对的。我在main中声明UDPServ
,然后传递地址。