类成员函数 创建线程 调用 类成员对象的方法,发生错误。

Linex 2007-07-03 08:37:44
XPSP2 VC6SP6 环境,Win32 SDK 编写一个线程池的演示类:
演示包含三个线程的线程池,
XThreadInfo是单个进程的类;
XThreadPool是线程池的管理类;
在XThreadPool类的WaitThreadState函数中调用成员对象(成员中的XThreadInfo的对象)的GetThread()方法,发生错误,错误信息和源代码如下:

错误信息:
--------------------Configuration: xhv_frm - Win32 Debug--------------------
Compiling...
xthrdpl.cpp
D:\tmp\XThrdPl\xthrdpl.cpp(94) : error C2819: type 'XThreadInfo' does not have an overloaded member 'operator ->'
d:\tmp\xthrdpl\xthrdpl.h(14) : see declaration of 'XThreadInfo'
D:\tmp\XThrdPl\xthrdpl.cpp(94) : error C2227: left of '->GetThread' must point to class/struct/union
D:\tmp\XThrdPl\xthrdpl.cpp(97) : error C2819: type 'XThreadInfo' does not have an overloaded member 'operator ->'
d:\tmp\xthrdpl\xthrdpl.h(14) : see declaration of 'XThreadInfo'
D:\tmp\XThrdPl\xthrdpl.cpp(97) : error C2227: left of '->GetThread' must point to class/struct/union
D:\tmp\XThrdPl\xthrdpl.cpp(100) : error C2819: type 'XThreadInfo' does not have an overloaded member 'operator ->'
d:\tmp\xthrdpl\xthrdpl.h(14) : see declaration of 'XThreadInfo'
D:\tmp\XThrdPl\xthrdpl.cpp(100) : error C2227: left of '->GetThread' must point to class/struct/union
Error executing cl.exe.
xhv_frm.exe - 6 error(s), 0 warning(s)

源代码:
/************************************************************************/
/* FileName: xthrdpl.cpp
/* Creator: ◥▼◤神勇小白兔
/* Date: 2007-7-3
/* Comment: XThreadPool Source File XThreadPool类源文件
/************************************************************************/

#include "xthrdpl.h"

XThreadInfo::XThreadInfo()
{
InitThread();
}

XThreadInfo::~XThreadInfo()
{
TerminateThread(m_hThread, 0);
CloseHandle(m_hThread);
CloseHandle(m_hEvent);
}

HANDLE XThreadInfo::GetThread()
{
ResumeThread(XThreadInfo::m_hThread);
return m_hThread;
}

int XThreadInfo::InitThread()
{
m_hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
m_hThread = CreateThread(NULL, 0, WorkThread, this, CREATE_SUSPENDED, NULL);
return 0;
}

DWORD WINAPI XThreadInfo::WorkThread(LPVOID lpParameter)
{
while(TRUE)
{
ResetEvent(((XThreadInfo*)lpParameter)->m_hEvent);
MessageBox(NULL, TEXT("Thread Started."), TEXT("WorkThread"), MB_OK | MB_ICONINFORMATION);
Sleep(2000);
MessageBox(NULL, TEXT("Thread completed."), TEXT("WorkThread"), MB_OK | MB_ICONINFORMATION);
SetEvent(((XThreadInfo*)lpParameter)->m_hEvent);
SuspendThread(((XThreadInfo*)lpParameter)->m_hThread);
}
return 0;
}


XThreadPool::XThreadPool()
{
InitThreadPool();
}

XThreadPool::~XThreadPool()
{
TerminateThread(m_hThread, 0);
CloseHandle(m_hThread);
}

HANDLE XThreadPool::GetThreadFromPool()
{
HANDLE hTmpThread;
if (NULL == m_hxtiThread)
return NULL;
else
{
hTmpThread = m_hxtiThread;
m_hxtiThread = NULL;
return hTmpThread;
}
}

int XThreadPool::InitThreadPool()
{
HANDLE m_hThread;
m_hThread = CreateThread(NULL, 0, WaitThreadState, this, 0, NULL);
return 0;
}

DWORD WINAPI XThreadPool::WaitThreadState(LPVOID lpParameter)
{
HANDLE hTmpEvent[2];
DWORD dwResult;
hTmpEvent[0] = ((XThreadPool*)lpParameter)->m_xtiThreadInfo0.m_hEvent;
hTmpEvent[1] = ((XThreadPool*)lpParameter)->m_xtiThreadInfo1.m_hEvent;
hTmpEvent[2] = ((XThreadPool*)lpParameter)->m_xtiThreadInfo2.m_hEvent;
while (TRUE)
{
dwResult = WaitForMultipleObjects(3, hTmpEvent, FALSE, INFINITE);
switch(dwResult)
{
case WAIT_OBJECT_0 + 0:
m_hxtiThread = ((XThreadPool*)lpParameter)->m_xtiThreadInfo0->GetThread();
break;
case WAIT_OBJECT_0 + 1:
m_hxtiThread = ((XThreadPool*)lpParameter)->m_xtiThreadInfo1->GetThread();
break;
case WAIT_OBJECT_0 + 2:
m_hxtiThread = ((XThreadPool*)lpParameter)->m_xtiThreadInfo2->GetThread();
break;
}
}
return 0;
}
...全文
229 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Big_Stone 2007-07-08
  • 打赏
  • 举报
回复
'XThreadInfo' does not have an overloaded
m_xtiThreadInfo2 这个东西看样子不是个对象指针吧,你用->干什么,汗。
ReverseEngineering 2007-07-04
  • 打赏
  • 举报
回复
貌似还要看看头文件。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧