kobi89
kobi89

Reputation: 162

Why multithreading in c++ DLL get error C3867 when building?

I am using VS2019

Trying to call a thread in DLL. to run two executables simultaneously with detach

following threads worked when I Run a normal c++ program

I get error

Error C3867 'myClass::runexeone': non-standard syntax; use '&' to create a pointer to member myGateway C:\Users\user\Downloads\Demo\myGateway\myplugin.cpp 21

plugin header

#include <windows.h>
#include <iostream>
#include <thread> 


#define MYPLUGIN_EXPORT __declspec(dllexport)

extern "C"
{
    MYPLUGIN_EXPORT void WINAPI OnStart();
}

pluging.cpp

#include "plugin.h"
using namespace std;

class myClass
{
public:
    myClass()
    {

    }
    ~myClass()
    {

    }
    void onStart()
    {
        std::thread(runexeone).detach();
        std::thread(runexetwo).detach();
    }

    void runexeone()
    {
        int exerunpne = system("cmd /C \"%MY_ROOT%\\bin\\Mytest.exe\" -ORBEndpoint iiop://localhost:12345 -d");
    }


    void runexetwo()
    {
        int exeruntwo = system("cmd /C \"%MY_ROOT%\\bin\\Mytest_2.exe\" -ORBEndpoint iiop://localhost:12345 -d");
    }

};

myClass& getmyclass()
{
    static myClass myclass;
    return myclass;
}


MYPLUGIN_EXPORT void WINAPI OnStart()
{
    getmyClass().onStart();
}

Upvotes: 0

Views: 111

Answers (2)

Secundi
Secundi

Reputation: 1190

As MSalters already mentioned, you provided the wrong data type for the functor for std::thread. If you cannot make the method static (which you can actually at least for the current state of your code, but to let this not be unstated here), you can do this

  void onStart()
  {
    std::thread(std::bind(&myClass::runexeone, this)).detach();
  }

But be careful about the lifetime/existence of your object/this!

Upvotes: 1

MSalters
MSalters

Reputation: 179809

The problem is that runexeone is an unqualified name of a member function, and std::thread needs something executable. runexeone isn't. VC++ tries to guess from context what you mean, but the suggestion isn't enough. Even if you had written &myClass::runexeone, it still wouldn't have worked, because myClass::runexeone also needs a this pointer. You can fix the latter problem by making it static.

Compiler suggestions work best when there's just one problem.

Upvotes: 2

Related Questions