Перейти к содержанию
Fire Monkey от А до Я

Выполнение метода в отдельном потоке


Рекомендуемые сообщения

Привет. Нуждаюсь в вашем совете. Пару недель назад я начал разрабатывать библиотеку 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> - но еще не знаю как бы лучше придумать. Надеюсь на ваши идеи и советы.

Спасибо

Ссылка на комментарий
  • Администраторы
  • Создаете несколько потоков, каждый поток у вас занимается отправкой фотографии. Передаете в поток данные и запускаете. Потоки создаете по количеству ядер на устройстве. 
  • Пользуетесь готовой библиотекой Parallel Threading Library создаете таски и складываете их в пул.

 

Ссылка на комментарий
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 в С# в общем пытаюсь найти для Делфи)

Изменено пользователем Сысоев Максим
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...