Потокобезопасная функция обратного вызова - PullRequest
0 голосов
/ 12 декабря 2010

Как я могу сделать функцию обратного вызова безопасной для потока. Эта функция будет вызываться различными потоками для обновления пользовательского интерфейса. Эта функция обратного вызова будет иметь параметр HWND, который будет заполнен вызывающей стороной. Функция будет использовать этот параметр HWND для обновления GUI. HWND будет отличаться для разных вызовов.

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

Привет.

John

1 Ответ

2 голосов
/ 12 декабря 2010

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

Если функция обратного вызова не требует состояния, оно уже поточно-безопасное, если только сами функции графического интерфейса не являются поточно-безопасными (см. вторую половину этого ответа).

Если требуется состояние, включите мьютекс в это состояние и заблокируйте мьютекс во время любого доступа для чтения / записи.

Существуют более сложные блокировкипарадигмы (например, блокировки нескольких читателей / одного писателя), но вам, вероятно, это не понадобится для графического интерфейса.


Другая проблема для графических интерфейсов (верно для Java Swing; я не могу вспомнить,это верно для win32 или нет) в том, что операции с графическим интерфейсом обычно должны выполняться в одном конкретном потоке.В win32 это является причиной для отправки и отправки сообщений (которые обрабатываются одним потоком).

Если вы хотите использовать этот подход, каждый раз, когда вы хотите выполнить операцию с графическим интерфейсом, вы должны проверить, находитесь ли вы впоток GUI (не могу вспомнить, как это сделать в win32) или выполнить вызов PostMessage (), чтобы запустить определенные операции GUI.

...