我按照孙鑫老师的15课多线程聊天室的做法,将线程函数设置为静态,但是在使用的时候遇到了问题。
比如我要在线程函数中初始化套接字,也就是每创建一个线程都创建单独的套接字,编译时发现不能在静态的线程函数中使用 InitSocket() 函数!
因为InitSocket是非静态成员函数。
而且在静态的线程函数内也无法使用如GetDlgItemText之类的成员,不知道有没有什么好的解决方法?如果把线程函数设置为非静态的全局函数,同样报错
'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)';

解决方案 »

  1.   

    可以把this指针传递给线程,然后通过指针调用相应的类函数。例如:class A
    {
    public:
    void startThread()
    {
    DWORD dwThreadID = 0;
    CreateThread(NULL, 0L, Thread, this, 0L, &dwThreadID);
    }
    static DWORD __stdcall Thread(LPVOID lParam)
    {
     A *p = (A*)lParam;
    if (p)
    p->ThreadWork();
    }
    void ThreadWork(){};
    };注意:MFC的程序在Thread不要对界面的进行直接的操作。
      

  2.   

    如LS,传递类的this指针就可以了。MFC程序的话,如果要操作界面,可以采用发消息的方式,在工作线程发消息给主线程,然后由主线程来处理消息,操作界面
      

  3.   

    是这样的,我在主窗口上添加了一个CListCtrl的控件,控件里每一行是一个用户名和密码,每行一组。
    我想通过for循环来创建多个线程,控件里有多少列就创建多少个线程。当我点开始的时候,首先获得行里的用户名和密码,然后创建线程,初始化套接字,然后把用户名和密码发送到服务器。遇到到问题是:1.线程函数如果为静态的话,无法在子进程内操作CListCtrl控件内地ITEM?
    2.如果把进程函数设置为全局函数,该如何传值?比如目前正在处理的行数
    3.初始化套接字是不是应该放在子进程内?目的是每个套接字发送一行用户数据。以前写PHP的,刚接触VC,所以请大家多多包涵,苦于问路无门,如果可以一对一的指导,定酬谢!
      

  4.   

    我想通过for循环来创建多个线程,控件里有多少列就创建多少个线程。首先这个就错了,整个windows系统可创建的线程数是有限的,只能创建2000个多一点。
    1和2,我想1楼和2楼已经说清楚了,如果看不懂建议先看点基础的东西。初始化套接字可以放在子线程里。