Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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-функции


Наверх

Титульная страница Поиск, карта сайта Написать письмо