最近在写个项目,比如有一个类的成员函数,这个成员函数会做一些很重的事情 比如一个HTTP请求。我在线程A里面调用这个
成员函数不现实,想将这个成员函数分派到一个线程里面去跑。有什么优雅的方法么?比如
class ClassA obj;
obj.fun() //这个fun就是HTTP请求或者其他一些很重的事情要执行几秒。我想把这个放到线程里面去执行。我自己现在用的方法不好看。比如有个线程池 有一个线程是空闲的。我在类里面定义了一个成员static函数
static int threadFun(ClassA *self)
{
    self->fun();
}
这样来执行的。封装性不好 。比如我要执行fun2() 又要单独去写个threadFun2 。很丑 。
有谁有更好的办法吗?本来想用汇编代码把this指针给ecx然后call。也不靠谱 不同编译器的thiscall的调用约定也不太一样。在C++层面是否有方法可以做到?

解决方案 »

  1.   

    都想到汇编直接用ecx赋值了,类函数指针传递,或者把线程参数弄个结构,把需要的指针都传进去。
      

  2.   

    function 还是要一个一个写,
    fubctions 搞成 一个 数组,
    类里 搞个 index   m_funidx
    static int threadFun(ClassA *self)
    {
        self->funs[m_funidx];
    }
      

  3.   

    你可以定义一些回调函数,将这些回调函数和相关的CONTEXT上下文参数封装一下,作为线程函数的参数传递给线程。
      

  4.   

    static int threadFun()
    {
        ClassA *self = new ClassA();
        self->fun();
    }
    这样定是不是封装性好?
      

  5.   

    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;
    };
    楼主有了解回调和虚函数吗?
    有的话,上面的接口就可以办到说的。
      

  6.   

    #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);
    }
      

  7.   

    https://blog.csdn.net/xuan_xuan_2/article/details/89299048参考下QThreadPool、和QRunnable 的实现办法,
    其实这种在java里是很常见的设计模式
      

  8.   

    还没结帖吧?
    封装一个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需要做线程互斥。否则多线程插入,删除会出错。
    其他事件句柄/全局变量的创建等都是小菜了。