none
子线程操作主线程,SetDlgItemText,GetDlgItem怎么使用?谢谢 RRS feed

  • 问题

  • UINT Send(LPVOID pParam)
    {
    CString startstr;
    int port=8080;

    GetDlgItem(IDC_connect)->GetWindowText(startstr); //此处报错
    if(startstr=="连接")
    {
    if(port>0&&port<65535)
    {
    if(cslisten.Create(port))
    {
    cslisten.Listen();
    cslisten.step(this,csnum); //此处报错

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

    cslisten.Close();
    }
    }
    else ::AfxMessageBox("端口输入有误(0~65535)");
    SetDlgItemText(IDC_connect,"断开"); //此处报错
    GetDlgItem((IDC_Send)->EnableWindow(true); //此处报错
    UpdateData(false);                                        //此处报错
    }
    else if(startstr=="断开")
    {
    cslisten.Close();
    SetDlgItemText(IDC_connect,"连接"); //此处报错
    GetDlgItem(IDC_Send)->EnableWindow(false); //此处报错
       UpdateData(false);                                           //此处报错

    }

    }


    2016年7月2日 2:22

答案

  • Hi MV_C584,

    感谢在MSDN论坛发帖。

    为了更快的找到根本原因,请将错误内容提供给我们。谢谢合作。

    >>GetDlgItem(IDC_connect)->GetWindowText(startstr); //此处报错

    GetDlgItem((IDC_Send)->EnableWindow(true); //此处报错

    GetDlgItem(IDC_Send)->EnableWindow(false); //此处报错

    当你使用GetDlgItem时,请区分返回值为控件或者窗口。并使用不同类型的指针接收返回值,调用其他函数。尝试改为以下写法

    CEdit* pControl = (CEdit*)GetDlgItem(IDC_connect)//以Edit控件为例
    
    pControl -> GetWindowText(&startstr); 
    
    pControl -> EnableWindow(true);  
    
    pControl -> EnableWindow(false);  
    
    

    >>SetDlgItemText(IDC_connect,"断开"); //此处报错

    SetDlgItemText的第二个参数为指向cstring对象的指针或字符串,你使用的为char类型的对象。请使用

    SetDlgItemText(IDC_connect,_T("断开")); 

    或者

    cstring sText = _T("断开");
    SetDlgItemText(IDC_connect, &sText ); 

    >>if(startstr=="连接")

    尽量使用cstring的Compare函数。例如:

    if(startstr.compare(_T("连接")) == 0)

    希望对你有所帮助。

    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月4日 7:17
  • 线程函数中不要直接操作UI线程中的控件,如果您需要将UI控件上的信息传递给线程函数,您可以自定义一个数据结构,用来存放这些信息,将该数据作为线程函数的参数传递给线程,不过需要注意作用域范围,不要传递局部变量的地址到线程函数中等等。

    自定义的数据结构可以是如下所示的结构:

    typedef struct _PARAMINFO_
    {
      BOOL bConnect;
      int nPort; 
      xxx;
    };
    另外如果想在线程中操作UI线程中的控件,最好是发送自定义消息到UI线程中,在UI线程消息响应函数中去更新控件信息。


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

    • 已标记为答案 MV_C584 2016年8月23日 4:49
    2016年7月4日 8:54
    版主

全部回复

  • 请问下是什么错误?

    是不是 error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE”

    参考这里

    http://bbs.bccn.net/thread-427677-1-1.html


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

    2016年7月2日 3:35
  • Hi MV_C584,

    感谢在MSDN论坛发帖。

    为了更快的找到根本原因,请将错误内容提供给我们。谢谢合作。

    >>GetDlgItem(IDC_connect)->GetWindowText(startstr); //此处报错

    GetDlgItem((IDC_Send)->EnableWindow(true); //此处报错

    GetDlgItem(IDC_Send)->EnableWindow(false); //此处报错

    当你使用GetDlgItem时,请区分返回值为控件或者窗口。并使用不同类型的指针接收返回值,调用其他函数。尝试改为以下写法

    CEdit* pControl = (CEdit*)GetDlgItem(IDC_connect)//以Edit控件为例
    
    pControl -> GetWindowText(&startstr); 
    
    pControl -> EnableWindow(true);  
    
    pControl -> EnableWindow(false);  
    
    

    >>SetDlgItemText(IDC_connect,"断开"); //此处报错

    SetDlgItemText的第二个参数为指向cstring对象的指针或字符串,你使用的为char类型的对象。请使用

    SetDlgItemText(IDC_connect,_T("断开")); 

    或者

    cstring sText = _T("断开");
    SetDlgItemText(IDC_connect, &sText ); 

    >>if(startstr=="连接")

    尽量使用cstring的Compare函数。例如:

    if(startstr.compare(_T("连接")) == 0)

    希望对你有所帮助。

    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月4日 7:17
  • 线程函数中不要直接操作UI线程中的控件,如果您需要将UI控件上的信息传递给线程函数,您可以自定义一个数据结构,用来存放这些信息,将该数据作为线程函数的参数传递给线程,不过需要注意作用域范围,不要传递局部变量的地址到线程函数中等等。

    自定义的数据结构可以是如下所示的结构:

    typedef struct _PARAMINFO_
    {
      BOOL bConnect;
      int nPort; 
      xxx;
    };
    另外如果想在线程中操作UI线程中的控件,最好是发送自定义消息到UI线程中,在UI线程消息响应函数中去更新控件信息。


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

    • 已标记为答案 MV_C584 2016年8月23日 4:49
    2016年7月4日 8:54
    版主
  •  thanks
    2016年7月4日 8:58