本帖最后由 ltsf1984 于 2010-10-08 14:58:14 编辑

解决方案 »

  1.   

    使用类静态函数作为线程入口函数,并作强制类型转换LPTHREAD_START_ROUTINE
      

  2.   

    不好意思,发错了代码。以下是更正的:void CMultiThread1Dlg::OnBnClickedStart()
    {
    // TODO: 在此添加控件通知处理程序代码
    hThread=CreateThread(NULL,
    0,
    (LPTHREAD_START_ROUTINE)CMultiThread1Dlg::ThreadFunc,  //error
    NULL,
    0,
    &ThreadID);
    GetDlgItem(IDC_START)->EnableWindow(FALSE);
    GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
    }
      

  3.   

    确认CMultiThread1Dlg::ThreadFunc为静态函数。
      

  4.   

    刚在 MultiThread1Dlg.h改了,public:
    static void ThreadFunc();结果又有新错了, error LNK2019: 无法解析的外部符号 "protected: static void __cdecl CMultiThread1Dlg::ThreadFunc(void)" (?ThreadFunc@CMultiThread1Dlg@@KAXXZ),该符号在函数 "public: void __thiscall CMultiThread1Dlg::OnBnClickedStart(void)" (?OnBnClickedStart@CMultiThread1Dlg@@QAEXXZ) 中被引用
     fatal error LNK1120: 1 个无法解析的外部命令
      

  5.   

    我记得如果用afxbeginthread
    进程参数为:LPVOID lpParameter,用强转为当前的CxxxDialog *就可以直接再线程中调用Dlg的内容了
      

  6.   


    static DWORD WINAPI ThreadProc(LPVOID lpParameter)
    {
      OutputDebugString(_T("ThreadProc\r\n"));
      return 0;
    }int nParam = 110;
    DWORD dwThreadID = 0;
    HANDLE hThread = CreateThread(NULL,0,ThreadProc,&nParam,0,&dwThreadID); 
      

  7.   

    不是太明白,HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
                     DWORD dwStackSize,
                     LPTHREAD_START_ROUTINE lpStartAddress,
                     LPVOID lpParameter,     
                     DWORD dwCreationFlags,
                     LPDWORD lpThreadId);你的意思是把第4个参数也改吗?
      

  8.   

    lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
      

  9.   


    DWORD WINAPI ThreadFuncsk(LPVOID lpParameter)
    {
      OutputDebugString(_T("ThreadProc\r\n"));
      return 0;
    }
    DWORD ThreadID;//线程ID;
    HANDLE hthread = CreateThread(NULL,0,ThreadFuncsk,0,0,&ThreadID);
      

  10.   

    注意返回类型就可以了:
    DWORD WINAPI
      

  11.   

    //CMultiThread1Dlg.h
    class CMultiThread1Dlg : public CDialog
    {

    protected:
    HANDLE hThread;
    DWORD ThreadID;
    public:
     void ThreadFunc();
    afx_msg void OnBnClickedStart();
    afx_msg void OnBnClickedStop();
    };//CMultiThread1Dlg.cpp
    void CMultiThread1Dlg::OnBnClickedStart()
    {
    // TODO: 在此添加控件通知处理程序代码
    hThread=CreateThread(NULL,
    0,
    (LPTHREAD_START_ROUTINE)CMultiThread1Dlg::ThreadFunc, //error
    NULL,
    0,
    &ThreadID);error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE”
      

  12.   

    //CMultiThread1Dlg.h
    class CMultiThread1Dlg : public CDialog
    {

    protected:
    HANDLE hThread;
    DWORD ThreadID;
    public:
    staic void ThreadFunc();
    afx_msg void OnBnClickedStart();
    afx_msg void OnBnClickedStop();
    };//CMultiThread1Dlg.cpp
    void CMultiThread1Dlg::OnBnClickedStart()
    {
    // TODO: 在此添加控件通知处理程序代码
    hThread=CreateThread(NULL,
    0,
    (LPTHREAD_START_ROUTINE)CMultiThread1Dlg::ThreadFunc, //error
    NULL,
    0,
    &ThreadID);
     error LNK2019: 无法解析的外部符号 "protected: static void __cdecl CMultiThread1Dlg::ThreadFunc(void)" (?ThreadFunc@CMultiThread1Dlg@@KAXXZ),该符号在函数 "public: void __thiscall CMultiThread1Dlg::OnBnClickedStart(void)" (?OnBnClickedStart@CMultiThread1Dlg@@QAEXXZ) 中被引用
     fatal error LNK1120: 1 个无法解析的外部命令
      

  13.   


    你的线线程函数不对, static void ThreadFunc(); 这个函数原型就不对, 线程函数必需有一个参数, 返回值. 就像10楼这位同学那样. 你看下LPTHREAD_START_ROUTINE的定义, 线程函数的原型要跟它的原型定义的一模一样!
      

  14.   

    还有调用约定,就是WINAPI这个宏定义,实际就是__stdcall
      

  15.   

    头文件中,修改如下
    public:
        static DWORD WINAPI ThreadFunc(LPVOID lpParam);cpp中,函数如下
    DWORD WINAPI CMultiThread1Dlg::ThreadFunc(LPVOID lpParam)
    {
            /* code... */
    return 0;
    }调用处:
    DWORD ThreadID = 0;
    hThread=CreateThread(NULL, 0, ThreadFunc, NULL, 0, &ThreadID);
      

  16.   

    static LRESULT myFunc(LPVOID pParam);//pParam可以将窗口的句柄或指针传递进来
      

  17.   


    void CCLJCnet1Dlg::OnBnClickedConnect()
    {
    // TODO: 在此添加控件通知处理程序代码
    /*if (mSckSender!=0)
    {
    closesocket(mSckSender);
    mSckSender=0;
    }
    if (mSckSender==0)
    {
    mSckSender=socket(AF_INET,SOCK_STREAM,0);
    ASSERT(mSckSender!=0);
    }
    SOCKADDR_IN  m_addr;
    BOOL flag = TRUE;
    //int ret = setsockopt(mSckReceiver, SOL_SOCKET, SO_REUSEADDR, 
    //(char *) &flag, sizeof(flag));
    m_addr.sin_family      = AF_INET;
    m_addr.sin_addr.s_addr = inet_addr("192.168.10.11");
    //注意服务器端在 SERVER_UDP_PORT 10096 上接收数据,而在CLIENT_UDP_PORT
    //上发送数据,而客户端恰好相反
    m_addr.sin_port = htons(3333);
    ret = bind(mSckReceiver, (struct sockaddr*) &m_addr, sizeof(m_addr));
    //AfxMessageBox("网络已连接,等待传送数据");*/
    SOCKET socketServer;
    SOCKADDR_IN sin;
    sockServer=socket(PF_INET,SOCK_STREAM,0);
    sin.sin_family=AF_INET;
    sin.sin_addr.s_addr=ulAddress;
    sin.sin_port=htons(4009);
    int nConnect=connect(sockServer, (LPSOCKADDR)&sin, sizeof(struct sockaddr)); CString str="16 16 02 01 03 22 00";
    LPCTSTR p=str;

    int nCharSend=send(sockServer,(char*)&str,sizeof(str),0);
    if(nCharSend==SOCKET_ERROR)
    MessageBox("发送过程中发生一个错误!",NULL,MB_OK);}
      

  18.   

    [code=C/C++][/codevoid CCLJCnet1Dlg::OnBnClickedConnect()
    {
    // TODO: 在此添加控件通知处理程序代码
    /*if (mSckSender!=0)
    {
    closesocket(mSckSender);
    mSckSender=0;
    }
    if (mSckSender==0)
    {
    mSckSender=socket(AF_INET,SOCK_STREAM,0);
    ASSERT(mSckSender!=0);
    }
    SOCKADDR_IN  m_addr;
    BOOL flag = TRUE;
    //int ret = setsockopt(mSckReceiver, SOL_SOCKET, SO_REUSEADDR, 
    //(char *) &flag, sizeof(flag));
    m_addr.sin_family      = AF_INET;
    m_addr.sin_addr.s_addr = inet_addr("192.168.10.11");
    //注意服务器端在 SERVER_UDP_PORT 10096 上接收数据,而在CLIENT_UDP_PORT
    //上发送数据,而客户端恰好相反
    m_addr.sin_port = htons(3333);
    ret = bind(mSckReceiver, (struct sockaddr*) &m_addr, sizeof(m_addr));
    //AfxMessageBox("网络已连接,等待传送数据");*/
    SOCKET socketServer;
    SOCKADDR_IN sin;
    sockServer=socket(PF_INET,SOCK_STREAM,0);
    sin.sin_family=AF_INET;
    sin.sin_addr.s_addr=ulAddress;
    sin.sin_port=htons(4009);
    int nConnect=connect(sockServer, (LPSOCKADDR)&sin, sizeof(struct sockaddr)); CString str="16 16 02 01 03 22 00";
    LPCTSTR p=str;

    int nCharSend=send(sockServer,(char*)&str,sizeof(str),0);
    if(nCharSend==SOCKET_ERROR)
    MessageBox("发送过程中发生一个错误!",NULL,MB_OK);}]