Перейти к содержанию
  • Регистрация

Поиск сообщества

Показаны результаты для тегов 'PPL'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип контента


Форумы

  • Общие вопросы
    • Анимация
    • Графика
    • Стили
    • Базы данных и REST
    • Компоненты
    • Положение, размеры, выравнивание
    • Работа с текстом
    • Приложение и формы
    • Отладка
    • Развертывание приложений
    • Вопросы по языку Object Pascal и RTL
    • Общая информация о TControl
    • События
    • Прочие вопросы
  • Вопросы по платформам
  • Вопросы по использованию RAD Studio
  • Native FGX
  • Обучение
  • Поиск специалистов по FireMonkey
  • Дополнительные ресурсы по FireMonkey
  • Организация работы данного форума
  • Видеокурсы

Поиск результатов в...

Поиск контента, содержащего...


Дата создания

  • Начало

    Конец


Дата обновления

  • Начало

    Конец


Фильтр по количеству...

Регистрация

  • Начало

    Конец


Группа


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


StackOverflow


Защита от ботов


Город


Интересы

Найдено: 3 результата

  1. Доброго времени суток. Надеюсь многие пользуются новым средством распараллеливания ITask, подскажите что я делаю с ним не так. Для теста создал простенький класс unit ThreadTask; interface uses System.SysUtils, System.Threading, System.Classes; type TOnCollback = procedure(ID: Integer) of object; TThreadTask = class private Task: ITask; procedure Execute; procedure Print; procedure Close; public OnDestroy: TOnCollback; OnPrint: TOnCollback; Destructor Destroy; override; procedure Start; procedure Stop; end; implementation { TThreadTask } procedure TThreadTask.Close; begin if Assigned(OnDestroy) then OnDestroy(Task.Id); end; destructor TThreadTask.Destroy; begin Stop; TThread.Synchronize(TThread.CurrentThread, Close); inherited; end; procedure TThreadTask.Execute; begin TThread.Sleep(3000); TThread.Synchronize(TThread.CurrentThread, Print); TThread.Sleep(3000); TThread.Synchronize(TThread.CurrentThread, Print); Free; end; procedure TThreadTask.Print; begin if Assigned(OnPrint) then OnPrint(Task.Id); end; procedure TThreadTask.Start; begin Task := TTask.Run(Execute); end; procedure TThreadTask.Stop; begin if Assigned(Task) and (Task.Status = TTaskStatus.Running) then Task.Cancel; end; end. Класс включает в себя интерфейс ITask и после создания и вызова метода Start должен в потоке выполнять какие-то вычисления, в данном случае это просто задержка и вызов коллбека. После отработки класс вызывает коллбек для уведомления о завершении работы и самостоятельно разрушается. Код использования класса: unit Unit1; interface uses ..., ThreadTask; type TForm1 = class(TForm) Memo: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private ThreadTask: TThreadTask; procedure TreadDestroy(ID: Integer); procedure TreadPrint(ID: Integer); public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); begin if Assigned(ThreadTask) then FreeAndNil(ThreadTask); ThreadTask := TThreadTask.Create; ThreadTask.OnDestroy := TreadDestroy; ThreadTask.OnPrint := TreadPrint; ThreadTask.Start; end; procedure TForm1.TreadDestroy(ID: Integer); begin Memo.Lines.Add(Format('ThreadTask №%d уничтожен', [ID])); ThreadTask := nil; end; procedure TForm1.TreadPrint(ID: Integer); begin Memo.Lines.Add(Format('Я Task №%d', [ID])); end; end. По нажатию на кнопку проверяем не существует ли предыдущий экземпляр класса, если существует уничтожаем его, создаём новый и запускаем его. Приходящие сообщения от класса выводим в Memo. Если запустить и дождаться полной отработки потоком, то всё ожидаемо, в Memo видим: Я Task №1 Я Task №1 ThreadTask №1 уничтожен Однако если не дождавшись окончания работы первого потока ещё раз нажать на кнопку, то вывод получается совсем не тем, что ожидалось: ThreadTask №1 уничтожен Я Task №2 Я Task №2 Я Task №2 ThreadTask №2 уничтожен Первый класс разрушается, но задача не снимается и кроме того она вызывает лишний раз коллбек от имени второй задачи. Казалось бы можно переписать код кнопки и "занулить" коллбеки: procedure TForm1.Button1Click(Sender: TObject); begin if Assigned(ThreadTask) then begin ThreadTask.OnDestroy := nil; ThreadTask.OnPrint := nil; FreeAndNil(ThreadTask); end; ThreadTask := TThreadTask.Create; ThreadTask.OnDestroy := TreadDestroy; ThreadTask.OnPrint := TreadPrint; ThreadTask.Start; end; Но это не даёт нужного результата, вывод в Memo практически аналогичен предыдущему: Я Task №1 Я Task №1 Я Task №1 ThreadTask №1 уничтожен Может быть Task нельзя так использовать или я что-то делаю не так?
  2. Привет. Нуждаюсь в вашем совете. Пару недель назад я начал разрабатывать библиотеку 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> - но еще не знаю как бы лучше придумать. Надеюсь на ваши идеи и советы. Спасибо
  3. Как можно передать какое-либо значение в ITask? Допустим есть код: procedure TfrmScaner.Switch1Switch(Sender: TObject); var Cursor: uMisc.ICursorChange; Tasks: TArray<ITask>; I: Integer; begin Cursor := TCursorChange.Create(crAppStart); FillGrid; SetLength(Tasks, GridDataManager1.RowCount); // Смотри с этой строки for I := Low(Tasks) to High(Tasks) do Begin Tasks[I] := TTask.Create( Procedure Begin ParseItem(MyParametr); End); Tasks[I].Start; end; end;Мне нужно передать процедуре ParseItem значение MyParametr = I. Как бы это сделать?
×
×
  • Создать...