最近在写个项目,比如有一个类的成员函数,这个成员函数会做一些很重的事情 比如一个HTTP请求。我在线程A里面调用这个
成员函数不现实,想将这个成员函数分派到一个线程里面去跑。有什么优雅的方法么?比如
class ClassA obj;
obj.fun() //这个fun就是HTTP请求或者其他一些很重的事情要执行几秒。我想把这个放到线程里面去执行。我自己现在用的方法不好看。比如有个线程池 有一个线程是空闲的。我在类里面定义了一个成员static函数
static int threadFun(ClassA *self)
{
self->fun();
}
这样来执行的。封装性不好 。比如我要执行fun2() 又要单独去写个threadFun2 。很丑 。
有谁有更好的办法吗?本来想用汇编代码把this指针给ecx然后call。也不靠谱 不同编译器的thiscall的调用约定也不太一样。在C++层面是否有方法可以做到?
成员函数不现实,想将这个成员函数分派到一个线程里面去跑。有什么优雅的方法么?比如
class ClassA obj;
obj.fun() //这个fun就是HTTP请求或者其他一些很重的事情要执行几秒。我想把这个放到线程里面去执行。我自己现在用的方法不好看。比如有个线程池 有一个线程是空闲的。我在类里面定义了一个成员static函数
static int threadFun(ClassA *self)
{
self->fun();
}
这样来执行的。封装性不好 。比如我要执行fun2() 又要单独去写个threadFun2 。很丑 。
有谁有更好的办法吗?本来想用汇编代码把this指针给ecx然后call。也不靠谱 不同编译器的thiscall的调用约定也不太一样。在C++层面是否有方法可以做到?
fubctions 搞成 一个 数组,
类里 搞个 index m_funidx
static int threadFun(ClassA *self)
{
self->funs[m_funidx];
}
{
ClassA *self = new ClassA();
self->fun();
}
这样定是不是封装性好?
{
public:
virtual void Run() = 0;
};class CThread
{
public:
CThread(IRunnable * run);
~CThread();public:
void Start();
void WaitFinish();public:
IRunnable* m_run = NULL;
HANDLE m_hThread = NULL;
};
楼主有了解回调和虚函数吗?
有的话,上面的接口就可以办到说的。
#include "Thread.h"CThread::CThread(IRunnable * run)
{
m_run = run;
}CThread::~CThread()
{
::CloseHandle(m_hThread);
}static DWORD WINAPI ThreadFunc(LPVOID param)
{
CThread* thread = (CThread*)param;
if (thread->m_run != NULL)
{
thread->m_run->Run();
}
return 0;
}
void CThread::Start()
{
if (m_hThread == NULL)
{
DWORD dwThreadID = 0;
m_hThread = ::CreateThread(NULL, 0, ThreadFunc, this, 0, &dwThreadID);
}
}void CThread::WaitFinish()
{
::WaitForSingleObject(m_hThread, INFINITE);
}
其实这种在java里是很常见的设计模式
封装一个list,每次遇到请求都塞到这个list里面线程里面如下while(1)
{
if(threadover)
break; int res = waitforsingleobject(newmsgevent,,waittime) ;
根据res判断如果不是object_0
那么在newmsg没有被其他地方销毁的情况下
可能是超时了,否则直接break结束线程 resetevent(newmsgevent);
// 先到先处理
ClassA *self = list.getmsg();
list.remove(slef);
self.dosomething(); list为空时,直接卡死等新的信息来
waittime = -1;
if (list.isnotempty()){
// 否则直接超时返回。接着处理
waittime=0;
} 怕数据量多cpu高可以sleep一下。正常情况下感觉没必要。根据实际需求吧。
}
请求来的时候,做如下处理ClassA *self = createnewrequest();
list.add(slef);
setevent(newmsgevent);逻辑很简单,线程好写了吧。
需要注意的问题是list需要做线程互斥。否则多线程插入,删除会出错。
其他事件句柄/全局变量的创建等都是小菜了。