Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Основная";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.037 c
2-1188199309
арпывапр
2007-08-27 11:21
2007.09.23
паыметры зупускаемого приложения.


3-1179820144
Layner
2007-05-22 11:49
2007.09.23
Ввод в DBGrid дробной части - запятая всегда печаталась


1-1184077237
vasilii
2007-07-10 18:20
2007.09.23
о скорости чтения usb


15-1188302215
Bogdan1024
2007-08-28 15:56
2007.09.23
Жить на проценты


2-1188547375
Человек
2007-08-31 12:02
2007.09.23
Работа с двумя таблицами одновременно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский