Создание общего приложения ilbrary с wxWidgets (с помощью pthreads)

0

Я хочу создать приложение wxWidgets, загружаемое из общей библиотеки. Он должен быть добавлен как плагин к уже существующему C-приложению.

В каталоге samples (/samples/dll) wxWidgets я нашел файл "my_dll.cpp". Это именно то, что мне нужно. Это исключительно для окон. Мне нужно сделать версию.so linux.

Поэтому я переписал все ветки winapi, связанные с pthreads. Я никогда не делал многопоточности, поэтому в коде есть много ошибок, но я не могу их найти.

Может, кто-то может помочь.

наиболее важными функциями являются:

void run_wx_gui_from_dll(const char *title)

а также

void* MyAppLauncher(void* event)

вот ссылка на файл образцов из wxWidgets, который использует потоки winapi. http://pastebin.com/KhK4uiKZ вот ссылка на код, который использует pthreads http://pastebin.com/QmsPqYs5

Моя версия pthread работает правильно, когда я спал в конце run_wx_gui_from_dll.

Без сна CMD_SHOW_WINDOW не откроет новый кадр. Просто ничего не происходит. Я положил puts("received show window command"); in void MyDllApp::OnShowWindow. Строка печатается в stdout, поэтому я знаю, что работает wxQueueEvent. Но wxWidgets, похоже, блокируется при wxFrame *f = new MyDllFrame

  ...
  ...
  // Send a message to wx thread to show a new frame:
  wxThreadEvent *event =
  new wxThreadEvent(wxEVT_THREAD, CMD_SHOW_WINDOW);
  event->SetString(title);
  wxQueueEvent(wxApp::GetInstance(), event);

  sleep(3);
}

Версия Windows не требует сна.

run_wx_gui_from_dll запускает новый поток, из которого вызывается цикл событий wxWidgets. Затем необходимо подождать до тех пор, пока wxWidgets не будет правильно инициализирован до тех пор, пока он не сможет командовать в очереди. Вот почему я использовал условие pthread. Версия Windows делает аналогичную вещь.

Я также не знаю, что делает wxCriticalSectionLocker. Я оставил его там на всякий случай. Может быть, эта часть проблемы.

Теги:
dll
shared-libraries
pthreads
wxwidgets

1 ответ

0

Одна ошибка, которую я вижу в вашем коде, заключается в том, что вы должны заблокировать мьютекс перед запуском потока, иначе он может сигнализировать о его инициализации, прежде чем вы его ожидаете. Я не уверен, что это объясняет вашу проблему (на самом деле, вероятно, нет), но было бы неплохо исправить это. И если проблема не устранена, я боюсь, что вам действительно нужно ее отладить и посмотреть, что происходит, т.е. какой поток работает.

Также очень жаль, что мы не можем просто использовать wxThread здесь, это довольно раздражает, чтобы писать на платформе для инициализации независимой от платформы библиотеки. Мы действительно должны добавить wxInitializeInNewThread() или что-то вроде этого... Если вы случайно захотите внести свой вклад, пожалуйста, не стесняйтесь публиковать сообщения в списке рассылки wx-dev.

  • 0
    Спасибо за указание на ошибку. Если я блокирую мьютекс перед запуском потока, мне даже не нужно условие pthread. Теперь все намного проще. Проблема остается, хотя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню