Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Синхронизация потоков

323
06 марта 2005 года
Sergun
228 / / 20.09.2000
Столкнулся со следующей проблемой.
Есть экземпляр класса TList. Внешние процессы постоянно вызывают функцию, которая добавляет в этот объект элементы. И есть процесс который постоянно обрабатывает эти элементы и удаляет их оттуда.
Так вот вопрос в том, как организовать работу всех этих процессов?
243
07 марта 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Sergun
Столкнулся со следующей проблемой.
Есть экземпляр класса TList. Внешние процессы постоянно вызывают функцию, которая добавляет в этот объект элементы. И есть процесс который постоянно обрабатывает эти элементы и удаляет их оттуда.
Так вот вопрос в том, как организовать работу всех этих процессов?


Так все-таки процессы, а не потоки. Это маленько разные вещи. Если процессы, то черт его знает - создавать какие-нибудь lock-файлы (помоему это по топорному, но я другого не знаю). Может использовать win-сообщения?
Или потоки? Тогда все просто - создается глобальная блокирующая переменная и при входе каждого из потоков в критическую секцию устанавливается в состояние блокировки. Естественно все потоки при входе в эту секцию программы должны проверять состояние переменной и ожидать, если она установленна в состояние блокировки.
Если дело касается только визуальных компонентов, то тогда еще проще - см. хелпы по Synchronize().

323
07 марта 2005 года
Sergun
228 / / 20.09.2000
Цитата:
Originally posted by pacific_7

Так все-таки процессы, а не потоки. Это маленько разные вещи. Если процессы, то черт его знает - создавать какие-нибудь lock-файлы (помоему это по топорному, но я другого не знаю). Может использовать win-сообщения?
Или потоки? Тогда все просто - создается глобальная блокирующая переменная и при входе каждого из потоков в критическую секцию устанавливается в состояние блокировки. Естественно все потоки при входе в эту секцию программы должны проверять состояние переменной и ожидать, если она установленна в состояние блокировки.
Если дело касается только визуальных компонентов, то тогда еще проще - см. хелпы по Synchronize().



Нет речь идет действительно о потоках... пробывал с глобальными переменными точнее с EnterCriticalSection итд, криво все работает... может накидаешь неольшой проект?8)

247
07 марта 2005 года
wanja
1.2K / / 03.02.2003
А мьютекс, или, там, событие, впиндюрить слабо?
4
07 марта 2005 года
mike
3.7K / / 01.10.2002
Объявляешь глобальную переменную:

 
Код:
TCriticalSection *pLock;


Внутри потока:

 
Код:
pLock->Acquire();
try {
    // Действия
    }
__finally {
    pLock->Release();
    }


вот и всё!
323
07 марта 2005 года
Sergun
228 / / 20.09.2000
тут человек предлоожил использвать TThreadList.. кто-что думает по этому поводу?
303
09 марта 2005 года
makbeth
1.0K / / 25.11.2004
Цитата:
Originally posted by Sergun
тут человек предлоожил использвать TThreadList.. кто-что думает по этому поводу?


TThreadList - идея хорошая. Хотя чем не устраивает TCriticalSection, предложенную mike'ом?
А вариант с мьютексом используется так:

Код:
HANDLE hMutex;

// инициализация
hMutex = CreateMutex(NULL, FALSE, NULL);
...

// блокировка ресурса
WaitForSingleObject(hMutex, INFINITE);
// здесь выполняются действия над списком
// собственно это и есть критическая секция
...
// Выход из критической секции
ReleaseMutex(hMutex);

// где-то в конце...
CloseHandle(hMutex);
8.4K
23 марта 2005 года
Reshetnyak
19 / / 02.12.2004
Цитата:
Originally posted by makbeth
TThreadList - идея хорошая. Хотя чем не устраивает TCriticalSection, предложенную mike'ом?
А вариант с мьютексом используется так:


Создание Мьютекса отнимает порядка 600 процессорных команд, поэтому, как мне кажется, ее следует использовать там гдеэто действительно необходимо...
Здесь скорее всего TCriticalSection будет разумнее...

2.3K
24 марта 2005 года
ART-CODE
134 / / 15.11.2004
Просветите, пожалуйста, какая может быть проблема с потоками в Builder ?
Где там Вам удалось найти грабли? :)

Зачем Mutex, когда есть Synchronize ?

Ведь есть же стандартый класс TThread, на основе кот. создаем класс своего потока.
Для выгрузки данных из потока используем стандартный метод Synchronize().
Это прописано во всех справочниках к Builder.
У меня пока все работало без проблем.

Пример

главный поток программы TGeneralForm, содержит TStringList

дочерний поток TSomeThread, содержит переменнную
RezultString
- в нее периодически записываются какие-то результаты работы этого потока. после чего их надо добавить в
GeneralForm->StringList
Для этого в TSomeThread создам функцию
 
Код:
void __fatcall TSomeThread::OutRezultStr()
{
GeneralForm->StringList->Add(RezultString
);
}


Далее в нужный момент (когда RezultString
уже содержит данные) вызываем эту функцию
 
Код:
Synchronize(OutRezultStr);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог