Синхронизация потоков
Есть экземпляр класса TList. Внешние процессы постоянно вызывают функцию, которая добавляет в этот объект элементы. И есть процесс который постоянно обрабатывает эти элементы и удаляет их оттуда.
Так вот вопрос в том, как организовать работу всех этих процессов?
Столкнулся со следующей проблемой.
Есть экземпляр класса TList. Внешние процессы постоянно вызывают функцию, которая добавляет в этот объект элементы. И есть процесс который постоянно обрабатывает эти элементы и удаляет их оттуда.
Так вот вопрос в том, как организовать работу всех этих процессов?
Так все-таки процессы, а не потоки. Это маленько разные вещи. Если процессы, то черт его знает - создавать какие-нибудь lock-файлы (помоему это по топорному, но я другого не знаю). Может использовать win-сообщения?
Или потоки? Тогда все просто - создается глобальная блокирующая переменная и при входе каждого из потоков в критическую секцию устанавливается в состояние блокировки. Естественно все потоки при входе в эту секцию программы должны проверять состояние переменной и ожидать, если она установленна в состояние блокировки.
Если дело касается только визуальных компонентов, то тогда еще проще - см. хелпы по Synchronize().
Так все-таки процессы, а не потоки. Это маленько разные вещи. Если процессы, то черт его знает - создавать какие-нибудь lock-файлы (помоему это по топорному, но я другого не знаю). Может использовать win-сообщения?
Или потоки? Тогда все просто - создается глобальная блокирующая переменная и при входе каждого из потоков в критическую секцию устанавливается в состояние блокировки. Естественно все потоки при входе в эту секцию программы должны проверять состояние переменной и ожидать, если она установленна в состояние блокировки.
Если дело касается только визуальных компонентов, то тогда еще проще - см. хелпы по Synchronize().
Нет речь идет действительно о потоках... пробывал с глобальными переменными точнее с EnterCriticalSection итд, криво все работает... может накидаешь неольшой проект?8)
Внутри потока:
try {
// Действия
}
__finally {
pLock->Release();
}
вот и всё!
тут человек предлоожил использвать TThreadList.. кто-что думает по этому поводу?
TThreadList - идея хорошая. Хотя чем не устраивает TCriticalSection, предложенную mike'ом?
А вариант с мьютексом используется так:
// инициализация
hMutex = CreateMutex(NULL, FALSE, NULL);
...
// блокировка ресурса
WaitForSingleObject(hMutex, INFINITE);
// здесь выполняются действия над списком
// собственно это и есть критическая секция
...
// Выход из критической секции
ReleaseMutex(hMutex);
// где-то в конце...
CloseHandle(hMutex);
TThreadList - идея хорошая. Хотя чем не устраивает TCriticalSection, предложенную mike'ом?
А вариант с мьютексом используется так:
Создание Мьютекса отнимает порядка 600 процессорных команд, поэтому, как мне кажется, ее следует использовать там гдеэто действительно необходимо...
Здесь скорее всего TCriticalSection будет разумнее...
Где там Вам удалось найти грабли? :)
Зачем Mutex, когда есть Synchronize ?
Ведь есть же стандартый класс TThread, на основе кот. создаем класс своего потока.
Для выгрузки данных из потока используем стандартный метод Synchronize().
Это прописано во всех справочниках к Builder.
У меня пока все работало без проблем.
Пример
главный поток программы TGeneralForm, содержит TStringList
дочерний поток TSomeThread, содержит переменнную
RezultString
- в нее периодически записываются какие-то результаты работы этого потока. после чего их надо добавить в
GeneralForm->StringList
Для этого в TSomeThread создам функцию
{
GeneralForm->StringList->Add(RezultString
);
}
Далее в нужный момент (когда RezultString
уже содержит данные) вызываем эту функцию