На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS

Дорогие друзья! Поздравляем вас с Новым 2018 годом!

Всем удачи, успеха и благополучия!
В новом году ожидаем новых рекордов при подсчёте количества ёлочек на экране ;)


msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Затык с сообщениями, отправляется 2, приходит 1
    Цитата Pavia @
    Критические секции ведут к дедлокам. Спинлоки в этом плане как-то по понятие. Но тоже народ тоже не задумывается о дедлоках. Поэтому они тоже приводят к дедлокам.
    Если делать всё грамотно, никаких дедлоков не будет. Менеджер памяти использует критические секции и ничего не лочится.
    К тому же, дедлоки происходят тогда, когда используется минимум 2 критические секции (в смысле, объекты - мьютексы).
    user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
      Цитата Pavia @
      Но лично я решаю проблемы архитектурно шаблон генерал-подчинённый. Там дедлоки исключены.
      У каждого потока свои данные, а передачу данных от одного потока к другому осуществляет генерал.
      За графику и окошки отвечает один поток. - пользователь у нас один ему хватит и одного потока. А вот обработку данных делают разные потоки.
      Не понял как это работает.
      Вот у потока с GDI есть всякие списки, свойства и пр. Нужно 2-м потокам изменить одновременно эти данные. Что для этого делается?
      user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
        Цитата Jin X @
        Вот у потока с GDI есть всякие списки, свойства и пр. Нужно 2-м потокам изменить одновременно эти данные. Что для этого делается?

        Что есть "поток с GDI"?

        В целом поверьте человеку, наевшемуся с потоками. Во избежание слома мозга из-за таинственных глюков по причине неучстенного совместного доступа к памяти или дедлоков взаимодействие между потоками надо максимально развязывать (см. PostThreadMessage). Данные предпочтительнее копировать, нежели блокировать. Если же блокировок не избежать, они д.б. как можно более короткими.
        Codero ergo sum
        // Программирую — значит, существую
          Цитата Fr0sT @
          Что есть "поток с GDI"?
          Я хочу понять принцип "генерал-подчинённый".
          Есть 2 потока, им обоим нужно получить доступ к каким-либо данным.

          Цитата Fr0sT @
          В целом поверьте человеку, наевшемуся с потоками.
          Ты про Delphi конкретно?
          Если да, то вопросов нет - тут всё понятно.
          user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
            Цитата Jin X @
            Я хочу понять принцип "генерал-подчинённый".
            Есть 2 потока, им обоим нужно получить доступ к каким-либо данным.

            "принцип "генерал-подчинённый"" это очень расплывчато. Предполагаю, в данном случае это означает, что один поток является "владельцем" данных (может манипулировать ими в любой момент), а остальным позволяется получать к ним доступ только по сигналу.
            Подходы есть разные. Есть slim reader-writer (как в виде winapi объекта, так и эмуляцией через две крит. секции), когда кол-во одновременно читающих потоков не ограничено. Есть принцип Go - никаких разделяемых данных, строго копирование. Есть классические крит. секции.
            Цитата Jin X @
            Ты про Delphi конкретно?

            Да нет, это любого языка касается (ну кроме Go, там по-другому и не сделаешь)
            Codero ergo sum
            // Программирую — значит, существую
              Цитата Fr0sT @
              Да нет, это любого языка касается
              Ну это высокоуровневые проблемы. С WinAPI же вроде как таких проблем нет...

              Цитата Fr0sT @
              Есть slim reader-writer (как в виде winapi объекта, так и эмуляцией через две крит. секции)
              Я думаю, что Pavia что-то другое имел в виду, т.к. ридером может быть и основной поток.

              Цитата Fr0sT @
              Есть принцип Go - никаких разделяемых данных, строго копирование.
              Что значит "копирование" в данном случае? Чтение? А как же запись?
              user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
                Цитата Jin X @
                С WinAPI же вроде как таких проблем нет...

                Такие проблемы есть везде, где есть потоки и разделяемые области памяти. Хоть на ассемблере
                Цитата Jin X @
                Что значит "копирование" в данном случае? Чтение? А как же запись?

                Копирование - это копирование. Записи никакой не предусмотрено. Надо передать потоку данные - отправляй копию.
                Жёстко, но полностью исключает проблемы совместного доступа
                Codero ergo sum
                // Программирую — значит, существую
                  Цитата Fr0sT @
                  Копирование - это копирование. Записи никакой не предусмотрено. Надо передать потоку данные - отправляй копию.
                  Жёстко, но полностью исключает проблемы совместного доступа
                  А что с записью? Тоже через посредника?

                  Цитата Fr0sT @
                  Такие проблемы есть везде, где есть потоки и разделяемые области памяти.
                  Давай пример при работы с GDI через WinAPI из 2-х потоков одновременно. Но чтобы косяк был не в коде (типа обработчика сообщений, который пишет куда-то).
                  user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
                    Цитата Jin X @
                    А что с записью? Тоже через посредника?

                    Записью чего? Куда? Откуда? Данные существуют только в одном экземпляре, у владельца. Передача через копирование. Что непонятного?
                    Цитата Jin X @
                    Давай пример при работы с GDI через WinAPI из 2-х потоков одновременно. Но чтобы косяк был не в коде (типа обработчика сообщений, который пишет куда-то).

                    Разговор зашел не в ту степь. Есть вопрос - спрашивай конкретно, давать какие-то примеры для доказательства непонятно чего мне совсем не вперлось
                    Codero ergo sum
                    // Программирую — значит, существую
                      Цитата Fr0sT @
                      Записью чего? Куда? Откуда? Данные существуют только в одном экземпляре, у владельца. Передача через копирование. Что непонятного?
                      Речь начиналась о критических секциях, насколько я помню.
                      Кто-то читает данные, а кто-то их пишет. Если чтение производится через посредника путём передачи копии, то как в этом механизме происходит запись этих данных?

                      Цитата Fr0sT @
                      Разговор зашел не в ту степь. Есть вопрос - спрашивай конкретно, давать какие-то примеры для доказательства непонятно чего мне совсем не вперлось
                      Причём тут доказательство? Я хочу понять что ты имеешь в виду: в каких случаях (например) возможны проблемы при обращении к WinAPI (GDI) одновременно двух потоков?
                      user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
                        Цитата Jin X @
                        Если чтение производится через посредника путём передачи копии, то как в этом механизме происходит запись этих данных?

                        Так же как и чтение. Потоку-владельцу присылается копия данных, он уже решает, что с ними делать
                        Цитата Jin X @
                        Я хочу понять что ты имеешь в виду: в каких случаях (например) возможны проблемы при обращении к WinAPI (GDI) одновременно двух потоков?

                        Да легко. Попробуй рисовать на канвасе из двух потоков одновременно.
                        Многие объекты в winapi thread-safe, но не все.
                        Codero ergo sum
                        // Программирую — значит, существую
                          Цитата Jin X @
                          в каких случаях (например) возможны проблемы при обращении к WinAPI (GDI) одновременно двух потоков?

                          Чего ты привязался к этому "WinAPI (GDI)"? Конкретизируй вопрос.
                          Первоначально речь шла только о показе MessageBox из доп.потока. Тут "проблемы" могут быть только в логике организации взаимодействия с юзером. Например, блокируешь ты основную форму на время показа MessageBox или нет. При hWnd=0 (как у тебя в примере #1) форма не блокируется и оба окна ведут себя независимо, поэтому весь расчет на то, что разумный юзер должен сначала закрыть МБ прежде чем тыкать кнопки\меню на форме. Но иногда возможны нештатные ситуации, когда в результате "не пойми чего" форма вылезает на передний план, закрывая МБ, и юзер (не замечая второго окна приложения на панели задач) начинает тыкать по форме, а МБ продолжает "благополучно висеть" под формой вместе со своим потоком.
                          Если же блокировать форму на время показа МБ (передавая ее hWnd в МБ), то ситуация становится более понятной\предсказуемой, но только в том случае, если показывается только один МБ. Если же у тебя несколько потоков могут одновременно показывать МБ (или не дай бог основной поток выдаст ShowMessage), то ситуация может быть еще более запутанной\непредсказуемой. Видимо "один товарищ" (упомянутый в посте #7) это и имел ввиду, а не то, что возможны какие-то критические ситуации с дедлоками, AV и т.п.

                          Добавлено
                          Цитата Fr0sT @
                          Да легко. Попробуй рисовать на канвасе из двух потоков одновременно.

                          На разных канвасах (оконных DC) - "легко". Винда без проблем отрисовывает десятки перекрывающихся окон, даже если они пытаются рисовать себя полностью, а не только видимую часть - все излишние "художества" благополучно вырезаются и на экран выводится общая картинка в соответствии с Z-порядком отображения окон.
                            Цитата leo @
                            Но иногда возможны нештатные ситуации, когда в результате "не пойми чего" форма вылезает на передний план, закрывая МБ, и юзер (не замечая второго окна приложения на панели задач) начинает тыкать по форме, а МБ продолжает "благополучно висеть" под формой вместе со своим потоком.
                            На этот случай есть MB_TASKMODAL, который я комбинирую с MB_SETFOREGROUND.

                            Цитата leo @
                            Если же блокировать форму на время показа МБ (передавая ее hWnd в МБ), то ситуация становится более понятной\предсказуемой, но только в том случае, если показывается только один МБ. Если же у тебя несколько потоков могут одновременно показывать МБ (или не дай бог основной поток выдаст ShowMessage), то ситуация может быть еще более запутанной\непредсказуемой
                            Такой задачи-то и нет :). Всё надо с умом делать :)

                            Цитата leo @
                            Видимо "один товарищ" (упомянутый в посте #7)
                            "Один товарищ", как выяснилось имел в виду ShowMessage, хотя разговор явно шёл про MessageBox. Ну перепутал он :)

                            Цитата Fr0sT @
                            Да легко. Попробуй рисовать на канвасе из двух потоков одновременно.
                            Многие объекты в winapi thread-safe, но не все.
                            Так, а что будет-то? Мне прямо даже интересно :)
                            И где-то вообще есть инфа о не-thread-safe-функциях?
                            user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
                              Цитата leo @
                              На разных канвасах (оконных DC) - "легко". Винда без проблем отрисовывает десятки перекрывающихся окон, даже если они пытаются рисовать себя полностью, а не только видимую часть - все излишние "художества" благополучно вырезаются и на экран выводится общая картинка в соответствии с Z-порядком отображения окон.

                              Хитрый какой! )) Нет, я имел в виду на одном канвасе.
                              Codero ergo sum
                              // Программирую — значит, существую
                              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script Execution time: 0,1622 ]   [ 15 queries used ]   [ Generated: 19.01.18, 11:31 GMT ]