我在类的构造函数中调用了_beginthreadex,线程函数是同一个类的静态成员函数,如下:#include "stdafx.h"#include"iostream.h"
#include"windows.h"
#include"process.h"class CWorkerThread
{
public:
CWorkerThread(LPCTSTR szName)
{
m_szName=szName;
m_hThread=INVALID_HANDLE_VALUE;
m_hThread=_beginthreadex(NULL,0,
                    ThreadProc,//这一句怎么写?
                    reinterpret_cast<LPVOID>(this),0,NULL);
}
virtual ~CWorkerThread()
{
::CloseHandle(m_hThread);
}
virtual void WaitForCompletion()
{
::WaitForSingleObject(m_hThread,INFINITE);
}
protected:
    static DWORD __stdcall ThreadProc(LPVOID lpParam)
{
CWorkerThread *pThis=reinterpret_cast<CWorkerThread*>(lpParam);
pThis->DoStuff();
return 0;
}
virtual void DoStuff()
{
for(int n=0;n<100;n++)
{
cout<<"Thread:"<<m_szName<<" ID:"<<::GetCurrentThreadId()
<<",count"<<n<<endl;
}
}
HANDLE m_hThread;
LPCTSTR m_szName;
};int main()
{
CWorkerThread wtA("A");
CWorkerThread wtB("B");
wtA.WaitForCompletion();
wtB.WaitForCompletion();
    cout<<"Both threads complete."<<endl;
return 0;
}
其他地方都没有问题,编译器报错:
'_beginthreadex' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned int (__stdcall *)(void *)'
还望大侠指教!

解决方案 »

  1.   

    static DWORD __stdcall ThreadProc(LPVOID lpParam)
    =>
    static UINT __stdcall ThreadProc(LPVOID lpParam)
      

  2.   

    两个地方要改:
    1.m_hThread=_beginthreadex(NULL,0,
                        ThreadProc,//这一句怎么写?
                        reinterpret_cast<LPVOID>(this),0,NULL);
    ============>>>>>>>>>>
    m_hThread=(HANDLE)_beginthreadex(NULL,0,
                        ThreadProc,//这一句怎么写?
                        reinterpret_cast<LPVOID>(this),0,NULL);
    2.
    static DWORD __stdcall ThreadProc(LPVOID lpParam)
    ============>>>>>>>>>>
    static unsigned __stdcall ThreadProc(LPVOID lpParam)
      

  3.   

    static DWORD __stdcall ThreadProc(LPVOID lpParam)
    =>
    static UINT WINAPI ThreadProc(LPVOID lpParam)
      

  4.   

    按照dentistrydoctor和solike改了之后,出现了新的错误:
    C:\Program Files\Microsoft Visual Studio\MyProjects\temp1\t1\t1.cpp(16) : error C2440: '=' : cannot convert from 'unsigned long' to 'void *'
            Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
    Error executing cl.exe.
    ------------------------------------------------------------------------------------
    按照seu07201213改了之后出现了3个错误:
    error LNK2001: unresolved external symbol "void * __cdecl operator new(unsigned int,int,char const *,int)" (??2@YAPAXIHPBDH@Z)
    libcimtd.lib(streamb.obj) : error LNK2001: unresolved external symbol "void * __cdecl operator new(unsigned int,int,char const *,int)" (??2@YAPAXIHPBDH@Z)
    Debug/t1.exe : fatal error LNK1120: 1 unresolved externals
    ------------------------------------------------------------------------------------
    另外我在编译选项中已经指定了/MT,请大侠们再帮着看看啊,很急的。
      

  5.   

    我的方法,还需要类型转化,改如下
    m_hThread=(HANDLE)_beginthreadex(NULL,0,
    ThreadProc,//这一句怎么写?
    reinterpret_cast<LPVOID>(this),0,NULL);
      

  6.   

    m_hThread= (LPVOID)_beginthreadex...
      

  7.   

    代码修改后没什么问题了,可能跟工程设置有关,用了MFC连接了么?
    你建立的什么工程,用Win32控制台工程改两个地方后应该能编译成功..........
      

  8.   

    谢谢各位的帮助,但是还是有问题。
    我用的是vc6,建立的是控制台程序,用了编译选项/MT,并且选择的是not using MFC
    现在根据楼上各位的建议改成了这样:#include "stdafx.h"#include"iostream.h"
    #include"windows.h"
    #include"process.h"class CWorkerThread
    {
    public:
    CWorkerThread(LPCTSTR szName)
    {
    m_szName=szName;
    m_hThread=INVALID_HANDLE_VALUE;
    m_hThread=(HANDLE)_beginthreadex(NULL,0,  //把HANDLE改为LPVOID也是同样的错误
                        ThreadProc,
                        reinterpret_cast<LPVOID>(this),0,NULL);
    }
    virtual ~CWorkerThread()
    {
    ::CloseHandle(m_hThread);
    }
    virtual void WaitForCompletion()
    {
    ::WaitForSingleObject(m_hThread,INFINITE);
    }
    protected:
        static UINT __stdcall ThreadProc(LPVOID lpParam)
    {
    CWorkerThread *pThis=reinterpret_cast<CWorkerThread*>(lpParam);
    pThis->DoStuff();
    return 0;
    }
    virtual void DoStuff()
    {
    for(int n=0;n<100;n++)
    {
    cout<<"Thread:"<<m_szName<<" ID:"<<::GetCurrentThreadId()
    <<",count"<<n<<endl;
    }
    }
    HANDLE m_hThread;
    LPCTSTR m_szName;
    };int main()
    {
    CWorkerThread wtA("A");
    CWorkerThread wtB("B");
    wtA.WaitForCompletion();
    wtB.WaitForCompletion();
        cout<<"Both threads complete."<<endl;
    return 0;
    }出现的信息:
    --------------------Configuration: t1 - Win32 Debug--------------------
    Linking...
    libcimtd.lib(iostrini.obj) : error LNK2001: unresolved external symbol "void * __cdecl operator new(unsigned int,int,char const *,int)" (??2@YAPAXIHPBDH@Z)
    libcimtd.lib(streamb.obj) : error LNK2001: unresolved external symbol "void * __cdecl operator new(unsigned int,int,char const *,int)" (??2@YAPAXIHPBDH@Z)
    Debug/t1.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.t1.exe - 3 error(s), 0 warning(s)请问该怎么办呢?
      

  9.   

    这段代码放到我机器上,没问题啊~~~~~~~~~~~~~~~~
    出现你上述的问题一般是
    当 C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误
    你重新键个工程试试---------
    或者把#include "stdafx.h"去掉,把上述代码放到一个新的cpp里直接编译看看,工程加上MT
      

  10.   

    我胡乱的试了试其他的编译选项,竟然成功了。
    这让我更感到不解,如下:
    启用选项/MTd、/MD、/MDd这三个中的任何一个都可以通过链接,唯独/MT选项不可以,
    大侠们能不能告诉我这是为什么呢?ps:感谢东南、思危,这个问题解决之后我会放分。
      

  11.   

    呵呵,成功就好,我还没太在意,/MT用在REALSE模式下的,project->settings->C/C->code genaration->use run-time library的几个具体选项意思都很明了.......
      

  12.   

    参看:
    http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp