求助 CreateThread 失败,GetLastError 返回8

VCHelp之乐天蛋黄派 2010-09-12 03:16:59

DWORD CSecServerDlg::Init()
{
WSADATA wsd;
sockaddr_in si;
WNDCLASS ws;
DWORD dwID;

int n = sizeof(REGISTE_DATA);

g_pMain = this;
m_dwCurrentGroundId = 1;
m_sock_regserver = INVALID_SOCKET;
m_bTakeMouse = FALSE;
m_hPerView = NULL;
m_strMsg = TEXT("授权信息:未注册免费试用版");
m_bChangePass = FALSE;
m_bConnectToRegServer = TRUE;

//保存工作路径
GetCurrentDirectory(MAX_PATH, m_szWorkPath);

InitializeCriticalSection (&g_cs_client);
InitializeCriticalSection (&g_cs_ground);
InitializeCriticalSection (&g_cs_cfg);
InitializeCriticalSection (&g_cs_thread);

//创建事件对象
//当发送修改密码消息时,需等收到服务器返回再发送HOSTINFO。
if (NULL == (m_hEvent_ForCP = CreateEvent(
NULL,
FALSE,
FALSE,
NULL))){
return GetLastError();
}

//注册预览位图的窗口类
ws.cbClsExtra = 0;
ws.cbWndExtra = 0;
ws.hbrBackground = (HBRUSH)::CreateSolidBrush(RGB(255,128,128));
ws.hCursor = LoadCursor (AfxGetApp()->m_hInstance, IDC_ARROW);
ws.hIcon = NULL;
ws.hInstance = AfxGetApp()->m_hInstance;
ws.lpfnWndProc = MaskPerviewWndProc;
ws.lpszClassName = TEXT("MaskPerview");
ws.lpszMenuName = NULL;
ws.style = CS_HREDRAW | CS_VREDRAW;

if (!RegisterClass (&ws)){
return GetLastError();
}

//初始化界面
CImageList * pImg = new CImageList;
pImg->Create(16,16, ILC_COLOR16, 2, 4);
pImg->Add(AfxGetApp()->LoadIcon(IDI_ICON1));
pImg->Add(AfxGetApp()->LoadIcon(IDI_ICON2));

m_listClient.SetImageList (pImg, LVSIL_SMALL);
m_listClient.SetExtendedStyle (m_listClient.GetStyle() | LVS_EX_FULLROWSELECT);

m_listClient.InsertColumn (0, TEXT("计算机名"), LVCFMT_LEFT, 150);
m_listClient.InsertColumn (1, TEXT("IP"), LVCFMT_LEFT, 100);
m_listClient.InsertColumn (3, TEXT("网吧"), LVCFMT_LEFT, 100);
m_listClient.InsertColumn (4, TEXT("分组"), LVCFMT_LEFT, 80);
m_listClient.InsertColumn (5, TEXT("状态"), LVCFMT_LEFT, 100);

//初始化网络

WSAStartup (MAKEWORD(2,2), &wsd);

si.sin_addr.s_addr = htonl(ADDR_ANY);
si.sin_family = AF_INET;
si.sin_port = htons(NETPORT_LISTEN);

if (INVALID_SOCKET == (m_sock = socket(AF_INET, SOCK_STREAM, 0))){
WSACleanup();
return WSAGetLastError();
}

if (SOCKET_ERROR == (bind (m_sock, (sockaddr*)&si, sizeof(si)))){
closesocket (m_sock);
WSACleanup();
return WSAGetLastError();
}

if (SOCKET_ERROR == (listen (m_sock, 4))){
closesocket (m_sock);
WSACleanup();
return WSAGetLastError();
}

//连接注册服务器
/**************************** 下面这句出错 **************************/

if (NULL == (m_htr_connect = CreateThread (
NULL,
1024,
ConnectToRegServer,
(LPVOID)this,
0,
&dwID))){
return GetLastError();
}

//数据库格式
AfxGetModuleState()->m_dwVersion = 0x0601;
//连接数据库
try{
LPSTR strSQL_Client = TEXT("SELECT * FROM [Client]");
LPSTR strSQL_Cfg = TEXT("SELECT * FROM [Cfg]");
LPSTR strSQL_Ground = TEXT("SELECT * FROM [Ground] ORDER BY [Ground_ID]");

m_db.Open (DATABASE_PATH);

m_pRS_Client = new CDaoRecordset(&m_db);
m_pRS_Ground = new CDaoRecordset(&m_db);
m_pRS_Cfg = new CDaoRecordset(&m_db);

m_pRS_Client->Open (AFX_DAO_USE_DEFAULT_TYPE, strSQL_Client);
m_pRS_Ground->Open (AFX_DAO_USE_DEFAULT_TYPE, strSQL_Ground);
m_pRS_Cfg ->Open (AFX_DAO_USE_DEFAULT_TYPE, strSQL_Cfg);

//读取分组信息
COleVariant var_GroundId, var_GroundName;

while (!m_pRS_Ground->IsBOF() && !m_pRS_Ground->IsEOF()){

GROUND_INFO * pgi = new GROUND_INFO;

m_pRS_Ground->GetFieldValue (TEXT("Ground_ID"), var_GroundId);
m_pRS_Ground->GetFieldValue (TEXT("Ground_Name"), var_GroundName);

pgi->dwGround_Idx = var_GroundId.lVal;
lstrcpy (pgi->szGround_Name, (LPSTR)var_GroundName.pbVal);

g_listGround.Add(pgi);
AddGround(pgi);

m_pRS_Ground->MoveNext();
}

//读取配置信息
COleVariant var_CfgId, var_Cfg_GroundId, var_passedtime, var_bitmap, var_URL;

while (!m_pRS_Cfg->IsBOF() && !m_pRS_Cfg->IsEOF()){

CFG_INFO * pcfg = new CFG_INFO;

m_pRS_Cfg->GetFieldValue (TEXT("Cfg_ID"), var_CfgId);
m_pRS_Cfg->GetFieldValue (TEXT("Cfg_PassedTime"), var_passedtime);
m_pRS_Cfg->GetFieldValue (TEXT("Cfg_GroundId"), var_Cfg_GroundId);
m_pRS_Cfg->GetFieldValue (TEXT("Cfg_LogPath"), var_bitmap);
m_pRS_Cfg->GetFieldValue (TEXT("Cfg_URL"), var_URL);

pcfg->dwId = var_CfgId.lVal;
pcfg->dwGround_Idx = var_Cfg_GroundId.lVal;
lstrcpy (pcfg->szPassedTime, (LPSTR)var_passedtime.pbVal);
lstrcpy (pcfg->szBitmapPath, (LPSTR)var_bitmap.pbVal);
lstrcpy (pcfg->szURL, (LPSTR)var_URL.pbVal);

g_listCfg.Add(pcfg);

m_pRS_Cfg->MoveNext();
}

//读取客户机信息
LoadClientsFromDB();
UpdateClientInfo();

m_listGround.SetCurSel(0);
OnSelchangeListGround();
}
catch (CDaoException * e){
e->ReportError();
return 9999;
}

//读取授权信息,并向授权服务器查询
ZeroMemory(&m_ri, sizeof(m_ri));
LoadImpower();
m_ri.bExamine = FALSE;
m_ri.bOnLine = FALSE;
UpdateData(FALSE);
OnUpdateMsg(0,0);

return 0;
}


这是程序刚开始时的初始化代码,之前除了MFC的动作外,几乎没有执行自已的代码。
...全文
623 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-09-12
  • 打赏
  • 举报
回复
解决了??
arong1234 2010-09-12
  • 打赏
  • 举报
回复
所以一些初学者喜欢分配大数组,然后设置栈空间很大,以为这是最佳实践,其实这不是正确的[Quote=引用 3 楼 coding_hello 的回复:]
引用 1 楼 hb19820102 的回复:
真郁闷,刚发了求助贴子,问题解决了。

刚才另一个项目中有一个最大40000次的递归,为了保证递归正常执行,于是在编译器中将那个项目的堆栈设置到0x4000000,没想到在那项目中的设置居然被编译器保存了,应用到了这个项目。

问题解决了,代码没有问题哈。

浪费了大家时间,对不住啦。


堆栈设置过大了会对程序有影响??不可能。
[/Quote]
dukelee 2010-09-12
  • 打赏
  • 举报
回复
是你自己的问题,你的栈太小,很容易溢出返回
你的栈才1K,随便放些数据和buffer都会溢出,一执行线程函数就会出错
arong1234 2010-09-12
  • 打赏
  • 举报
回复
内存总空间和连续内存空间都是有限的,当你设置栈太大,导致无法分配到这样一个栈时,就会这样.楼主分配了64MB的栈,如果他进程内连续的地址空间都小于64MB,就会这样[Quote=引用 3 楼 coding_hello 的回复:]
引用 1 楼 hb19820102 的回复:
真郁闷,刚发了求助贴子,问题解决了。

刚才另一个项目中有一个最大40000次的递归,为了保证递归正常执行,于是在编译器中将那个项目的堆栈设置到0x4000000,没想到在那项目中的设置居然被编译器保存了,应用到了这个项目。

问题解决了,代码没有问题哈。

浪费了大家时间,对不住啦。


堆栈设置过大了会对程序有影响??不可能。
[/Quote]
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dukelee 的回复:]
是你自己的问题,你的栈太小,很容易溢出返回
你的栈才1K,随便放些数据和buffer都会溢出,一执行线程函数就会出错
[/Quote]

这只是一个连接线程,所以设置的栈比较小,另外这也是一个服务器程序。将会有很多(数十万)的客户机线程占用资源。资源比较紧张。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 coding_hello 的回复:]
引用 1 楼 hb19820102 的回复:
真郁闷,刚发了求助贴子,问题解决了。

刚才另一个项目中有一个最大40000次的递归,为了保证递归正常执行,于是在编译器中将那个项目的堆栈设置到0x4000000,没想到在那项目中的设置居然被编译器保存了,应用到了这个项目。

问题解决了,代码没有问题哈。

浪费了大家时间,对不住啦。


堆栈设置过大了会对程序有影响??不可能。
[/Quote]

设置的是层叠堆栈,事实证明确实对程序有影响。编译平台是VC6。
  • 打赏
  • 举报
回复
确实解决了,事实证明层叠堆栈设置过大,确实会使程序执行出问题。
野男孩 2010-09-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hb19820102 的回复:]
真郁闷,刚发了求助贴子,问题解决了。

刚才另一个项目中有一个最大40000次的递归,为了保证递归正常执行,于是在编译器中将那个项目的堆栈设置到0x4000000,没想到在那项目中的设置居然被编译器保存了,应用到了这个项目。

问题解决了,代码没有问题哈。

浪费了大家时间,对不住啦。
[/Quote]

堆栈设置过大了会对程序有影响??不可能。
偶像罗斯福 2010-09-12
  • 打赏
  • 举报
回复
还有这事
  • 打赏
  • 举报
回复
真郁闷,刚发了求助贴子,问题解决了。

刚才另一个项目中有一个最大40000次的递归,为了保证递归正常执行,于是在编译器中将那个项目的堆栈设置到0x4000000,没想到在那项目中的设置居然被编译器保存了,应用到了这个项目。

问题解决了,代码没有问题哈。

浪费了大家时间,对不住啦。

15,471

社区成员

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

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