2015-04-28 2 views
1

Я портировал приложение WinForms в Mac OS X 10.10.2 с помощью Mono 3.12.1. Главное окно прекрасно. Но когда я пытаюсь показать окно сообщения с System.Windows.Forms.MessageBox.Show («Hello») из рабочего потока, окно сообщения будет отображаться ненадолго, а затем программа выйдет из строя с:MessageBox.Show() вызывает сбой в Mono на Mac

mono (20661, 0xa0f5e1d4) таНос: * ошибка для объекта 0x7a6d86e0: указатель освобождения не было выделено * установить контрольную точку в malloc_error_break для отладки StackTrace:

в < 0xffffffff> в обертке системе (управляемых к родным). Windows.Forms.XplatUICarbon.ReceiveNextEvent (uint, intptr, double, bool, intptr &) < 0xffffffff> в System.Windows.Forms.XplatUICarbon.GetMessage (объект, System.Windows.Forms.MSG &, intptr, int, int) < 0x0007f> в System.Windows.Forms.XplatUI.GetMessage (объект, System.Windows. Forms.MSG &, IntPtr, Int, Int) < 0x00039> в System.Windows.Forms.Application.RunLoop (BOOL, System.Windows.Forms.ApplicationContext) < 0x00aff> в System.Windows.Forms.Application.Run (System.Windows.Forms.ApplicationContext) < 0x0004f> в System.Windows.Forms.Application.Run (System.Windows.Forms.Form) < 0x00033> на RevelarPcCommX.Program.Main() < 0x0003f> в точке (wrapper runtime-invoke) object.runtime_invoke_void (obje ct, intptr, intptr, intptr) < 0xffffffff>

Я могу выполнить эту функцию окна сообщения из кода главного окна. Но программа вылетает, когда этот код выполняется из другого потока на Mac. Кстати, окно сообщения прекрасно отображается в рабочем потоке на ПК с Windows 7. Итак, я думаю, вопрос в том, как я могу выполнить это окно сообщения в основном потоке из рабочего потока на Mac? Или, может быть, есть другое решение, чтобы исправить этот крах на Mac?

ответ

0

Это всего лишь предположение, но у меня были подобные проблемы, когда у меня было CheckForIllegalCrossThreadCalls для тестирования и забыл удалить его. Выполнение каких-либо подобных вызовов в другом потоке может привести к сбоям, несмотря на то, что он отлично работает под Windows. Таким образом, проверить две вещи:

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

  2. Убедитесь, что вы используете безопасные вызовы для своей рабочей нитки; вы можете не делать этого, если вы просто звоните MessageBox.Show

Смежные вопросы