Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.129.100] |
|
Сообщ.
#1
,
|
|
|
В приложении создаю фрейм (TFrame) и поток TThread. На фрейме располагаются визуальные компоненты, например, TEdit или TStringGrid, кроме того, у фрейма есть структура и переменные как члены класса VCL типа TFrame.
Если в потоке я меняю свойства визуальных компонент, то делаю это, конечно, через Synchronize. Вопрос: нужен ли Synchronize, если я меняю значения переменных и структуры моего фрейма, которые не связаны с визуальными компонентами (VCL) на моём фрейме? Спасибо. |
Сообщ.
#2
,
|
|
|
А этими переменными и структурами больше никто не пользуется?
|
Сообщ.
#3
,
|
|
|
Цитата MBo @ А этими переменными и структурами больше никто не пользуется? Нет, это чисто мои для оптимизации работы, они под контролем. Эти данные потом преобразуются и светятся на экране (конечно, через Synchronize, т.е. в главном потоке приложения). Мой вопрос вызван тем, что услышал утверждение, что Synchronize необходим при изменении любых данных VCL. |
Сообщ.
#4
,
|
|
|
Цитата vlad2 @ Мой вопрос вызван тем, что услышал утверждение, что Synchronize необходим при изменении любых данных VCL. автор жжот Добавлено чувак ты всегда по слухам все программируешь? |
Сообщ.
#5
,
|
|
|
Цитата Cfon @ Ага. Причём на русском языке. чувак ты всегда по слухам все программируешь? |
Сообщ.
#6
,
|
|
|
Если этими данными пользуется только один поток, то синхронизация не нужна.
Однако стоит уточнить, что именно имеется в виду под " переменных и структуры моего фрейма" |
Сообщ.
#7
,
|
|
|
Цитата MBo @ В свой класс фрейма, созданного на основе TFrame, я добавляю несколько переменных и структур, не связаных с самим фреймом, т.е. использую класс фрейма просто для хранения некоторых данных (это очень удобно, т.к. у меня массив этих фреймов), которые потом буду использовать через Synchronize. Но формально эти переменные и структуры находятся в VCL (фрейм - это VCL).что именно имеется в виду под " переменных и структуры моего фрейма" Цитата MBo @ Вот, похоже, простая, но глубокая мысль для понимания. Если этими данными пользуется только один поток, то синхронизация не нужна. |
Сообщ.
#8
,
|
|
|
Цитата vlad2 @ Вот, похоже, простая, но глубокая мысль для понимания. чувак жжот Добавлено эм ну если серьезно тебе надо купить книжку по теме и почитать до полного просветвления! |
Сообщ.
#9
,
|
|
|
Цитата Cfon @ Гениально. Нашёл такую книжку: Михай Чиксентмихайи "Поток. Психология оптимального переживания". тебе надо купить книжку по теме и почитать до полного просветвления! |
Сообщ.
#10
,
|
|
|
Добавлено чувак жжот Добавлено но а если серьезно матчасть изучал? |
Сообщ.
#11
,
|
|
|
Цитата vlad2 @ В свой класс фрейма, созданного на основе TFrame, я добавляю несколько переменных и структур, не связаных с самим фреймом, т.е. использую класс фрейма просто для хранения некоторых данных (это очень удобно, т.к. у меня массив этих фреймов), которые потом буду использовать через Synchronize. Можно попробовать действовать так: 1. Там же организовать критическую секцию. 2. Заносить данные и рабочего потока с помощью критической секции. 3. Когда понадобиться вывод переменных, скопируем данные главным потоком с использованием той-же критической секции. 4. Далее работаем со значениями-копиями как угодно. 5. Оборачиваем всё это хозяйство (вместе с критической секцией) классом. И получаем потоко - безопасный "контейнер" с методами put/get. После чего Synchronize уже не нужен. |
Сообщ.
#12
,
|
|
|
ЫукпШ а Synchronize то можно юзать?
|
Сообщ.
#13
,
|
|
|
Цитата Cfon @ ЫукпШ а Synchronize то можно юзать? я не против. Но, насколько я знаю, эта функция нужна если хочется рисовать на форме прямо из рабочего потока. Если же есть необходимость добычи данных рабочим потоком, тогда можно: 1. прописать данные в контейнер. 2. послать окошку (форме) сообщение, что данные готовы. 3. из сообщения нарисовать/вывести. Синхронизация всё равно нужна на всякий случай. я делал и так: 1. Рисовал в memdc (т.е. в памяти) в рабочем потоке. 2. После завершение посылал сообщение главному потоку. 3. Который копировал содержимое memdc в memdc главного окна. 4. После чего вызывался "InvalidateRect", для перерисовки главного окна. |
Сообщ.
#14
,
|
|
|
я тоже не против
ТС вот погуглил для тебя главное иметь прямые руки Потоки. Synchronize -что за зверь такой и с чем едят? |
Сообщ.
#15
,
|
|
|
Спасибо, ЫукпШ, за ответы и Cfon за ссылку. Я получил ответ на свой вопрос. Тему можно закрыть.
|
Сообщ.
#16
,
|
|
|
пардон а какой ответ то?
|
Сообщ.
#17
,
|
|
|
Цитата Cfon @ А ответ в той фразе, над реакцией на которую ты посмеялся: "Если этими данными пользуется только один поток, то синхронизация не нужна".пардон а какой ответ то? Т.е. если есть гарантия в том, что данные использует только один поток, то синхронизация не нужна. Если такой гарантии нет (возможно, у меня такой случай, надо внимательно проверить), то нужна синхронизация, или критическая секция (видимо, это мне подойдёт). |
Сообщ.
#18
,
|
|
|
ясно
|