powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Языки программирования семейства Pascal [закрыт для гостей] / Про многопоточность подскажите
19 сообщений из 19, страница 1 из 1
Про многопоточность подскажите
    #749002
Просто Трёп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то писал многопоточное приложение, в общем и целом все получилось. Приложение было гуишным. Каждый поток создавался из своей TPanel и в нужные моменты слал ей SendMessage или PostMessage, этого хватало для полноценного обмена информацией и всяких оповещений. В результате мне даже понравилось.

А как быть в сервисе или консольном приложении, где окон нет? Вот надо мне оповестить основной поток о какой-нибудь промежуточной ерунде, произошедшей в отдельном потоке.
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749006
IT-Клоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо тогда действовать через WinAPI

Скажем, применить механизм Event
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749019
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
Просто Трёп [игнорируется] 
Можно посылать сообщения потоку функцией PostThreadMessage. Тогда, если в потоке нет своего цикла обработки сообщений, его надо организовать при помощи например функции PeekMessage.

Насчёт евентов - это хороший вариант, но надо понимать, что поток, который будет ожидать срабатывания события при помощи функции WaitForSingleObject или WaitForMultipleObjects, будет в состоянии ожидания.

Службы никогда не писал (вроде, не припоминаю такого :) ) не особо представляю, что там удобно.
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749021
Просто Трёп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу.
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749022
Просто Трёп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62  01.04.2024, 15:26
[игнорируется]
Просто Трёп [игнорируется] 
Можно посылать сообщения потоку функцией PostThreadMessage. Тогда, если в потоке нет своего цикла обработки сообщений, его надо организовать при помощи например функции PeekMessage.

Насчёт евентов - это хороший вариант, но надо понимать, что поток, который будет ожидать срабатывания события при помощи функции WaitForSingleObject или WaitForMultipleObjects, будет в состоянии ожидания.

Службы никогда не писал (вроде, не припоминаю такого :) ) не особо представляю, что там удобно.
А обратно? Оно в обе стороны будет работать?
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749089
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
Просто Трёп  01.04.2024, 15:28
[игнорируется]
А обратно? Оно в обе стороны будет работать?
Если сообщения, то посылать можно из любого потока любому. Но чтобы поток мог принимать их, в нем должен быть цикл обработки сообщений. Вот в обычном Windows приложении на Delphi в главном потоке такой цикл уже есть, его VCL реализует.
Насчет событий, ну в моей практике отношения между потоками обычно были несимметричными. Например один поток подготавливает какие-то данные и выдает другому, чтобы тот передал их по сети. Или один поток всё время обменивается данными с каким-то устройством и периодически или сам их выдает или у него запрашивают какие-то данные.
Вот кстати со скуля один человек учебник написал несколько лет назад про многопоточность:
https://github.com/loginov-dmitry/multithread/blob/master/multithread_in_delphi_for_beginners.md

https://resql.ru/forum/topic.php?fid=58&tid=2036872
Правда не скажу сейчас, насколько хорошо написано, хотя начинал читать.
...
Изменено: 01.04.2024, 18:50 - s62
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749091
IT-Клоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaitForSingleObject можно ждать с таймаутом - опрашивая.

Ну в щем надо какую-то пилить костыльную синхронизацию полюбому...
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749093
IT-Клоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в службе реализовывать обработку сообщений как в окне WinApi - не знаю, такая спорная имхо идея.
Окно - оно и живёт за счёт этого цикла.
А служба другим должна заниматься.
Ну и тем более такой тяжеловесный механизм использовать для общения между потоками - плохо имхо.
Из пушки по воробьям. у них же и так общая память.

Мессаги - это IPC для общения между окнами windows и между визуальными приложениями.

Потоки должны общаться через критически секции - вошел в неё , проверил, не пришло ли что-то, забрал, флаг снял, поехал далее.
Так будет наивысшая производительность достигнута.
...
Изменено: 01.04.2024, 18:55 - IT-Клоп
Рейтинг: 1 / 0
Нравится: Tosh
Про многопоточность подскажите
    #749094
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
IT-Клоп  01.04.2024, 18:55
[игнорируется]
Ну и тем более такой тяжеловесный механизм использовать для общения между потоками - плохо имхо.
Да не особо тяжеловесный. Я сам правда один раз с этим дело имел, и то, другой человек делал, а я подрихтовывал. Сообщения через PostMessage, PostThreadMessage хороши тем, что асинхронная обработка - один поток не ждет, пока второй обработает сообщение. Добавил сообщение в очередь и дальше занимается своими делом. А с критическими секциями могут быть коллизии, когда один поток ждет другой. Но да, критические секции - норм, тоже ими не раз пользовался.
Неизвестно, что за служба у Просто Трепа и что за обмен данными там между потоками.

p.s. Один раз - сообщения от потока в другой доп. поток, так что там цикл обработки сообщений делали. А из доп. потока в основной поток GUI приложения передавать данные через PostMessage или оповещать через это, так это много раз использовал, это по-моему удобно. Ну со службами тут другая история.
...
Изменено: 01.04.2024, 19:05 - s62
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749097
IT-Клоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62  01.04.2024, 19:00
[игнорируется]
IT-Клоп  01.04.2024, 18:55
[игнорируется]
Ну и тем более такой тяжеловесный механизм использовать для общения между потоками - плохо имхо.
Да не особо тяжеловесный. Я сам правда один раз с этим дело имел, и то, другой человек делал, а я подрихтовывал. Сообщения через PostMessage, PostThreadMessage хороши тем, что асинхронная обработка - один поток не ждет, пока второй обработает сообщение. Добавил сообщение в очередь и дальше занимается своими делом. А с критическими секциями могут быть коллизии, когда один поток ждет другой. Но да, критические секции - норм, тоже ими не раз пользовался.
Неизвестно, что за служба у Просто Трепа и что за обмен данными там между потоками.

p.s. Один раз - сообщения от потока в другой доп. поток, так что там цикл обработки сообщений делали. А из доп. потока в основной поток GUI приложения передавать данные через PostMessage или оповещать через это, так это много раз использовал, это по-моему удобно. Ну со службами тут другая история.
Но по сравнению с ним общая память потоков суперпроизводительна.
Это же как раз преимущество потоков.
Всего-то для них структуру в памяти организовать, таблицу, куда можно - добавить поток, добавить для него очередь сообщений.
и через эту очередь общаться, используя CriticalSection. Это именно для потоков - классика.
...
Изменено: 01.04.2024, 19:08 - IT-Клоп
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749100
IT-Клоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для паттернодрочеров - это паттерн Observer, где поток может подписаться на сообщения себе.

Единственное - проверку надо в потоке костылить, это да. потому цикл придётся делать - для проверки очереди.

Надо смотреть, что за задача.
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749101
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
IT-Клоп  01.04.2024, 19:12
[игнорируется]
Надо смотреть, что за задача.
Вот-вот.
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749103
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
IT-Клоп [игнорируется] 
Один поток может подготавливать данные, потом "взводить" событие, а второй по событию их считывать и обрабатывать. Как одна из простых схем.
...
Изменено: 01.04.2024, 19:23 - s62
Рейтинг: 1 / 0
Нравится: IT-Клоп
Про многопоточность подскажите
    #749105
Просто Трёп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да задача простая, отсюда забрал, туда запихал. Проблема только в том, что откуда берешь, может затыкаться по-своему, а куда пихаешь - по-своему. И на все это надо реагировать, буферизировать, если есть затык с пиханием.

И со скоростями непонятно. Что делать, если скорость пихания по каким-то причинам станет меньше скорости забирания. Это надо как-то отслеживать, играть размером буфера, если явление временное, звонить админу, если постоянное... А скорость забирания заранее неизвестна. Может, 100 UDP пакетов в минуту, а может, 1.

Щас оно в одном потоке работает, но если происходит затык, данные теряются, пока админ (или скрипт) сервис не перезапустит.
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749106
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
Просто Трёп [игнорируется] 
Если схема такая, что один пихает данные, а второй берет их и потом куда-то отправляет, то очередь можно использовать. Поток, который пихает, добавляет элементы в очередь. А который берет и что-то с ними делает, забирает из очереди по мере возможности, пока в очереди что-то есть.
Вот тут, если использовать не потокобезопасную очередь, можно как раз использовать критическую секцию. Первый поток входит в секцию, добавляет элемент, выходит, второй входит, забирает, выходит.
...
Изменено: 01.04.2024, 19:47 - s62
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749108
Просто Трёп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62  01.04.2024, 19:41
[игнорируется]
Просто Трёп [игнорируется] 
Если схема такая, что один пихает данные, а второй берет их и потом куда-то отправляет, то очередь можно использовать. Поток, который пихает, добавляет элементы в очередь. А который берет и что-то с ними делает, забирает из очереди по мере возможности, пока в очереди что-то есть.
Так оно сейчас так и работает, насколько я понял. Ивенты UDP компоненты в очередь сами становятся, если главный поток службы не успевает их обслужить.

О, надо будет зажурналировать потребление памяти службы и подождать, пока она заткнется. Посмотреть, увеличится жор памяти или нет.
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749109
Просто Трёп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом случае, нужен буфер на случай затыка отправки и возможность дампить этот буфер, если затык критический. А уж если делать хороший FIFO буфер, то и потоки надо делать.... Хороший буфер он сам по себе многопоточный.
...
Рейтинг: 0 / 0
Про многопоточность подскажите
    #749110
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
s62 
Участник
Просто Трёп [игнорируется] 

Очереди-то есть:
https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Generics.Collections.TQueue
https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Generics.Collections.TThreadedQueue
Я когда-то сам на основе динамического массива очередь делал. Но тут уже готовые. )
...
Рейтинг: 1 / 0
Нравится: Просто Трёп
Про многопоточность подскажите
    #749112
Просто Трёп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что я могу сказать... Дельфи жив!
...
Рейтинг: 1 / 0
Нравится: s62
19 сообщений из 19, страница 1 из 1
Форумы / Языки программирования семейства Pascal [закрыт для гостей] / Про многопоточность подскажите
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (2): Анонимы (2)
Игнорируют тему (2): erbol, папа акуз
Читали форум (3): Анонимы (2), Bing Bot 5 мин.
Пользователи онлайн (194): Анонимы (183), IT-Клоп, basename, s62, Yandex Bot, megabyte 1 мин., Tails 1 мин., prostozevs 1 мин., Antonariy 1 мин., 9288 5 мин., Bing Bot 5 мин., Сталкер 7 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]