GetQueuedCompletionStatus 为什么失败? 本帖最后由 q860880076 于 2011-01-19 12:50:49 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是不是你的GetQueuedCompletionStatus的第一个参数IOCP的句柄不对了? 不是所有线程里的 GetQueuedCompletionStatus 都失败 . 几个线程里的 hIoCompletionPort 都是一样的... 你传递给线程的参数hServer不会是个局部变量吧? 不是 , 是 HeapAlloc 分配的内存 每个 hServer 都有一个 Heap HeapCreate 然后在其中分配内存 收发缓冲区都是在这个 Heap 中分配的 是这样创建线程的 // // 创建 hServer 并为其赋值 // 2011/01/17 HSERVER hServer = (HSERVER)HeapAlloc( hHeap, HEAP_ZERO_MEMORY, sizeof(SERVER)); if (!hServer) { // HeapAlloc 失败 HeapDestroy(hHeap); closesocket(ListenSocket); CloseHandle(hIoCompletionPort); return NULL; } hServer->hHeap = hHeap; hServer->ListenSocket = ListenSocket; hServer->hIoCompletionPort = hIoCompletionPort; hServer->ITS_CallBack = CallBack; hServer->WTC = SysInf.dwNumberOfProcessors * 2; hServer->Handle_table = Handle_table; hServer->hThread_accept = 0; // // 创建工作者线程 并将线程句柄 赋值到 Handle_table // 2011/01/17 HANDLE hThread; int j = 0; for (DWORD i=0;i<(SysInf.dwNumberOfProcessors * 2);i++) { hThread = CreateThread( NULL, 0, WorkerThread, hServer, 0, NULL); if (hThread) { j++; *(PDWORD)(Handle_table + i * 4) = (DWORD)hThread; } } if (!j) { // 0个线程被创建 HeapDestroy(hHeap); closesocket(ListenSocket); CloseHandle(hIoCompletionPort); return NULL; } 终于找到原因了.... Handle_table 是 PDWORD*(PDWORD)(Handle_table + i * 4) = (DWORD)hThread; 错误的 , 导致 hServer 遭到破坏...*(PHANDLE)(Handle_table + i) = hThread; 应该是这样的或者*(PHANDLE)((DWORD)Handle_table + i * 4) = hThread; 如何把24位真彩位图转换为8位灰度图?并保存到磁盘上. 显示多个视图窗口问题 关于存储过程字符串变量的一点疑问 遇到一个问题 请大家帮我看看这个的参数应该怎么给 WM_CHAR消息接收上下左右四个键 多线程程序怎样调试.大家说说 有没有将c语言转化为汇编的东西呀,急!!! 我怎么样才能做到一下子控制多个静态控件? UDP 收包失序时如何判定有丢包 关于VSFilter字幕的问题 请教系统托盘栏图标的问题
不是 , 是 HeapAlloc 分配的内存
//
// 创建 hServer 并为其赋值
// 2011/01/17 HSERVER hServer = (HSERVER)HeapAlloc(
hHeap,
HEAP_ZERO_MEMORY,
sizeof(SERVER));
if (!hServer)
{ // HeapAlloc 失败
HeapDestroy(hHeap);
closesocket(ListenSocket);
CloseHandle(hIoCompletionPort);
return NULL;
}
hServer->hHeap = hHeap;
hServer->ListenSocket = ListenSocket;
hServer->hIoCompletionPort = hIoCompletionPort;
hServer->ITS_CallBack = CallBack;
hServer->WTC = SysInf.dwNumberOfProcessors * 2;
hServer->Handle_table = Handle_table;
hServer->hThread_accept = 0; //
// 创建工作者线程 并将线程句柄 赋值到 Handle_table
// 2011/01/17
HANDLE hThread;
int j = 0;
for (DWORD i=0;i<(SysInf.dwNumberOfProcessors * 2);i++)
{
hThread = CreateThread(
NULL,
0,
WorkerThread,
hServer,
0,
NULL);
if (hThread)
{
j++;
*(PDWORD)(Handle_table + i * 4) = (DWORD)hThread;
}
}
if (!j)
{ // 0个线程被创建
HeapDestroy(hHeap);
closesocket(ListenSocket);
CloseHandle(hIoCompletionPort);
return NULL;
}
*(PDWORD)(Handle_table + i * 4) = (DWORD)hThread; 错误的 , 导致 hServer 遭到破坏...
*(PHANDLE)(Handle_table + i) = hThread; 应该是这样的
或者
*(PHANDLE)((DWORD)Handle_table + i * 4) = hThread;