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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.014 c
5-1121121621
Brack
2005-07-12 02:40
2006.01.15
Как можно ScrollBox`у добавить свойство Canvas?


8-1123614825
Ландграф Павел
2005-08-09 23:13
2006.01.15
Зацените програмку для копирования mp3


14-1134935788
QwertyKz
2005-12-18 22:56
2006.01.15
C# и дизайнер форм


2-1135270904
Progger
2005-12-22 20:01
2006.01.15
вложенность записей


2-1135275962
denisww
2005-12-22 21:26
2006.01.15
HTTPRIO





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский