【问题标题】:boost::signal with arguments from static member function?boost::signal 带有来自静态成员函数的参数?
【发布时间】:2014-02-21 12:29:06
【问题描述】:

rtmidi 库需要将回调设置为静态函数,该函数应处理传入的 midi 消息。我找到了解决方法(CinderMidiIn::callback 函数),但是当我在解析后尝试发送信号时应用程序崩溃。这是代码的缩短版本:

void static callback(double deltatime, std::vector< unsigned char > *message, void *userData){
    ((CinderMidiIn*)userData)->newMidiMessage(deltatime * 1000, message);
}
void newMidiMessage(double deltatime, std::vector< unsigned char > *message){

    midiMessage newMsg(message);

                    //parse message

    //midiSignal(newMsg); /// THIS DOES NEITHER WORKS
    dispatch(newMsg);
}

void dispatch(midiMessage &msg){

    midiSignal(msg);
}

// Signal
boost::signals2::signal<void(midiMessage)> midiSignal;


//// MAIN FUNCTION    ////

void ciMidiIn::midiEvent(midiMessage msg){
cout << "value " << msg.value << endl;
}

void ciMidiIn::setup()
{
midi.midiSignal.connect(boost::bind(&ciMidiIn::midiEvent, this, boost::arg<1>::arg()));
}

我在编译期间收到大量警告,并且在启动时崩溃(在第 149-150 行发送信号时)调用堆栈让我不知道从哪里开始寻找解决方案:

 VanillaRTMidi.exe!boost::signals2::signal1<void,midiMessage,boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(midiMessage)>,boost::function<void __cdecl(boost::signals2::connection const &,midiMessage)>,boost::signals2::mutex>::operator()(midiMessage arg1) Line 695 C++
VanillaRTMidi.exe!boost::shared_ptr<boost::signals2::detail::signal1_impl<void,midiMessage,boost::signals2::optional_last_value<void>,int,std::less<int>,boost::function<void __cdecl(midiMessage)>,boost::function<void __cdecl(boost::signals2::connection const &,midiMessage)>,boost::signals2::mutex> >::operator*() Line 646 C++

我已经阅读了很多关于静态函数的内容,并且我了解非静态变量无法访问静态函数,但是我仍然不知道如何将任何内容传递给信号并从静态函数中调度它。

免责声明: Originally posted on Cinder Forums,带有指向包含完整代码的 pastebin 的链接,但正如我在原帖顶部提到的,这更有可能是 Stack Overflow 的问题。

【问题讨论】:

  • 检查userData 是指向CinderMidiIn 实例的有效指针。确保调用回调时实例是“活动的”(未销毁)。
  • 天哪,你说得对!更糟糕的是,我忘记完全添加它们了,嗯...

标签: c++ boost static boost-signals2


【解决方案1】:

所以最后的问题是未初始化的用户数据(感谢 Igor R. 指出这一点!) From rtmidi documentation:

void RtMidiIn::setCallback (RtMidiCallback callback, void * userData = 0);

因为我只是根据 midi 输入教程包装 rtmidi,所以没有类(一切都只是 main() 之外的全局函数),所以我没有考虑实际设置该指针。

哇,一路走来,我学到了很多……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2021-07-10
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    相关资源
    最近更新 更多