Ошибка «необработанное исключение» при смешивании boost :: thread с графическим интерфейсом wxWidgets - PullRequest
0 голосов
/ 08 апреля 2010

Я пытался получить доступ к членам wxDialog из boost :: thread:

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)

1 Ответ

2 голосов
/ 08 апреля 2010

0xbaadf00d указывает, что вы разыменовываете неинициализированный указатель; на вашем месте я бы покопался глубже с отладчиком, чтобы точно увидеть , где этот указатель (в dlg? в TextBox1? в том, что возвращает GetValue ()? Это поможет вам понять, в чем проблема.

Тем не менее, самой большой ошибкой является попытка получить доступ к графическому интерфейсу из другого потока: как явно указано здесь ,

При написании многопоточного приложения настоятельно рекомендуется, чтобы никакие вторичные потоки не вызывали функции GUI. Конструкция, в которой используется один поток графического интерфейса и несколько рабочих потоков, которые взаимодействуют с основным потоком с помощью событий, гораздо более надежна и, несомненно, избавит вас от множества проблем (например: под Win32 поток может получить доступ только к объектам GDI, таким как ручки, кисти, контексты устройства созданный сам, а не другими потоками).

Там вы также можете найти некоторые советы о том, как обойти эти ограничения с помощью событий и других средств wxWidgets.

...