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 я в своей жизни лично так и не встретил".
Так что - "то есть - то есть".
Если вдруг этот код будет кому-то интересен - я могу продолжить свою серию "многопоточность для дебилов", коим я и сам являюсь.
Могу рассказать - "что работает в многопоточности", а что "не работает".
Методом "проб и ошибок" и "набитых шишек".
"Поток-труба. Для использования в тех случаях когда процессом записи управляет один внешний объект, а процессом чтения - другой.
То есть оба выполняют какие-то свои циклы и их надо синхронизировать."
К чему это я?
Тут один мой уже хороший знакомый задал мне несколько "странных" вопросов про синхронизацию потоков и 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 я в своей жизни лично так и не встретил".
Так что - "то есть - то есть".
Если вдруг этот код будет кому-то интересен - я могу продолжить свою серию "многопоточность для дебилов", коим я и сам являюсь.
Могу рассказать - "что работает в многопоточности", а что "не работает".
Методом "проб и ошибок" и "набитых шишек".
Да, было бы очень интересно ознакомиться с Вашим опытом многопоточности в Delphi.
ОтветитьУдалитьЕсть свой, во многом сводящийся к Вашей рекомендации "отрисовку делай в основном потоке, а вычисления в дополнительных". Ну, разве что, с дополнением, что взаимодействие по данным можно организовать через критические секции, но это, по моему, очевидно.
Нереентерабельность VCL недавно вынудила решать одну задачу через многопроцессность, а не многопоточность... :-(
Необходимо было обеспечить параллельное ("фоновое") выполнение отчётов, которых могло быть несколько. У каждого отчёта должен быть свой визуализатор процесса, возможность отменить формирование отчёта, и функция наблюдения за состоянием выполнения отчётов из основного приложения. Из-за требования визуализации пришлось генератор отчётов выносить в COM-объект, в отдельное приложение.
Если известно лучшее решение, рад бы о нём услышать...
Да и вообще, тема актуальна IMHO...
Ок. Я напишу. Со временем. "Америку" правда думаю не открою.
УдалитьПро многопроцессность - Вы правы. Мы сами и такое используем.
Вы кстати про "визуализатор прогресса" читали?
http://18delphi.blogspot.ru/2013/05/blog-post_8549.html
http://18delphi.blogspot.ru/2013/05/blog-post_7718.html
«Вы кстати про "визуализатор прогресса" читали?
ОтветитьУдалитьhttp://18delphi.blogspot.ru/2013/05/blog-post_8549.html
http://18delphi.blogspot.ru/2013/05/blog-post_7718.html»
-- Да, проглядывал ещё в начале года.