Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.15;
Скачать: CL | DM;

Вниз

Работа с одной переменной в нескольких потоках.   Найти похожие ветки 

 
SergP ©   (2005-12-11 20:09) [0]

Мне нужно изменить значение переменной ShortDateFormat, затем выполнить некоторые действия, после чего восстановить значение этой переменной.


SaveSDF:=ShortDateFormat;
ShortDateFormat:=....;
// Некоторые действия
ShortDateFormat:=SaveSDF;


Проблема в том что в приложении работает несколько потоков в которых, также как и в основном потоке используется данная конструкция. И поэтому в процессе выполнения данного кода в одном потоке не должны выполняться другие потоки.
Пока проблем не возникало. Но есть предчуствия, что это нехорошо. Но хочу подстраховаться.

Как сделать то что мне нужно?


 
DrPass ©   (2005-12-11 20:49) [1]

Если потоки реализованы через TThread, проще всего поместить это в отдельный метод и вызывать его через Synchronize. Если потоки реализованы классически, через CreateThread, то тогда нужно синхронизировать через критические секции. В Delphi 7+ можно вообще обойтись без этого, там существует возможность "локального" изменения форматов с помощью TFormatSettings, не задействуя глобальные переменные.


 
SergP ©   (2005-12-11 21:12) [2]


> DrPass ©   (11.12.05 20:49) [1]


Через TThread...

Вобщем насчет дополнительных потоков понятно. (Synchronize).
А как быть с основным потоком?


 
DrPass ©   (2005-12-11 21:32) [3]

А с ним ничего и не надо - Synchronize выполняет метод в его контексте, так что он гарантированно будет синхронизирован.


 
Alexander Panov ©   (2005-12-11 21:39) [4]

DrPass ©   (11.12.05 21:32) [3]
А с ним ничего и не надо - Synchronize выполняет метод в его контексте, так что он гарантированно будет синхронизирован.


Это только в одном случае - если используется синхронизация методом TThread.Synchronize.
В остальных случаях сделать синхронизацию не удастся, так как эту переменную могут использовать и многочисленные компоненты, объекты, а также функции, спрятанные в глубинах VCL.

>SergP ©   (11.12.05 20:09)

Может быть, стоит пересмотреть логику приложения?


 
SergP ©   (2005-12-11 22:05) [5]


> >SergP ©   (11.12.05 20:09)
>
> Может быть, стоит пересмотреть логику приложения?


У меня в дополнительных потоках закачивается контент по http и https с сервера (через WinInet)  и сразу же происходит их парсинг (а там в контенте встречаются даты в разных форматах). А в основном потоке нужно делать TdateTime --> string в требуемом формате.
Но в принципе я понял: я могу обрабатывать полученый контент в основном потоке, и тогда проблемы исчезнут.


 
DrPass ©   (2005-12-11 22:52) [6]


> Это только в одном случае - если используется синхронизация
> методом TThread.Synchronize

Так он же так и делает


 
Alexander Panov ©   (2005-12-11 23:17) [7]

>SergP ©   (11.12.05 22:05) [5]
Я бы не стал закладываться на то, что в дополнительных потоках не используются глобальные переменные и, во избежание проблем, конвертацию даты проводил вруную, без использования функций, использующих эти переменные.


 
evvcom ©   (2005-12-12 10:04) [8]


> SergP ©

Тебе ж сказали про TFormatSettings, а ты проигнорировал. И не нужны никакие переприсваивания глобальных переменных и синхронизация потоков, которая вызовет довольно ресурсоемкое дополнительное ненужное переключение потоков.


 
Alexander Panov ©   (2005-12-12 10:46) [9]

evvcom ©   (12.12.05 10:04) [8]

Что такое TFormatSettings и где про него почитать?


 
umbra ©   (2005-12-12 10:48) [10]

TFormatSettings появился только в Д7. В Д6 такого нет


 
Rouse_ ©   (2005-12-12 12:35) [11]

а может проще работать через threadvar?


 
Игорь Шевченко ©   (2005-12-12 13:05) [12]


> Как сделать то что мне нужно?


Ввести критическую секцию, обращаться к ней во всех потоках перед выполнением указанного кода. Классика.


 
Leonid Troyanovsky ©   (2005-12-12 13:47) [13]


> Игорь Шевченко ©   (12.12.05 13:05) [12]

> Ввести критическую секцию, обращаться к ней во всех потоках
> перед выполнением указанного кода. Классика.


Лучше, все же Synchronize. Бо, куда (и как) совать секцию в
первичном потоке - это еще искать надо.

--
Regards, LVT.


 
evvcom ©   (2005-12-12 14:49) [14]


> Alexander Panov ©   (12.12.05 10:46) [9]
> evvcom ©   (12.12.05 10:04) [8]
>
> Что такое TFormatSettings и где про него почитать?

В хелпе вестимо. Единственно на что я не обратил внимания - это на версию дельфи автора. Да, в Д7 есть, а в Д6 вроде как нет.


 
Alexander Panov ©   (2005-12-12 18:33) [15]

Leonid Troyanovsky ©   (12.12.05 13:47) [13]
Лучше, все же Synchronize. Бо, куда (и как) совать секцию в
первичном потоке - это еще искать надо.


Сдается мне, что ни один вариант не поможет, кроме как конвертация вручную, так как обращение к глобальным переменным выполняется во многих компонентах и функциях внутри VCL. Каждую функцию не защитишь, только если всю процедуру потока поместить в  Synchronize.


 
Leonid Troyanovsky ©   (2005-12-12 18:44) [16]


> Alexander Panov ©   (12.12.05 18:33) [15]

> Каждую функцию  не защитишь, только если всю процедуру потока
> поместить  в  Synchronize.


Всю - может быть излишне, а вот обращение к глобальным переменным
(заведомо принадлежащих первичному потоку) - всенепременно.
Т.е., само обращение достаточно универсально: сохраняем исходные,
делаем преобразование, восстанавливаем в finallly.

--
Regards, LVT.


 
Alexander Panov ©   (2005-12-12 21:59) [17]

Leonid Troyanovsky ©   (12.12.05 18:44) [16]

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



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

Текущий архив: 2006.01.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.043 c
14-1135054847
begin...end
2005-12-20 08:00
2006.01.15
С Днём рождения! 20 декабря


2-1135324126
oleggar
2005-12-23 10:48
2006.01.15
файл в тело Exe


4-1131370003
Толик
2005-11-07 16:26
2006.01.15
Количество копий отправленого на печать документа


6-1127753549
Darkwin
2005-09-26 20:52
2006.01.15
Sockscap, принцип работы


5-1120978357
Серджио_Точини
2005-07-10 10:52
2006.01.15
Создание компонента для ввода двоичных чисел с фикс. запятой