c++ 多线程的程序

hcmfys 2009-02-25 12:05:06
我做一了个多线程的程序,可老是有一个错误,不知道怎么解决,只能是在线请教各位大虾,先谢了.

问题:
建一个新的类,类中有一个方法operate(),方法里创建一个多线程.
这个是一个头文件,如下:
#include"iostream.h"
#include<windows.h>

#define MAX 10000000
int INDEX=0;


class BusyTone
{
public:
int m_out;
public:
DWORD WINAPI Fun(LPVOID lpParameter)
{
while(INDEX++<MAX)
  Beep(0x400,1000);
return 0;
}
void operate()
{
HANDLE hThread;
hThread=CreateThread(NULL,0,Fun,NULL,0,NULL);
CloseHandle(hThread);
cout<<"please input a number(2,3 or 4)"<<endl;
while(INDEX++<MAX)
{
  if(cin>>m_out)
    break;
}
}

};

主函数main():

#include"BusyTone.h"
#include <Windows.h>
#include"iostream.h"

void main()
{
BusyTone b;
b.operate();
}

报的错误如下:

d:\my vc++\originating call control\busytone.h(23) :
error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'
...全文
128 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangch_nhcmo 2009-02-25
  • 打赏
  • 举报
回复
error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'

CreateThread(NULL,0,Fun,NULL,0,NULL); //函数中第三个参数类型不匹配
waizqfor 2009-02-25
  • 打赏
  • 举报
回复
hThread=CreateThread(NULL,0,Fun,NULL,0,NULL);
LZ参数错了
HANDLE WINAPI CreateThread(
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out LPDWORD lpThreadId
);

cheifer 2009-02-25
  • 打赏
  • 举报
回复
CreateThread(NULL,0,Fun,NULL,0,NULL);
这个函数你传了个Fun参数过去,编译器把Fun当成一个成员函数指针,调用成员函数指针时必须要有类实例,而在CreateThread里面是不可能知道哪个类实例的。

所以Fun参数必须是静态函数或全局函数。
zyc_lc 2009-02-25
  • 打赏
  • 举报
回复
使用全局是个比较方便的方法
dongpy 2009-02-25
  • 打赏
  • 举报
回复
class BusyTone
{
public:
int m_out;
public:
static DWORD WINAPI Fun(LPVOID lpParameter) //要设成静态函数
{
while(INDEX++ <MAX)
  Beep(0x400,1000);
return 0;
}
void operate()
{
HANDLE hThread;
hThread=CreateThread(NULL,0,BusyTone::Fun,NULL,0,NULL);
CloseHandle(hThread);
cout < <"please input a number(2,3 or 4)" < <endl;
while(INDEX++ <MAX)
{
  if(cin>>m_out)
    break;
}
}

};
biweilun 2009-02-25
  • 打赏
  • 举报
回复
LZ的线程函数写得不对,回调函数是不能作为类的一个成员的,建议LZ把线程函数放在类的外面,或者作为全局函数
mawl2002 2009-02-25
  • 打赏
  • 举报
回复
static void Fun();
normallife 2009-02-25
  • 打赏
  • 举报
回复
ding
晨星 2009-02-25
  • 打赏
  • 举报
回复
类的非静态成员函数跟全局函数的类型天生是不一样的。
你要么使用全局函数,要么把Fun声明为类的静态成员函数。

但那样一来,你就不能在线程函数中访问类实例的非静态成员了,如果你确实有这种需求,可以想别的办法。比如通过线程函数的参数把类实例的地址传进去。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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