У меня есть ListBox класса диалога А.
Есть 2 фукнции-потока не принадлежащие классу.
Как мне сделать, чтобы:
1. это контрол был доступен в этих ф-циях
2. синхронизировать доступ к этому контролу.
На уровне теории вроде понятно. А практически не догоняю
Здравствуйте, peer, Вы писали:
P>У меня есть ListBox класса диалога А. P>Есть 2 фукнции-потока не принадлежащие классу. P>Как мне сделать, чтобы: P>1. это контрол был доступен в этих ф-циях P>2. синхронизировать доступ к этому контролу.
Предлагаю сделать это по-другому — через асинхронную (PostMessage) или синхронную (SendMessage) посылку сообщений окну диалога. В обработчике этого сообщения обновляй ListBox
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
И что будет если 2 потока одновременно придут в крит.секцию? (тот который пришел чуть раньше будет ждать? если да, то как определить время, сколько 2 будет ждать?)
Здравствуйте, peer, Вы писали:
P>Скажите правильно ли я написал для синхронизации доступа к листконтролу:
<...code skipped ...>
P>И что будет если 2 потока одновременно придут в крит.секцию? (тот который пришел чуть раньше будет ждать? если да, то как определить время, сколько 2 будет ждать?)
Вроде правильно, только не забудь, что перед использованием критическая секция должна быть проинициализирована (InitializeCriticalSection), а после использования — освобождена (DeleteCriticalSection).
Если секция занята одним потоком, то следующий поток будет приостановлен при вызове EnterCriticalSection и возобновлен только тогда, когда из секции выйдет первый поток (после вызова LeaveCriticalSection в первом потоке).
Если тебя интересует время, можешь замерить его до и после вызова EnterCriticalSection. Разница и будет временем ожидания
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Хочу заметить, что тут есть один оч. не приятный момент. Возможно не в данном примере, но вообще.
Скажем hListBox->AddString(szwMessage); у тебя валится с каким-то Exception'ом, то ты войдёшь в CRITICAL_SECTION, а вот выйти — не выйдешь, и
все потоки будут ждать.
In a multi-threaded application written using MFC, you should not pass MFC objects across thread boundaries. As a general rule, a thread should access only those MFC objects that it creates. Failure to do so may cause run-time problems including assertions or unexpected program behavior.