rareMax Опубликовано 9 мая, 2016 Поделиться Опубликовано 9 мая, 2016 Привет. Нуждаюсь в вашем совете. Пару недель назад я начал разрабатывать библиотеку Telegram Bot Api(TelegaPi) для работы с Бот Апи в RAD Studio. И у меня возникла трудность с реализацией отправки запросов на сервер в отдельных потоках(распараллеливание). Например боту нужно отправить фото 100 пользователям. Отправка будет отправляться по очереди от 1 до 100 пользователя. Из-за этого снизится скорость ответа. Можно ли как то в самой библиотеке организовать распараллеливание? Метод отправки фото: function TTelegramBot.sendPhoto(chatId, photo: TValue; caption: string; disable_notification: Boolean; replyToMessageId: Integer; replyMarkup: TtgReplyKeyboardMarkup) : TtgMessage; var Parameters: TDictionary<String, TValue>; begin Parameters := TDictionary<String, TValue>.Create; try Parameters.Add('chat_id', chatId); Parameters.Add('photo', photo); Parameters.Add('caption', caption); Parameters.Add('disable_notification', disable_notification); Parameters.Add('reply_to_message_id', replyToMessageId); Parameters.Add('reply_markup', replyMarkup); Result := API<TtgMessage>('sendPhoto', Parameters); finally Parameters.Free; end; end; Пока что приходи в голову использование iTask<T> - но еще не знаю как бы лучше придумать. Надеюсь на ваши идеи и советы. Спасибо Rusland 1 Цитата Ссылка на комментарий
Администраторы Brovin Yaroslav Опубликовано 9 мая, 2016 Администраторы Поделиться Опубликовано 9 мая, 2016 Создаете несколько потоков, каждый поток у вас занимается отправкой фотографии. Передаете в поток данные и запускаете. Потоки создаете по количеству ядер на устройстве. Пользуетесь готовой библиотекой Parallel Threading Library создаете таски и складываете их в пул. zairkz и Kitty 2 Цитата Ссылка на комментарий
rareMax Опубликовано 9 мая, 2016 Автор Поделиться Опубликовано 9 мая, 2016 (изменено) 15 минут назад, Brovin Yaroslav сказал: Создаете несколько потоков, каждый поток у вас занимается отправкой фотографии. Передаете в поток данные и запускаете. Потоки создаете по количеству ядер на устройстве. Пользуетесь готовой библиотекой Parallel Threading Library создаете таски и складываете их в пул. var task: ITask; begin WriteLn('Telegram Bot Ping-Pong Sample'); TelegramBot := TTelegramBot.Create( {$I ..\telegaToken.inc}{ you Api key } ); try task := TTask.Create( procedure var LMsg:TtgMessage; Begin LMsg := TelegramBot.sendPhoto(12345, ttgFileToSend.Create('test.jpg')); Работа_с_ответом_сервера(LMsg); End); task.Start; StartRecesive; except on E: Exception do WriteLn(E.ClassName, ': ', E.Message); end; TelegramBot.Free; end. Ну вариант с таском вижу только так. Но в таком случае эта работа ложится на конечного разработчика. А хотелось бы что бы это было "спрятано под капотом библиотеки" (синоним async в С# в общем пытаюсь найти для Делфи) Изменено 9 мая, 2016 пользователем Сысоев Максим zairkz 1 Цитата Ссылка на комментарий
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.