Search code examples
c++templateswinapinon-staticcreatethread

c++ CreateThread non static member without particular member name


I'm trying to create a thread with a non-static class member, like this:

template <class clName>
 DWORD WINAPI StartThread(PVOID ptr) {
   ((clName*)(ptr))->testf(); // this is static member name I want to be able use different names with the same function
   return 1;
 }

class Thread {
  private :
  HANDLE native_handle = 0;
  DWORD id = 0;
public :
  template <class T,class U>
  Thread(T U::*member,U* original); // I want to use different members with the same function
  bool run();
}

template<class T,class U>
Thread::Thread(T U::*member, U* original)
{
  native_handle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)StartThread<U>,original, CREATE_SUSPENDED, &id);
}

bool Thread::run() {
  DWORD res = ResumeThread(native_handle);
  if (res == (DWORD)-1) return false;
  return true;
}


class testt {
public :
  void testf() {
    MessageBoxA(0, "working", "", 0);
  }
  void doIt() {
    Thread t(&testt::testf,this);
    t.run();
  }
};

int main() {
  testt tt;
  tt.doIt();
}

As you see, I can only run a particular member, so this method isn't portable and can't be used for any class or member.

I know I can use std::thread easily, but I'm working on a project that I shouldn't use any C++ runtime in, so I am creating wrappers for new/delete, threads, file I/O, etc. Otherwise, I always use std::thread and it's fantastic. In this project, I have to use Win32 API only.


Solution

  • I ended with a winapi alternative for std::thread and works the same and is probably better

    class letTest {
    private :
      void pri(int u,float g, char l) {
          MessageBoxA(0, 0, 0, 0);
      }
    
    public :
      int doIt(int o) {
          auto t = thread(&letTest::pri, this,5,4.2,'k'); // works well with any number and type of parameters
          t.join();
          return 5;
      }
    };
    

    also with usual functions

    void ltest(int i) {
       MessageBoxA(0, to_string(i).c_str(), 0, 0);
    }
    int main() {
       auto t = thread(ltest, 4);
       t.join();
    }