четверг, 9 января 2014 г.

Ссылка для "совсем интересующихся". l3PipeStream. Поток-труба

https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/RealWork/L3/l3PipeStream.pas

"Поток-труба. Для использования в тех случаях когда процессом записи управляет один внешний объект, а процессом чтения - другой.
     То есть оба выполняют какие-то свои циклы и их надо синхронизировать."

К чему это я?

Тут один мой уже хороший знакомый задал мне несколько "странных" вопросов про синхронизацию потоков и VCL/GDI. И "почему всё рушится с сообщением 'Invalid Handle'".

Я САМ признаюсь - НЕ БОЛЬШОЙ знаток многопоточности. И местами в ней плаваю.

 И вот тут меня "поучили уму разуму" - http://alexander-bagel.blogspot.ru/2013/12/2_23.html?showComment=1388082326485#c3821037524154323848 (без всякого сарказма)

Одно лишь "знаю" - "Synchronize это зло" и "объекты VCL/GDI нельзя дёргать "просто так" не в основном потоке".

Ну это "взгляд дилетанта". (Правда "гуру" в этом вопросе мне лично в жизни не встречались)

Посему я своему знакомому смог посоветовать лишь "общие слова" навроде - "отрисовку делай в основном потоке, а вычисления в дополнительных".

На что он меня спросил - "а как я узнаю, что вычисления завершены" :-) ЛОГИЧНЫЙ вопрос :-) "зубоскалы" - могут "идти мимо". Я САМ - далеко "не с пелёнок" знал про EVENT'ы Win API (и CreateEvent etc)

О чём я собственно своему знакомому и и написал и привёл в пример код по ссылке выше.

Правда там НЕТ Event'ов. Да и ВООБЩЕ - код не то, что НЕ ИДЕАЛЕН - он УЩЕРБЕН.

Но уж "есть что есть". Есть "отправная точка". Этот код - РАБОТАЕТ - как и ожидалось.

Повторюсь - "гуру по многопоточности в Delphi я в своей жизни лично так и не встретил".

Так что - "то есть - то есть".

Если вдруг этот код будет кому-то интересен - я могу продолжить свою серию "многопоточность для дебилов", коим я и сам являюсь.

Могу рассказать - "что работает в многопоточности", а что "не работает".

Методом "проб и ошибок" и "набитых шишек".

3 комментария:

  1. Да, было бы очень интересно ознакомиться с Вашим опытом многопоточности в Delphi.
    Есть свой, во многом сводящийся к Вашей рекомендации "отрисовку делай в основном потоке, а вычисления в дополнительных". Ну, разве что, с дополнением, что взаимодействие по данным можно организовать через критические секции, но это, по моему, очевидно.
    Нереентерабельность VCL недавно вынудила решать одну задачу через многопроцессность, а не многопоточность... :-(
    Необходимо было обеспечить параллельное ("фоновое") выполнение отчётов, которых могло быть несколько. У каждого отчёта должен быть свой визуализатор процесса, возможность отменить формирование отчёта, и функция наблюдения за состоянием выполнения отчётов из основного приложения. Из-за требования визуализации пришлось генератор отчётов выносить в COM-объект, в отдельное приложение.
    Если известно лучшее решение, рад бы о нём услышать...
    Да и вообще, тема актуальна IMHO...

    ОтветитьУдалить
    Ответы
    1. Ок. Я напишу. Со временем. "Америку" правда думаю не открою.

      Про многопроцессность - Вы правы. Мы сами и такое используем.

      Вы кстати про "визуализатор прогресса" читали?

      http://18delphi.blogspot.ru/2013/05/blog-post_8549.html
      http://18delphi.blogspot.ru/2013/05/blog-post_7718.html

      Удалить
  2. «Вы кстати про "визуализатор прогресса" читали?
    http://18delphi.blogspot.ru/2013/05/blog-post_8549.html
    http://18delphi.blogspot.ru/2013/05/blog-post_7718.html»
    -- Да, проглядывал ещё в начале года.

    ОтветитьУдалить