Ссылаясь на эту публикацию, я есть чистый виртуальный класс:
#define CALL __stdcall
class IIEvent
{
virtual ~IIEvent() {}
virtual void CALL ev1(int) = 0;
virtual void CALL ev2(int) = 0;
};
Этот интерфейс используется для реализации шаблона публикации-подписчика. Библиотека вызывает функцию IIEvent
в отдельном потоке.
void generateEvent1( int i )
{
// mListeners is a std::vector< IIEvent* >
for ( auto& f : mListeners )
{
std::thread t( &IIOEvent::ev1, f, t ) );
t.detach();
}
}
Но это дает мне ошибку времени компиляции (в этом случае я использую MinGW): проблема кажется соглашением о вызовах. Если я удаляю соглашение о вызовах, все работает нормально.
Итак, как я могу запустить поток функции с определенным соглашением о вызовах?
Примечание: необходимо соглашение о вызовах, чтобы убедиться, что библиотека работает с другими компиляторами.
Благодаря Кори Нельсону решение может быть:
void generateEvent1( int i )
{
// mListeners is a std::vector< IIEvent* >
for ( auto& f : mListeners )
{
std::thread t( [f, i] ()
{
f->ev1( b );
});
t.detach();
}
}
Но это, кажется, вызывает сбой во время выполнения моего приложения...
std::thread
принимает функтор. Попробуйте обернуть свою функцию в лямбду. - person Cory Nelson   schedule 30.10.2013b
иt
? Они как-то связаны сi
? - person Igor Tandetnik   schedule 30.10.2013std::thread t( [&f, i] ()
гдеi
- это параметр ev1. - person Elvis Dukaj   schedule 30.10.2013