不定个数的c++函数指针

关于多线程下利用vector保存函数指针并调用的方法,这是一个最简单的函数指针调用实例,大家可以看到这样对于处理一些第一时间处理数据的业务非常合适,这样处理的实时性非常好,当然而且可以多个处理函数来处理数据,也可以将mytest这个class 封装起来,是外部使用的人不必关心内部如何产生数据的。外部直接


struct mystuct
{
	int myInt;
	char myStr[100];
};


class mytest
{
private:
	static unsigned long WINAPI TestThread(LPVOID lpvoid); 


	volatile unsigned long threadRun;
	int CreateTestThread();
	vector<void (*)(mystuct *pdata)> functionvector;
	HANDLE m_ExitEvent;
public:
	mytest(void){}
	~mytest(void){}
	int AddFunctionAddr(void (*_ProcesseFunction)(mystuct *pdata));
	void initialize();
	void shutdown();


};


void mytest::initialize()
{
	CreateTestThread();
}
void  mytest::shutdown()
{
	InterlockedExchange(&threadRun,0);
	WaitForSingleObject(m_ExitEvent,INFINITE);
	ResetEvent(m_ExitEvent);
	CloseHandle(m_ExitEvent);
}
int mytest::AddFunctionAddr(void (*_ProcesseFunction)(mystuct *pdata))
{
	functionvector.push_back(_ProcesseFunction);
	return 0;
}


unsigned long WINAPI  mytest::TestThread(LPVOID lpvoid)
{
	mytest* pMytest = (mytest*)lpvoid; 
	int i =15;
	while(1)
	{
		mystuct _mystuct;
		memset(_mystuct.myStr,0,100);
		memcpy(_mystuct.myStr,"月·小轩",sizeof("月·小轩"));
		_mystuct.myInt=i;


		if (0==pMytest->threadRun)
		{
			break;
		}


		for (int i=0;i<(int)(pMytest->functionvector.size());i++)
		{
			if (NULL!=(pMytest->functionvector[i]))
			{
				(*(pMytest->functionvector[i]))(&_mystuct);
			}
		}
		i++;
		Sleep(1000);	
	}
	SetEvent(pMytest->m_ExitEvent);
	return 0;
}


int mytest::CreateTestThread()
{
	m_ExitEvent= CreateEvent(NULL,TRUE,FALSE,L"test_Eixt");
	InterlockedExchange(&threadRun,1);




	DWORD dwthreadID;
	HANDLE h_Handle= CreateThread(NULL,NULL,TestThread,this,0,&dwthreadID);
	if (NULL==h_Handle)
	{
		CloseHandle(h_Handle);
		return 1;
	}	
	CloseHandle(h_Handle);
	return 0;
}


void printFunction1(mystuct* data)
{
	int resultNumber = data->myInt;
	printf("%d\t",resultNumber);
}
void printFunction2(mystuct* data)
{
	printf("%s\t",data->myStr);
}


void main()
{
	mytest* _mytest = new mytest();
	_mytest->AddFunctionAddr(printFunction1);
	_mytest->AddFunctionAddr(printFunction2);
	_mytest->initialize();


	system("pause");
	_mytest->shutdown();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值