На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Маленький теоретический вопрос по взаимодействию потока с VCL , XE7, Win7
    В приложении создаю фрейм (TFrame) и поток TThread. На фрейме располагаются визуальные компоненты, например, TEdit или TStringGrid, кроме того, у фрейма есть структура и переменные как члены класса VCL типа TFrame.
    Если в потоке я меняю свойства визуальных компонент, то делаю это, конечно, через Synchronize.
    Вопрос: нужен ли Synchronize, если я меняю значения переменных и структуры моего фрейма, которые не связаны с визуальными компонентами (VCL) на моём фрейме?
    Спасибо.
      А этими переменными и структурами больше никто не пользуется?
        Цитата MBo @
        А этими переменными и структурами больше никто не пользуется?

        Нет, это чисто мои для оптимизации работы, они под контролем. Эти данные потом преобразуются и светятся на экране (конечно, через Synchronize, т.е. в главном потоке приложения).
        Мой вопрос вызван тем, что услышал утверждение, что Synchronize необходим при изменении любых данных VCL.
          Цитата vlad2 @
          Мой вопрос вызван тем, что услышал утверждение, что Synchronize необходим при изменении любых данных VCL.

          автор жжот :D

          Добавлено
          чувак ты всегда по слухам все программируешь? :D
            Цитата Cfon @
            чувак ты всегда по слухам все программируешь?
            Ага. Причём на русском языке.
              Если этими данными пользуется только один поток, то синхронизация не нужна.

              Однако стоит уточнить, что именно имеется в виду под " переменных и структуры моего фрейма"
                Цитата MBo @
                что именно имеется в виду под " переменных и структуры моего фрейма"
                В свой класс фрейма, созданного на основе TFrame, я добавляю несколько переменных и структур, не связаных с самим фреймом, т.е. использую класс фрейма просто для хранения некоторых данных (это очень удобно, т.к. у меня массив этих фреймов), которые потом буду использовать через Synchronize. Но формально эти переменные и структуры находятся в VCL (фрейм - это VCL).

                Цитата MBo @
                Если этими данными пользуется только один поток, то синхронизация не нужна.
                Вот, похоже, простая, но глубокая мысль для понимания.
                Сообщение отредактировано: vlad2 -
                  Цитата vlad2 @
                  Вот, похоже, простая, но глубокая мысль для понимания.

                  чувак жжот :lool:

                  Добавлено
                  эм ну если серьезно тебе надо купить книжку по теме и почитать до полного просветвления! :D
                    Цитата Cfon @
                    тебе надо купить книжку по теме и почитать до полного просветвления!
                    Гениально. Нашёл такую книжку: Михай Чиксентмихайи "Поток. Психология оптимального переживания".
                      :huh:

                      Добавлено
                      чувак жжот :lool:

                      Добавлено
                      но а если серьезно матчасть изучал?
                        Цитата vlad2 @
                        В свой класс фрейма, созданного на основе TFrame, я добавляю несколько переменных и структур, не связаных с самим фреймом, т.е. использую класс фрейма просто для хранения некоторых данных (это очень удобно, т.к. у меня массив этих фреймов), которые потом буду использовать через Synchronize.

                        Можно попробовать действовать так:
                        1. Там же организовать критическую секцию.
                        2. Заносить данные и рабочего потока с помощью критической секции.
                        3. Когда понадобиться вывод переменных, скопируем данные главным потоком
                        с использованием той-же критической секции.
                        4. Далее работаем со значениями-копиями как угодно.
                        5. Оборачиваем всё это хозяйство (вместе с критической секцией) классом.
                        И получаем потоко - безопасный "контейнер" с методами put/get.

                        После чего Synchronize уже не нужен.
                        Сообщение отредактировано: ЫукпШ -
                          ЫукпШ а Synchronize то можно юзать? :D
                            Цитата Cfon @
                            ЫукпШ а Synchronize то можно юзать? :D

                            я не против.
                            Но, насколько я знаю, эта функция нужна если хочется рисовать
                            на форме прямо из рабочего потока.
                            Если же есть необходимость добычи данных рабочим потоком, тогда можно:
                            1. прописать данные в контейнер.
                            2. послать окошку (форме) сообщение, что данные готовы.
                            3. из сообщения нарисовать/вывести. Синхронизация всё равно нужна на всякий случай.

                            я делал и так:
                            1. Рисовал в memdc (т.е. в памяти) в рабочем потоке.
                            2. После завершение посылал сообщение главному потоку.
                            3. Который копировал содержимое memdc в memdc главного окна.
                            4. После чего вызывался "InvalidateRect", для перерисовки главного окна.
                            Сообщение отредактировано: ЫукпШ -
                              я тоже не против :D

                              ТС вот погуглил для тебя главное иметь прямые руки :D

                              Потоки. Synchronize -что за зверь такой и с чем едят?
                                Спасибо, ЫукпШ, за ответы и Cfon за ссылку. Я получил ответ на свой вопрос. Тему можно закрыть.
                                  пардон а какой ответ то?
                                    Цитата Cfon @
                                    пардон а какой ответ то?
                                    А ответ в той фразе, над реакцией на которую ты посмеялся: "Если этими данными пользуется только один поток, то синхронизация не нужна".
                                    Т.е. если есть гарантия в том, что данные использует только один поток, то синхронизация не нужна. Если такой гарантии нет (возможно, у меня такой случай, надо внимательно проверить), то нужна синхронизация, или критическая секция (видимо, это мне подойдёт).
                                      ясно :yes-sad:
                                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                      0 пользователей:


                                      Рейтинг@Mail.ru
                                      [ Script execution time: 0,0478 ]   [ 17 queries used ]   [ Generated: 20.04.24, 03:24 GMT ]