Создание потока нестатической функции-члена?

Если у меня есть функция-член. , ,

MyClass::MyFunction()
{
    while(1)
    {
        //blah blah blah
    }
}

, , , и я пытаюсь создать поток этой функции. , ,

CreateThread(Null, 0, (LPTHREAD_START_ROUTINE)MyFunction, NULL, 0, NULL);

, , , Я всегда получаю сообщение об ошибке (LPTREAD_START_ROUTINE) MyFunction является недопустимым приведением типов и что я не могу создать поток нестатической функции-члена.

I cannot make my function static because I use the this pointer several times which requires a nonstatic member function to do so.

Есть ли простой способ создать поток нестатической функции-члена?

(Я работаю в Visual Studio 2010, C ++, MFC)

3
nl ja de
добавлено автор Xyand, источник
Эта тема много раз рассматривается на SO. поток C ++ в функции-члене , Создать поток не принимает функцию-член , запускает потоки функции-члена класса в c ++ ... Быстрый поиск " функция члена потока "отображает много хитов на этом сайте.
добавлено автор Raymond Chen, источник

3 ответы

Вы должны приватизировать всю эту информацию, за исключением, возможно, функции «start ()». У вас будет частная статическая функция-член вашего класса в качестве цели для запуска потока операционной системы, в «start ()» передать метод запуска потока «этот» указатель вашего объекта, вернуть его обратно к типу объекта в вашем статической функции, которая затем вызывает ваш собственный метод основного потока на самом объекте. Поскольку статическая функция является членом класса, она может использовать частные функции, тогда как если бы она не была, она не могла (не будучи другом). Я не компилировал/не тестировал это, но идея такова:

class MyObj {
private:
    void thread() {
           //this-> is valid here
    }

    static DWORD static_entry(LPVOID* param) {
        MyObj *myObj = (MyObj*)parm;
        myObj->thread();
        return 0;
    }

public:
    void start() {
        CreateThread(Null, 0, (LPTHREAD_START_ROUTINE)static_entry, this, 0, NULL);
    }
};

Предупреждение: не уничтожайте объект во время работы потока! Возможно, вам придется синхронизировать с мьютексом или убедиться, что поток соединен при уничтожении объекта. Вы также можете сделать «удалить это» в конце потока() или удалить myObj в конце static_entry, если вызывающий объект start() больше не управляет объектом.

4
добавлено

Создание статической функции

static DWORD myFunctionCaller(LPVOID* param)  
{
  MyClass* myClass = static_cast(param);
  myClass->MyFunction();
}

CreateThread(Null, 0, (LPTHREAD_START_ROUTINE)myFunctionCaller, this, 0, NULL);

Недостатком является то, что вы получаете несколько плавающих статических функций, но вы можете ограничить область легко, и это должно помешать вам создавать слишком много потоков

2
добавлено
Чтобы избежать плавающих статических функций, вы также можете определить статическую функцию внутри вашего класса как статическую функцию.
добавлено автор mfc, источник

Функция члена C ++ не может быть вызвана без экземпляра класса. Следующий код - одно из моих предложений;

MyClass * instance = ...;//valid instance.
CreateThread(NULL, 0, StartRoutine, instance, 0, NULL);

DWORD WINAPI StartRoutine(LPVOID ptr) {
  static_cast(ptr)->MyFunction();
}

Другое предложение - объявить функцию-член с ключевым словом static ;

class MyClass {
  ...
  static DWORD WINAPI MyFunction();
  ...
}

Во втором коде MyFunction не может обращаться к переменным-членам класса (не static ).

2
добавлено
Указатель instance должен указывать правильный экземпляр MyClass .
добавлено автор kamae, источник
Это не сработает, потому что внутри потока я использую указатель this , ссылаясь на окно. Моя программа выйдет из строя, когда она дойдет до этой линии.
добавлено автор xcdemon05, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest