我试图从boost :: thread访问wxDialog成员:
void AnotherThread(myWxDialog *dlg)
{
wxMessageBox(dlg->TextBox1->GetValue(), "It works!"); // This throws an error
}
void myWxDialog::OnButtonClick(wxCommandEvent &event)
{
boost::thread myThread(AnotherThread, this);
}
我收到了这个错误:
Unhandled exception at 0x004043d7 in MyProgram.exe: 0xC0000005: Access violation reading location 0xbaadf00d.
我认为不同线程之间不允许这种行为。
那么,有没有其他方法可以做同样的事情?
任何形式的帮助将不胜感激。 :)
(Microsoft Visual C ++ 2008 Express Edition)
答案 0 :(得分:2)
0xbaadf00d表示您正在取消引用未初始化的指针;如果我是你,我会深入研究调试器以确切地看到指针所在的(在文本框中的dlg?中?GetValue()返回什么?在wxMessageBox中的其他地方?)。这有助于您了解问题所在。
尽管如此,最大的错误是尝试从另一个线程访问GUI内容:明确说明here,
编写多线程应用程序时,强烈建议没有辅助线程调用GUI函数。使用一个GUI线程和几个使用事件与主要线程进行通信的工作线程的设计更加健壮,毫无疑问会为您节省无数问题(例如:在Win32下,线程只能访问GDI对象,如笔,画笔,设备上下文由自己创建,而不是由其他线程创建。)
在那里,您还可以找到一些有关如何使用事件和其他wxWidgets工具解决这些限制的建议。