Синхронизация
От: peer  
Дата: 04.05.06 06:01
Оценка:
У меня есть ListBox класса диалога А.
Есть 2 фукнции-потока не принадлежащие классу.
Как мне сделать, чтобы:
1. это контрол был доступен в этих ф-циях
2. синхронизировать доступ к этому контролу.
На уровне теории вроде понятно. А практически не догоняю
Re: Синхронизация
От: ekamaloff Великобритания  
Дата: 04.05.06 06:05
Оценка:
Здравствуйте, 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
Re: Синхронизация
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 04.05.06 06:07
Оценка:
Здравствуйте, peer, Вы писали:

P>1. это контрол был доступен в этих ф-циях


friend или static

P>2. синхронизировать доступ к этому контролу.


CRITICAL_SECTION
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
Re: Синхронизация
От: peer  
Дата: 04.05.06 08:00
Оценка:
Исправлено форматирование текста. — SchweinDeBurg

Скажите правильно ли я написал для синхронизации доступа к листконтролу:

DWORD ThreadFunc( LPVOID lp)
{
    EnterCriticalSection( &criticalSection );    

    if ( hListBox )
    {
        hListBox->AddString(szwMessage);
    }

    LeaveCriticalSection( &criticalSection );
}

И что будет если 2 потока одновременно придут в крит.секцию? (тот который пришел чуть раньше будет ждать? если да, то как определить время, сколько 2 будет ждать?)

Спасибо!
Re[2]: Синхронизация
От: ekamaloff Великобритания  
Дата: 04.05.06 08:10
Оценка:
Здравствуйте, 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
Re[2]: Синхронизация
От: Darkman_VLT Россия  
Дата: 06.05.06 08:26
Оценка:
Здравствуйте, peer, Вы писали:
P>Скажите правильно ли я написал для синхронизации доступа к листконтролу:

P>
P>DWORD ThreadFunc( LPVOID lp)
P>{
P>    EnterCriticalSection( &criticalSection );    

P>    if ( hListBox )
P>    {
P>        hListBox->AddString(szwMessage);
P>    }

P>    LeaveCriticalSection( &criticalSection );
P>}
P>

Хочу заметить, что тут есть один оч. не приятный момент. Возможно не в данном примере, но вообще.
Скажем hListBox->AddString(szwMessage); у тебя валится с каким-то Exception'ом, то ты войдёшь в CRITICAL_SECTION, а вот выйти — не выйдешь, и
все потоки будут ждать.

Т.ч. по-возможности делай так:
EnterCriticalSection(&_cs);
__try
{
 //Some code
}
__finally
{
LeaveCriticalSection(&_cs);
}


А ещё есть функа TryEnterCriticalSection, но поддерживается только в ХП :(
Re[3]: Синхронизация
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 06.05.06 09:00
Оценка:
Здравствуйте, Darkman_VLT, Вы писали:

D_V>Хочу заметить, что тут есть один оч. не приятный момент.


и еще один — http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q147578

SUMMARY

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.

MORE INFORMATION
...

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.