C++将一个成员函数怎么跑在一个线程里面

weixin_42022277 2019-11-09 04:50:52
最近在写个项目,比如有一个类的成员函数,这个成员函数会做一些很重的事情 比如一个HTTP请求。我在线程A里面调用这个
成员函数不现实,想将这个成员函数分派到一个线程里面去跑。有什么优雅的方法么?

比如
class ClassA obj;
obj.fun() //这个fun就是HTTP请求或者其他一些很重的事情要执行几秒。我想把这个放到线程里面去执行。

我自己现在用的方法不好看。比如有个线程池 有一个线程是空闲的。我在类里面定义了一个成员static函数
static int threadFun(ClassA *self)
{
self->fun();
}
这样来执行的。封装性不好 。比如我要执行fun2() 又要单独去写个threadFun2 。很丑 。
有谁有更好的办法吗?

本来想用汇编代码把this指针给ecx然后call。也不靠谱 不同编译器的thiscall的调用约定也不太一样。在C++层面是否有方法可以做到?
...全文
782 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
纵使微芒如烟 2019-12-10
  • 打赏
  • 举报
回复
c++11的闭包可以轻易实现,甚至可以使用泛型线程池https://github.com/gdlxSong/GdlLib/tree/master/gdltool/threadpool 另外,c++11提供标准库线程库,可以使用std::thread, example: class Test{ public: void run(int){} } main(){ Test test; std::thread th(&Test::run, &test, 20); //... th.join(); }
advance_coder 2019-11-16
  • 打赏
  • 举报
回复
还没结帖吧? 封装一个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需要做线程互斥。否则多线程插入,删除会出错。 其他事件句柄/全局变量的创建等都是小菜了。
走好每一步 2019-11-15
  • 打赏
  • 举报
回复
https://blog.csdn.net/xuan_xuan_2/article/details/89299048 参考下QThreadPool、和QRunnable 的实现办法, 其实这种在java里是很常见的设计模式。。。
走好每一步 2019-11-15
  • 打赏
  • 举报
回复
#include "stdafx.h"
#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);
}
走好每一步 2019-11-15
  • 打赏
  • 举报
回复
class IRunnable
{
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;
};
楼主有了解回调和虚函数吗? 有的话,上面的接口就可以办到说的。
hhhh63 2019-11-14
  • 打赏
  • 举报
回复
static int threadFun()
{
ClassA *self = new ClassA();
self->fun();
}
这样定是不是封装性好?
Eleven 2019-11-11
  • 打赏
  • 举报
回复
你可以定义一些回调函数,将这些回调函数和相关的CONTEXT上下文参数封装一下,作为线程函数的参数传递给线程。
schlafenhamster 2019-11-10
  • 打赏
  • 举报
回复
function 还是要一个一个写,
fubctions 搞成 一个 数组,
类里 搞个 index m_funidx
static int threadFun(ClassA *self)
{
self->funs[m_funidx];
}
gouyanfen 2019-11-09
  • 打赏
  • 举报
回复
都想到汇编直接用ecx赋值了,类函数指针传递,或者把线程参数弄个结构,把需要的指针都传进去。
zgl7903 2019-11-09
  • 打赏
  • 举报
回复

15,471

社区成员

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

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