Приветствую.
В продолжении темы Вызов по указателю метода структуры вложенной в класс
Есть обработчик очереди класса в отдельном потоке
void CQueue::Handler(void)
{
auto Get = [this](cmd_t & cmd) {
std::unique_lock<std::mutex> ul(mtx);
do {
if (!abRun) return false;
} while (!cv.wait_for(ul, std::chrono::seconds(1), [this]{ return !pq.empty(); }));
cmd = pq.top();
pq.pop();
return true;
};
cmd_t cmd;
while (Get(cmd))
if (cmd.handle)
(this->*(cmd.handle))(cmd.id, cmd.msg);
}
В саму очередь засовываю подобным образом из другого потока поступающих команд
pQ->Put(id, std::string(msg, msgLen), &CQueue::handle_pass);
частично описание класса
class CQueue
{
private:
struct cmd_t {
int8_t pri;
std::string id, msg;
void (CQueue::*handle)(const std::string & id, std::string & msg);
};
std::function<bool (const cmd_t &, const cmd_t &)> cmp = [](const cmd_t & l, const cmd_t & r){ return l.pri > r.pri; };
std::priority_queue<cmd_t, std::vector<cmd_t>, decltype(cmp)> pq;
Все работает полагаю пока команды идут настолько «медленно», что CQueue::Handler успевает встать на условную переменную, но если удается за время вызова (this->(cmd.handle))(cmd.id, cmd.msg) засунуть в очередь несколько команд, то валится ошибка std::bad_function_call при вызове (this->(cmd.handle))
Разве нельзя одновременно передавать указатель на метод класса в другой поток и обращаться к нему???