Вниз
Скачать: CL | DM;

TStringList между потоками...   Найти похожие ветки 

← →
Makhanev Alexander   (2007-07-12 13:13) [0]

юзать глобальную переменную типа TStringList в неск-ких потоках (одного типа)  - надо тока через синхронизацию?

а простые переменные можно без синхронизации?


← →
Однокамушкин   (2007-07-12 13:17) [1]

Доступ к любым переменным надо синхронизировать, исключение допускается только в том случае, если несколько нитей используют какую-то переменную только для чтения, и ни одна другая нить во время их работы не будет эту переменную изменять...

Другое дело, что для доступа к StringList-у нет нужды использовать такой радитальный метод синхронизации как Synchronize, достаточно критических секций...


← →
DrPass ©   (2007-07-12 13:17) [2]


> а простые переменные можно без синхронизации?

Зависит от того, что ты считаешь "простыми". Атомарные типы вроде integer, char и т.д. можно и без синхронизации. Более сложные типы, например, строки и массивы - только с синхронизацией


← →
Инс ©   (2007-07-12 13:17) [3]


> а простые переменные можно без синхронизации?


Нет. Представьте что будет, если два потока будут одновременно писать в эту переменную свои значения, а потом - читать. Что там будет?

См Interlocked-функции


← →
Инс ©   (2007-07-12 13:19) [4]


> Атомарные типы вроде integer, char и т.д. можно и без синхронизации.


Интересное утверждение...


← →
Makhanev Alexander   (2007-07-12 13:53) [5]

итого - если заюзать глобальную критич. секцию, то всё буит ок?


← →
Инс ©   (2007-07-12 14:04) [6]


> итого - если заюзать глобальную критич. секцию, то всё буит
> ок?


Это смотря какая задача.


← →
Makhanev Alexander   (2007-07-12 14:43) [7]

кстати, а если юзится synchronize, то в critical section нет смысла?

то есть в главном потоке всё по очереди выполнится?
(если N потоков одновременно сделают synchronize(myprocedure))


← →
Makhanev Alexander   (2007-07-12 14:45) [8]

>Это смотря какая задача.
n потоков сохраняют в массив строк инфу, доступную всем потокам.

поток вначале читает массив и если там нет того чего надо, то пишет в него...  т.е. массив накапливает какие-то данные для потоков..


← →
Makhanev Alexander   (2007-07-12 14:46) [9]

у тут хотелось бы точно знать - надо юзать CS при чтении из tstringlist"а или нет..


← →
umbra ©   (2007-07-12 14:50) [10]


> надо юзать CS при чтении из tstringlist"а или нет

если использовать - хуже не будет, а лучше - скорее всего


← →
Инс ©   (2007-07-12 14:54) [11]

Во-первых, Synchronize злоупотреблять не нужно. Его вызов заставляет поток остановиться и подождать, пока главный поток освободится и выполнит метод, переданный в качестве параметра. Synchronize нужно использовать только если необходимо обратиться в из потока к визуальным компонентам. Для вашей задачи действительно подойдет критическая секция. Каждое обращение к глобальному ресурсу (в вашем случае - TStringList) из любого потока (будь то главный или нет) заключайте в рамке enter/leave одной и той же критической секции. Как работает критическая секция надеюсь знаете.


← →
Инс ©   (2007-07-12 14:56) [12]

Немного добавит надо.


> Synchronize нужно использовать только если необходимо обратиться
> в из потока к визуальным компонентам.


... или если данный код по тем или иным причинам должен быть выполнен именно главным потоком.


← →
Kolan ©   (2007-07-12 14:59) [13]

Я бы централизовал синхронизацию. То есть потоки ничего не знаю о глобольной TStrings, а у них есть событие OnSendStrings.

Всем потокам назначается один обработчик события OnSendStrings. В этом обработчкике и используйте TCriticalSection для синхронизации.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.029 c
3-1179737093
barakuda
2007-05-21 12:44
2007.09.23
adotable + excel


15-1187921953
Slider007
2007-08-24 06:19
2007.09.23
С днем рождения ! 24 августа 2007 пятница


15-1187704716
oldman
2007-08-21 17:58
2007.09.23
Отключение прерываний.


2-1188450984
Человек
2007-08-30 09:16
2007.09.23
Экспорт в Word


2-1188533770
RomanLN
2007-08-31 08:16
2007.09.23
Как запограммировать "отменить общий доступ к папке" ?




   Наверх