![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TStringList между потоками... [D7]
Makhanev Alexander © (2007-07-12 13:13:00)юзать глобальную переменную типа TStringList в неск-ких потоках (одного типа) - надо тока через синхронизацию?
а простые переменные можно без синхронизации?
Kolan (2007-07-12 14:59:00) [1]Я бы централизовал синхронизацию. То есть потоки ничего не знаю о глобольной TStrings, а у них есть событие
OnSendStrings.
Всем потокам назначается один обработчик событияOnSendStrings. В этом обработчкике и используйтеTCriticalSectionдля синхронизации.
Инс (2007-07-12 14:56:00) [2]Немного добавит надо.
> Synchronize нужно использовать только если необходимо обратиться
> в из потока к визуальным компонентам.
... или если данный код по тем или иным причинам должен быть выполнен именно главным потоком.
Инс (2007-07-12 14:54:00) [3]Во-первых, Synchronize злоупотреблять не нужно. Его вызов заставляет поток остановиться и подождать, пока главный поток освободится и выполнит метод, переданный в качестве параметра. Synchronize нужно использовать только если необходимо обратиться в из потока к визуальным компонентам. Для вашей задачи действительно подойдет критическая секция. Каждое обращение к глобальному ресурсу (в вашем случае - TStringList) из любого потока (будь то главный или нет) заключайте в рамке enter/leave одной и той же критической секции. Как работает критическая секция надеюсь знаете.
umbra (2007-07-12 14:50:00) [4]
> надо юзать CS при чтении из tstringlist'а или нет
если использовать - хуже не будет, а лучше - скорее всего
Makhanev Alexander (2007-07-12 14:46:00) [5]у тут хотелось бы точно знать - надо юзать CS при чтении из tstringlist'а или нет..
Makhanev Alexander (2007-07-12 14:45:00) [6]>Это смотря какая задача.
n потоков сохраняют в массив строк инфу, доступную всем потокам.
поток вначале читает массив и если там нет того чего надо, то пишет в него... т.е. массив накапливает какие-то данные для потоков..
Makhanev Alexander (2007-07-12 14:43:00) [7]кстати, а если юзится synchronize, то в critical section нет смысла?
то есть в главном потоке всё по очереди выполнится?
(если N потоков одновременно сделают synchronize(myprocedure))
Инс (2007-07-12 14:04:00) [8]
> итого - если заюзать глобальную критич. секцию, то всё буит
> ок?
Это смотря какая задача.
Makhanev Alexander (2007-07-12 13:53:00) [9]итого - если заюзать глобальную критич. секцию, то всё буит ок?
Инс (2007-07-12 13:19:00) [10]
> Атомарные типы вроде integer, char и т.д. можно и без синхронизации.
Интересное утверждение...
Однокамушкин (2007-07-12 13:17:00) [11]Доступ к любым переменным надо синхронизировать, исключение допускается только в том случае, если несколько нитей используют какую-то переменную только для чтения, и ни одна другая нить во время их работы не будет эту переменную изменять...
Другое дело, что для доступа к StringList-у нет нужды использовать такой радитальный метод синхронизации как Synchronize, достаточно критических секций...
DrPass (2007-07-12 13:17:00) [12]
> а простые переменные можно без синхронизации?
Зависит от того, что ты считаешь "простыми". Атомарные типы вроде integer, char и т.д. можно и без синхронизации. Более сложные типы, например, строки и массивы - только с синхронизацией
Инс (2007-07-12 13:17:00) [13]
> а простые переменные можно без синхронизации?
Нет. Представьте что будет, если два потока будут одновременно писать в эту переменную свои значения, а потом - читать. Что там будет?
См Interlocked-функции