C ++ WxWidgets: одно окно журнала для сообщений из нескольких потоков - PullRequest
0 голосов
/ 15 июля 2009

Каков наилучший / правильный метод сбора сообщений журнала из нескольких потоков и отображения их всех в окне? (пока работают потоки).

В настоящее время я пытаюсь перенаправить stdout (cout) в wxTextCtrl, но с треском проваливаюсь при попытке сделать это через несколько потоков. Любая помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 15 июля 2009

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

1 голос
/ 15 июля 2009

Как это терпит неудачу? Я не знаком с wxTextCtrl, но если он не имеет встроенной синхронизации (т. Е. Его потокобезопасности), это может быть большой проблемой. Самый простой способ защитить один ресурс, подобный этому, - использовать мьютекс. В следующем примере показано, что вы можете сделать в каждом потоке, чтобы убедиться, что только один из них обращается к этому ресурсу (окну вывода) за раз.

// In each thread's initialization:
HANDLE mutexHandle = CreateMutex(0,FALSE,"__my_protecting_mutex__");


// Whenever you use the debug output:

WaitForSingleObject(mutexHandle, /* Timeout if you like. */ 0xFFFFFFFF );
// Do our printing here.
ReleaseMutex(mutexHandle);


// In each thread's cleanup:
CloseHandle(mutexHandle);

Таким образом, это в основном гарантирует, что между ожиданием и выпуском может быть только один поток. Теперь, если ваша проблема на самом деле связана с wxTextCtrl, мне понадобятся некоторые подробности.

Редактировать: Я только что понял, что то, что я опубликовал, относится только к Windows, и, возможно, вы не в Windows! Если нет, у меня нет опыта работы с другими методами синхронизации платформ, но у boost есть несколько общих библиотек, которые не зависят от платформы.

...