LINUX.ORG.RU

std::bad_function_call на указатель метода класса

 


0

1

Приветствую.

В продолжении темы Вызов по указателю метода структуры вложенной в класс

Есть обработчик очереди класса в отдельном потоке

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))

Разве нельзя одновременно передавать указатель на метод класса в другой поток и обращаться к нему???

★★★

Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от eao197

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

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

но когда незная человека начинают его называть говном

Говном я вас не называл, это звиздеж.

и чем ему по жизни заниматься

Ну что поделать, если вы производите впечатление человека, для которого программирование (особенно на C++) ну не его.

и как он работодателя наепывает

Вы же наверняка сказали работодателю что способы выполнить работу. Хотя вопросы, которые вы здесь задаете явно показывают, что с этим все не так однозначно.

но думаю вы это уже и сами поняли, иначе бы не помогали мне больше

Вы заблуждаетесь. Я пишу здесь лишь потому, что мне это ничего не стоит.

eao197 ★★★★★
()