c++ 多线程

hw19886200 2011-02-27 08:27:19
为什么 c++中 用typedef unsigned int (_stdcall *PTHREAD_START)(void *);
HANDLE hThread = _beginthreadex(NULL,0,(PTHREAD_START)ScanThreadProc,NULL,CREATE_SUSPENDED,NULL);

提示我error C2440: 'type cast' : cannot convert from '' to 'unsigned int (__stdcall *)(void *)'
None of the functions with this name in scope match the target type
在c语言这么用是没有问题的 附上程序代码
小弟初学c++ 在代码上有什么不规范之处 还望大家明确指出。小弟拜谢

main.cpp
#include <iostream>
#include "scan.h"

using namespace std;

int main()
{
scan scanObject;
scanObject.StartScan();
return 0;
}


scan.h
// scan.h: interface for the scan class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SCAN_H__613A1F5B_4209_4661_B721_1B2F90BBE379__INCLUDED_)
#define AFX_SCAN_H__613A1F5B_4209_4661_B721_1B2F90BBE379__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <windows.h>
#include <process.h>

typedef struct _SCAN_INFO
{
unsigned long ulStartP;
unsigned long ulEndIP;
}SCAN_INFO,*PSCAN_INFO;

typedef struct _SCAN_RESULT
{
char szIP[16];
int nPort;
}SCAN_RESULT,*PSCAN_RESULT;

void CheckMallocFailure(PVOID pBuf);


class scan
{
public:

scan();
virtual ~scan();
BOOL StartScan();

private:

unsigned long m_ulStartIP;
unsigned long m_ulEndIP;
int m_nSetThreadCount;
int m_nThreadCount;
unsigned short m_usStartPort;
unsigned short m_usEndPort;

int m_nMaxThreadCount;//当设置的线程数超过最大数后只用最大数个线程扫描
int m_nMinIPCount;//当少于这么多扫描项 无论设置为多少线程数都只用一个线程扫描

char szStartIP[16];
char szEndIp[16];

protected:
BOOL SetStarIP();
BOOL SetEndIP();
BOOL SetThreaqdCount();
BOOL SetStartPort();
BOOL SetEndPort();
int DetermineThreadCount();
unsigned long TurnIP(char *szIP);
BOOL ResolveIPString(char *szIPString,char *szString,int nCount);//分解IP字符串

BOOL DispatchScan();//为各个线程分派任务


private:
DWORD WINAPI ScanThreadProc(LPVOID lpParam);

};

#endif // !defined(AFX_SCAN_H__613A1F5B_4209_4661_B721_1B2F90BBE379__INCLUDED_)

scan.cpp
// scan.cpp: implementation of the scan class.
//
//////////////////////////////////////////////////////////////////////

#include <iostream>
#include <WINSOCK2.H>
#pragma comment(lib,"WS2_32")
#include "scan.h"

using namespace std;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

typedef unsigned int(_stdcall *PTHREAD_START)(void *);

scan::scan()
{
m_ulEndIP = 0;
m_ulStartIP = 0;
m_nSetThreadCount = 1;
m_usEndPort = 0;
m_usStartPort = 0;
m_nMaxThreadCount = 10;
m_nMinIPCount = 10000;

WSAData wsaData;
WORD wSockVersion = MAKEWORD(2,2);
WSAStartup(wSockVersion,&wsaData);

}

scan::~scan()
{
WSACleanup();
}

BOOL scan::SetStarIP()
{
cout<<"请输入起始IP地址:";
cin>>szStartIP;


return TRUE;
}

BOOL scan::SetEndIP()
{
cout<<"请输入结束IP地址:";
cin>>szEndIp;


return TRUE;
}

BOOL scan::SetThreaqdCount()
{
cout<<"请输入您想启动的线程数:";
cin>>m_nSetThreadCount;
return TRUE;
}
BOOL scan::SetStartPort()
{
cout<<"请输入起始端口号:";
cin>>m_usStartPort;
return TRUE;
}
BOOL scan::SetEndPort()
{
cout<<"请输入结束端口号:";
cin>>m_usEndPort;
return TRUE;
}

BOOL scan::StartScan()
{
SetStarIP();
SetEndIP();
SetStartPort();
SetEndPort();
SetThreaqdCount();

m_usStartPort = TurnIP(szStartIP);
m_usEndPort = TurnIP(szEndIp);

m_nThreadCount = DetermineThreadCount();


return TRUE;
}

BOOL scan::DispatchScan()
{
int nIPCount = 0;
nIPCount = (m_usEndPort - m_usStartPort)/m_nThreadCount;

for (int i = 0 ; i < m_nThreadCount; i++)
{
PSCAN_INFO scanpInfo;

scanpInfo = (PSCAN_INFO)malloc(sizeof(SCAN_INFO));
CheckMallocFailure(scanpInfo);

scanpInfo->ulStartP = m_usStartPort + nIPCount * i;
scanpInfo->ulEndIP = scanpInfo->ulStartP + nIPCount - 1;

HANDLE hThread = (HANDLE)_beginthreadex(NULL,0,(PTHREAD_START)ScanThreadProc,NULL,CREATE_SUSPENDED,NULL);
}
return TRUE;
}

int scan::DetermineThreadCount()
{
if ((m_usEndPort - m_usStartPort)*(m_usEndPort - m_usStartPort)<1000)
{
return m_nThreadCount;
}
if (m_nSetThreadCount > m_nMaxThreadCount)
{
return m_nMaxThreadCount;
}
return m_nSetThreadCount;
}

unsigned long scan::TurnIP(char *szIP)
{
char szIpField[4][4] = {0};
unsigned long ulIPadd = 0;
BYTE bIP[4] = {0};
for (int i = 0;i < 4; i++)
{
ResolveIPString(szIP,szIpField[i],i+1);
int nTemp = atoi(szIpField[i]);
bIP[i] = (BYTE)nTemp;
}
ulIPadd = (bIP[0]<<24) + (bIP[1]<<16) + (bIP[2]<<8) + (bIP[3]<<3);
return ulIPadd;
}

BOOL scan::ResolveIPString(char *szIPString,char *szString,int nCount)
{
int nTemp = 0;
while (TRUE)
{

if (*szIPString == '.')
{
nTemp++;
szIPString++;
}
if (nTemp == nCount||*szIPString == '\0')
{
break;
}
if (nTemp == nCount -1)
{
*szString = *szIPString;
szString++;
}

szIPString++;

}
return TRUE;
}

void CheckMallocFailure(PVOID pBuf)
{
if (!pBuf)
{
MessageBox(NULL,TEXT("分配内存出错!"),TEXT("错误!"),MB_OK);
exit(1);
}
}
DWORD WINAPI scan::ScanThreadProc(LPVOID lpParam)
{
return 0;
}
...全文
157 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
太乙 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hw19886200 的回复:]

引用 1 楼 pengzhixi 的回复:
线程函数如果想用类成员函数的话,那么该成员函数声明为静态的吧
果然改为静态的即可 这是一个神马原因了?
[/Quote]因为要在外部调用你的类成员函数,而类成员函数会绑定到对象!没有对象传入,外部不能调用该函数!
全局函数和静态类成员函数可以直接访问!
qq120848369 2011-02-27
  • 打赏
  • 举报
回复
调用方式不一样.
niexin5200 2011-02-27
  • 打赏
  • 举报
回复
好像可以这么理解,你这个线程函数是作为scan类的成员函数滴,既然是成员函数,在创建新线程时就需要构造一个对象,通过这个对象来调用线程函数,但是编译器又不知道构造哪个对象,而作为静态函数,是属于整个类的,不是属于某一个对象,所以可以在创建新线程的函数中直接调用。记得孙鑫的《vc++深入详解》的15章多线程里边提到过这个问题,好像是我上边说的那样,记不清了
look_back 2011-02-27
  • 打赏
  • 举报
回复
static 函数才可以,看书。。
pengzhixi 2011-02-27
  • 打赏
  • 举报
回复
额,你去看线程函数的调用约定吧
昵称很不好取 2011-02-27
  • 打赏
  • 举报
回复
类中成员函数与一般函数调用协议不同
hw19886200 2011-02-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
线程函数如果想用类成员函数的话,那么该成员函数声明为静态的吧
[/Quote] 果然改为静态的即可 这是一个神马原因了?
pengzhixi 2011-02-27
  • 打赏
  • 举报
回复
线程函数如果想用类成员函数的话,那么该成员函数声明为静态的吧

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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