error C2664: 'CreateThread'

error C2664: 'CreateThread'
2010-06-24 17:21
用VC创建新线程易出的问题error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)' 收藏 
今天使用 CreateThread 方法创建线程遇到问题,后解决,记录下解决方案——

问题:

用VC创建新线程易出的问题error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'

解决方案:

(1)如果线程要执行的是类的成员函数,则必须用static声明为静态函数   
如:   
class   echo   
{   
        static   DWORD   WINAPI   ThreadFunc(LPVOID     pvoid)   
        ......   
        ......   
}   
    
(2)一般都是调用全局函数.

我们在用CreateThread(NULL,0,ThreadProc,NULL,0,NULL)创建线程得时候,此函数中需要新线程中的函数地址,我们常用的有两种方法解决:

    一.将我们要调用的新线程函数声明成DWORD WINAPI ThreadProc(lpvoid lpParameter)。

    二.我们可以将新线程函数声明成类中的成员函数:static DWORD WINAPI ThreadProc(lpvoid lpParameter)

    但是当我们的写法不正确的时候,往往会出现error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)' 这个问题,另我们这些初学者很是恼火,现将可能出现的这种情况列举如下:

    第一种方法的使用是将新线程要处理的函数写在类外的一种的情况也就是全局函数,非类成员函数,需要注意的就是在创建新线程之前要声明该函数或定义函数,要注意这时不要在该类的头文件添加该函数的声明(我就犯过这样的错误)。记住用完要释放哦!

    第二种方法的使用是将新线程中要处理的函数定义成本类中的成员,使用时要注意一定要吧该函数声明成static类型的,否则就会报错error C2664。

还有个就是

// 串口接收线程
static DWORD WINAPI CommRecvTread(LPVOID lparam);

你可能感兴趣的:(thread)