VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 467|回复: 6

[求助] 创建线程,却没有执行它的处理函数

[复制链接]
31_avatar_middle
在线会员 Eirik 发表于 2018-6-14 14:25:40 | 显示全部楼层 |阅读模式
3驿站币
#include "stdafx.h"
#include "NetThread.h"
#include "ProtocolProc.h"

DWORD WINAPI CRecvThread(LPVOID lparameter);
DWORD WINAPI CProcThread(LPVOID lparameter);
SOCKET SockServers;

DWORD WINAPI ClientConnThread(LPVOID lpParameter)
{
        //create sock
        SOCKET sockServer = socket(AF_INET,SOCK_STREAM,0);
        //addr
        SOCKADDR_IN addrServer = { 0 };
        addrServer.sin_family = AF_INET;
        addrServer.sin_addr.S_un.S_addr = inet_addr("10.84.192.94");
        addrServer.sin_port = htons(5051);
        //connect
        int nRes = 0;
        if (SOCKET_ERROR == connect(sockServer, (sockaddr *)&addrServer, sizeof(addrServer)))
        {
                nRes = WSAGetLastError();
                char szbuf[22] = "";
                MessageBox(NULL, _itoa(nRes,szbuf,22), "connect fail", MB_OK);
                return -1;
        }
        SockServers = sockServer;

        while(true)
        {
                DWORD dwThreadId = 0;
                CloseHandle(CreateThread(NULL,0,CRecvThread,(LPVOID)sockServer,0,&dwThreadId));
        }
        return 0;
}

DWORD WINAPI CRecvThread(LPVOID lparameter)
{
        int nRes = 0;
        DWORD dwThreadId = 0;
       
        while (true)
        {
                NET_DATA * pNetData = new NET_DATA;;
                pNetData->sock = (SOCKET)lparameter;
                nRes = recv(pNetData->sock,pNetData->szbuf,4096,0);
                PROTOCOL_PACK *pLoginRes = (PROTOCOL_PACK*)pNetData->szbuf;
                char szbuf[22] = "";
                _itoa(nRes,szbuf,22);
                MessageBox(NULL, szbuf, "get pack", MB_OK);
                if (0 == nRes || SOCKET_ERROR == nRes)
                {
                        MessageBox(NULL, pNetData->szbuf, "interupt connetcting...", MB_OK);
                        break;//
                }
                CloseHandle(CreateThread(NULL, 0, CProcThread, (LPVOID)pNetData, 0, &dwThreadId));
        }
        return 0;
}
DWORD WINAPI CProcThread(LPVOID lparameter)
{
        NET_DATA *pNetData = (NET_DATA*)lparameter;
        MessageBox(NULL, pNetData->szbuf, "处理Pack", MB_OK);
        ProtocolProcClient(pNetData);
        delete pNetData;
        return 0;
}

最佳答案

查看完整内容

ClientConnThread 线程中 connect 成功之后,你用个 while 循环反反复复的创建 CRecvThread 线程是怎么个意思? while(true) { DWORD dwThreadId = 0; CloseHandle(CreateThread(NULL,0,CRecvThread,(LPVOID)sockServer,0,&dwThreadId)); }




上一篇:一个医院病房管理系统,不知道错哪里了 求大神指点
下一篇:求软件名

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

51_avatar_middle
online_admins Syc 发表于 2018-6-14 14:25:41 | 显示全部楼层
Eirik 发表于 2018-6-14 15:18
这是已经写了的代码  还在敲

ClientConnThread 线程中 connect 成功之后,你用个 while 循环反反复复的创建 CRecvThread 线程是怎么个意思?

while(true)
{
        DWORD dwThreadId = 0;
        CloseHandle(CreateThread(NULL,0,CRecvThread,(LPVOID)sockServer,0,&dwThreadId));
}

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

31_avatar_middle
ico_lz  楼主| Eirik 发表于 2018-6-14 14:29:24 | 显示全部楼层
接收线程CRecvThread的处理函数执行了,调试之后发现CProcThread线程的处理函数没有执行,我用@err,hr显示的错误提示是拒绝访问,无效句柄,这只是部分代码,如果想帮我看看的 可以加好友讨论

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2018-6-14 14:44:38 | 显示全部楼层
CProcThread 线程是在哪里开启的?代码发出来看看!
是不是主线程退出了导致的工作线程没正常执行完呢!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

31_avatar_middle
ico_lz  楼主| Eirik 发表于 2018-6-14 14:53:28 | 显示全部楼层
Syc 发表于 2018-6-14 14:44
CProcThread 线程是在哪里开启的?代码发出来看看!
是不是主线程退出了导致的工作线程没正常执行完呢!

#include "stdafx.h"
#include "NetThread.h"
#include "DlgLoginProc.h"

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevIstance,LPSTR lpCmdLine,int nCmdShow)
{
        WSADATA wsaData;
        WSAStartup(0x0202,&wsaData);

        DWORD dwThreadId = 0;
        CloseHandle(CreateThread(NULL, 0, ClientConnThread, (LPVOID)0, 0, &dwThreadId));

        HWND hDlg = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DLG_LOGIN), NULL, DlgLoginProc);
        ShowWindow(hDlg,SW_SHOW);
        UpdateWindow(hDlg);
        MSG msg;
        while (GetMessage(&msg,NULL,0,0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }

        WSACleanup();

        return 0;
}

CRecvThread是在ClientConnThread的处理函数里开启的  CProcThread是在CRecvThread的处理函数里开启的

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

31_avatar_middle
ico_lz  楼主| Eirik 发表于 2018-6-14 14:57:02 | 显示全部楼层
Syc 发表于 2018-6-14 14:44
CProcThread 线程是在哪里开启的?代码发出来看看!
是不是主线程退出了导致的工作线程没正常执行完呢!

#include "stdafx.h"
#include "NetThread.h"
#include "ProtocolProc.h"

DWORD WINAPI CRecvThread(LPVOID lparameter);
DWORD WINAPI CProcThread(LPVOID lparameter);
SOCKET SockServers;

DWORD WINAPI ClientConnThread(LPVOID lpParameter)
{
        //create sock
        SOCKET sockServer = socket(AF_INET,SOCK_STREAM,0);
        //addr
        SOCKADDR_IN addrServer = { 0 };
        addrServer.sin_family = AF_INET;
        addrServer.sin_addr.S_un.S_addr = inet_addr("10.84.192.94");
        addrServer.sin_port = htons(5051);
        //connect
        int nRes = 0;
        if (SOCKET_ERROR == connect(sockServer, (sockaddr *)&addrServer, sizeof(addrServer)))
        {
                nRes = WSAGetLastError();
                char szbuf[22] = "";
                MessageBox(NULL, _itoa(nRes,szbuf,22), "connect fail", MB_OK);
                return -1;
        }
        SockServers = sockServer;

        while(true)
        {
                DWORD dwThreadId = 0;
                CloseHandle(CreateThread(NULL,0,CRecvThread,(LPVOID)sockServer,0,&dwThreadId));
        }
        return 0;
}

DWORD WINAPI CRecvThread(LPVOID lparameter)
{
        int nRes = 0;
        DWORD dwThreadId = 0;
        
        while (true)
        {
                NET_DATA * pNetData = new NET_DATA;;
                pNetData->sock = (SOCKET)lparameter;
                nRes = recv(pNetData->sock,pNetData->szbuf,4096,0);
                PROTOCOL_PACK *pLoginRes = (PROTOCOL_PACK*)pNetData->szbuf;
                char szbuf[22] = "";
                _itoa(nRes,szbuf,22);
                MessageBox(NULL, szbuf, "get pack", MB_OK);
                if (0 == nRes || SOCKET_ERROR == nRes)
                {
                        MessageBox(NULL, pNetData->szbuf, "interupt connetcting...", MB_OK);
                        break;//
                }
                CloseHandle(CreateThread(NULL, 0, CProcThread, (LPVOID)pNetData, 0, &dwThreadId));
        }
        return 0;
}
DWORD WINAPI CProcThread(LPVOID lparameter)
{
        NET_DATA *pNetData = (NET_DATA*)lparameter;
        MessageBox(NULL, pNetData->szbuf, "处理Pack", MB_OK);
        ProtocolProcClient(pNetData);
        delete pNetData;
        return 0;
}

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

31_avatar_middle
ico_lz  楼主| Eirik 发表于 2018-6-14 15:18:14 | 显示全部楼层
这是已经写了的代码  还在敲

IM.rar

21.7 KB, 下载次数: 1

全部代码 还在敲

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-13 08:47

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表