_beginthreadex的菜鸟问题 急!

kknd0122 2006-08-02 08:21:49
我在类的构造函数中调用了_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 *)'
还望大侠指教!
...全文
904 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodboyws 2006-08-03
  • 打赏
  • 举报
回复
m_hThread= (LPVOID)_beginthreadex...
思危 2006-08-03
  • 打赏
  • 举报
回复
我的方法,还需要类型转化,改如下
m_hThread=(HANDLE)_beginthreadex(NULL,0,
ThreadProc,//这一句怎么写?
reinterpret_cast<LPVOID>(this),0,NULL);
kknd0122 2006-08-03
  • 打赏
  • 举报
回复
按照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,请大侠们再帮着看看啊,很急的。
kknd0122 2006-08-03
  • 打赏
  • 举报
回复
十分感谢!
折腾_苏州 2006-08-03
  • 打赏
  • 举报
回复
参看:
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
折腾_苏州 2006-08-03
  • 打赏
  • 举报
回复
呵呵,成功就好,我还没太在意,/MT用在REALSE模式下的,

project->settings->C/C->code genaration->use run-time library的几个具体选项意思都很明了.......
kknd0122 2006-08-03
  • 打赏
  • 举报
回复
我胡乱的试了试其他的编译选项,竟然成功了。
这让我更感到不解,如下:
启用选项/MTd、/MD、/MDd这三个中的任何一个都可以通过链接,唯独/MT选项不可以,
大侠们能不能告诉我这是为什么呢?

ps:感谢东南、思危,这个问题解决之后我会放分。

折腾_苏州 2006-08-03
  • 打赏
  • 举报
回复
这段代码放到我机器上,没问题啊~~~~~~~~~~~~~~~~
出现你上述的问题一般是
当 C 运行时 (CRT) 库和 Microsoft 基础类 (MFC) 库的链接顺序有误
你重新键个工程试试---------
或者把#include "stdafx.h"去掉,把上述代码放到一个新的cpp里直接编译看看,工程加上MT
思危 2006-08-03
  • 打赏
  • 举报
回复
static DWORD __stdcall ThreadProc(LPVOID lpParam)
=>
static UINT WINAPI ThreadProc(LPVOID lpParam)
kknd0122 2006-08-03
  • 打赏
  • 举报
回复
谢谢各位的帮助,但是还是有问题。
我用的是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)

请问该怎么办呢?
折腾_苏州 2006-08-03
  • 打赏
  • 举报
回复
代码修改后没什么问题了,可能跟工程设置有关,用了MFC连接了么?
你建立的什么工程,用Win32控制台工程改两个地方后应该能编译成功..........
折腾_苏州 2006-08-02
  • 打赏
  • 举报
回复
两个地方要改:
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)
DentistryDoctor 2006-08-02
  • 打赏
  • 举报
回复
static DWORD __stdcall ThreadProc(LPVOID lpParam)
=>
static UINT __stdcall ThreadProc(LPVOID lpParam)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧