none
C++如何在一个MFC里面构建多个子线程?谢谢 RRS feed

  • 问题

  • 因为现在用MFC做了一个TCP/IP通信传输和图像处理两个任务,通信这块需要采用子线程,不然会导致界面卡。其中TCP/IP通信传输方面,我自己定义了连接,关闭,发送数据三个线程。但是会发生错误,请问该怎么解决呢?请问你们在建立TCP/IP通信传输的时候,是怎么去构建线程的呢?谢谢

    下面是我自己建立的三个子线程,是用AfxBeginThread启动的。


    下面是部分源码,谢谢:

      

    void CGxSingleCamMonoDlg::OnBnClickedSend()
    {
    // TODO: 在此添加控件通知处理程序代码
    AfxBeginThread(Send,NULL);//发送线程1

    }
    void CGxSingleCamMonoDlg::OnBnClickedconnect()
    {
    if(startstr==0)
     {
         AfxBeginThread(Connect,NULL);//与客服端链接线程2
     startstr=1;
     }
    else if(startstr==1)
    {
     AfxBeginThread(Close,NULL);//关闭监听线程3
    startstr=0;

     }
    }

    UINT Send(LPVOID pParame)//发送是工业化与
    {


    CString s1,sText1=_T("1");
    CString chx;
    int OX=6;
    chx.Format("%d",OX);

    CString chy;
    int OY=9;
    chy.Format("%d",OY);

    s1 = sText1+" "+chx+" "+chy+"\r\n";

    if(csrev[0].Send(s1,s1.GetLength())==SOCKET_ERROR)
    {
    ::AfxMessageBox(_T("数据发送失败!"));
    return 0;
    }
    else
    {

    CString strItem ="【发送信息】[";
    strItem += "x:"+sText1+" y:";

    }

    return 0;

    }

    UINT __cdecl Connect(LPVOID pParam)
    {
    int port=8080;

    if(cslisten.Create(port))
    {
    cslisten.Listen();
    cslisten.Listen();
    }
    else
    {
    ::AfxMessageBox(_T("绑定监听端口失败,请确认该端口没有被其它程序占用!"));

    cslisten.Close();
    }

    return 0;
    }
    UINT __cdecl Close(LPVOID pParameter)
    {
    cslisten.Close();
    return 0;

    ]


    2016年7月4日 9:16

全部回复

  • 是什么错误?

    我认为要避免::AfxMessageBox(_T("数据发送失败!"));这样的输出,它会阻塞界面

    改成写日志文件


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年7月4日 10:08
  • 第一次点击,可以与客服端链接。然后再点击断开,就会崩溃。。
    2016年7月4日 13:17
  • Hi MV_C584,

    感谢在MSDN论坛发帖。

    >>第一次点击,可以与客服端链接。然后再点击断开,就会崩溃。。

    使用AfxBeginThread启动的线程,需要使用AfxEndThread断开连接。而不是再次点击。

    这里有一些sample code和文档可以参考一下

    http://www.codeproject.com/KB/IP/winsockintro03.aspx?msg=2069390

    https://support.microsoft.com/en-us/kb/175668

    Best Regards,

    Sera Yu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

    2016年7月5日 2:09
  • 您的cslisten是什么类型的?CSocket类型吗?CSocket默认使用窗口消息处理,会跟一个HWND窗口绑定在一起,在UI线程中使用比较方便,工作线程中还是使用winsock API吧.

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.


    2016年7月5日 2:11
    版主
  • 是采用的CSocket类型,我现在主要问题是在多线程操作的时候出现问题。

    请问你们以前设计TCP/IP通信的时候,MFC对话框是制作了几个按钮,每个按钮的功能事什么呢?谢谢

    2016年7月7日 5:52
  • 您好,我现在的想法就是第一次点击进入与客服端链接的线程,第二次链接不进入客服端的线程,而是直接关闭。采用了bool类型的变量实现。

    请问你们以前设计TCP/IP通信的时候,MFC对话框是制作了几个按钮,每个按钮的功能事什么呢?谢谢

    2016年7月7日 5:54