解决挂起wxWidgets单选按钮GetValue()调用

时间:2014-08-13 15:56:25

标签: c++ user-interface wxwidgets

我目前正在使用wxWidgets来创建一个基本上可以在两种模式下运行的GUI,并且我让用户选择哪一个带有一对单选按钮。但是,在程序决定使用哪种模式的分叉点,程序会在等待wxRadioButton对象的GetValue()函数返回时无限期挂起。

GetValue()函数内部进行调试时,我可以看到m_isChecked参数(函数返回的bool表示单选按钮的状态)已定义并具有正确的值,但该函数在返回值之前尝试进行断言(这个概念在最好的情况下有点不稳定)。 (短)代码如下:

bool wxRadioButton::GetValue() const
{
    wxASSERT_MSG( m_isChecked ==
                (::SendMessage(GetHwnd(), BM_GETCHECK, 0, 0L) != 0),
                wxT("wxRadioButton::m_isChecked is out of sync?") );

    return m_isChecked;
}

据我所知,SendMessage()函数导致挂起,这是其他人在不同情况下似乎也遇到的问题。然而,非常奇怪的是,我可以在代码的早期执行GetValue()函数,一致,没有错误(其他人声称他们的单选按钮是否有效是一个看似随机的因素)。我不知道从那时到分叉点之间会发生什么显着变化。编辑:我已经测试了代码,它似乎一直工作,直到程序启动多线程,此时GetValue()函数停止工作。这可能与悬挂有关吗?

我的问题是,是否有人对如何消除这种悬挂有任何见解?我的最后一招是修改wxWidgets代码,但这似乎是一个糟糕的主意。任何想法都会非常感激。谢谢!

2 个答案:

答案 0 :(得分:0)

作为SendMessage函数,它将指定的消息发送到一个或多个窗口。 SendMessage函数调用指定窗口的窗口过程,并且在窗口过程处理完消息之前不会返回。

所以这意味着处理BM_GETCHECK消息的函数没有返回,你应该先检查那个函数。

答案 1 :(得分:0)

你确定断言没有被实际触发,你只是错过了等待输入的对话框吗?这是我观察到的行为的唯一解释。

我们真的需要一些simple example reproducing the problem来告诉你如果由于其他因素而导致这种情况发生,因为我之前从未见过这种情况(标准{{}存在问题1}} Windows功能在涉及单选按钮时进入无限循环,但是,首先,它们是固定的,其次,问题从来没有出现在::IsDialogMessage()中。