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

Лидеры

  1. dnekrasov

    dnekrasov

    Пользователи


    • Баллы

      7

    • Постов

      317


  2. krapotkin

    krapotkin

    Пользователи


    • Баллы

      4

    • Постов

      2 184


  3. Brovin Yaroslav

    Brovin Yaroslav

    Администраторы


    • Баллы

      2

    • Постов

      2 124


  4. Andrey Efimov

    Andrey Efimov

    Модераторы


    • Баллы

      2

    • Постов

      842


Популярный контент

Показан контент с высокой репутацией 16.05.2016 во всех областях

  1. dnekrasov

    Таймер в сервисе

    В архиве - простенький проект. Протестирован на Win и OSX. TimerThreadDemo.zip
    3 балла
  2. dnekrasov

    Таймер в сервисе

    Когда-то, лет 5 назад у меня возникла такая-же проблема, только в Win32-сервисе. Тогда, для её решения, я написал 2 простеньких класса. Вот код, может пригодится? unit Utils.TimerThread; interface uses System.Classes, System.SysUtils, System.SyncObjs; type TCustomTimerThread = class abstract (TThread) private FLock: TCriticalSection; FCancelledEvent: TSimpleEvent; FInterval: Integer; FOnTimer: TNotifyEvent; function GetInterval: Integer; function GetOnTimer: TNotifyEvent; procedure SetInterval(const Value: Integer); procedure SetOnTimer(const Value: TNotifyEvent); protected procedure Lock; procedure Unlock; procedure Sleep(AInterval: Integer); reintroduce; procedure TerminatedSet; override; procedure DoOnTimer; virtual; public constructor Create(AInterval: Integer; AOnTimer: TNotifyEvent); reintroduce; procedure BeforeDestruction; override; procedure Cancel; virtual; property Interval: Integer read GetInterval write SetInterval; /// <summary> /// <para> /// За синхронизацией потоков отвечает поток в котором обрабатывается OnTimer /// </para> /// <para> /// !!! НЕ ЗАБЫВАТЬ ПРО ЭТО !!! /// </para> /// </summary> property OnTimer: TNotifyEvent read GetOnTimer write SetOnTimer; end; /// <summary> /// Simple wait thread /// </summary> /// <remarks> /// <para> /// !!! Important !!! /// </para> /// <para> /// Use Cancel instead of Terminate. You can get ThreadExternalTerminate /// exception in multi-thread applications /// </para> /// </remarks> TWaitThread = class(TCustomTimerThread) protected procedure Execute; override; public end; /// <summary> /// Thread independed timer /// </summary> /// <remarks> /// <para> /// !!! Important !!! /// </para> /// <para> /// Use Cancel instead of Terminate. You can get ThreadExternalTerminate /// exception in multi-thread applications /// </para> /// </remarks> TTimerThread = class(TCustomTimerThread) private FEnabled: Boolean; function GetEnabled: Boolean; procedure SetEnabled(const Value: Boolean); protected procedure Execute; override; public constructor Create(AInterval: Integer; AOnTimer: TNotifyEvent; AEnabled: Boolean = True); reintroduce; property Enabled: Boolean read GetEnabled write SetEnabled; end; implementation { TCustomTimerThread } procedure TCustomTimerThread.BeforeDestruction; begin FLock.Free; FreeAndNil(FCancelledEvent); inherited; end; constructor TCustomTimerThread.Create(AInterval: Integer; AOnTimer: TNotifyEvent); begin inherited Create; FInterval := AInterval; FOnTimer := AOnTimer; FreeOnTerminate := True; FLock := TCriticalSection.Create; FCancelledEvent := TSimpleEvent.Create; FCancelledEvent.ResetEvent; end; procedure TCustomTimerThread.Cancel; begin FCancelledEvent.SetEvent; end; procedure TCustomTimerThread.DoOnTimer; begin if Assigned(OnTimer) then OnTimer(Self); end; function TCustomTimerThread.GetInterval: Integer; begin Lock; try Result := FInterval; finally Unlock; end; end; function TCustomTimerThread.GetOnTimer: TNotifyEvent; begin Lock; try Result := FOnTimer; finally Unlock; end; end; procedure TCustomTimerThread.Lock; begin FLock.Enter; end; procedure TCustomTimerThread.SetInterval(const Value: Integer); begin Lock; try FInterval := Value; finally Unlock; end; end; procedure TCustomTimerThread.SetOnTimer(const Value: TNotifyEvent); begin Lock; try FOnTimer := Value; finally Unlock; end; end; procedure TCustomTimerThread.Sleep(AInterval: Integer); begin FCancelledEvent.WaitFor(AInterval); end; procedure TCustomTimerThread.TerminatedSet; begin inherited; FCancelledEvent.SetEvent; end; procedure TCustomTimerThread.Unlock; begin FLock.Leave; end; { TWaitThread } procedure TWaitThread.Execute; begin if FCancelledEvent.WaitFor(FInterval) = wrTimeout then DoOnTimer; end; { TTimerThread } constructor TTimerThread.Create(AInterval: Integer; AOnTimer: TNotifyEvent; AEnabled: Boolean); begin inherited Create(AInterval, AOnTimer); FOnTimer := AOnTimer; FEnabled := AEnabled; end; procedure TTimerThread.Execute; begin while not Terminated do case FCancelledEvent.WaitFor(FInterval) of wrTimeout: begin if Enabled then DoOnTimer; end; else Break; end; end; function TTimerThread.GetEnabled: Boolean; begin Lock; try Result := FEnabled; finally Unlock; end; end; procedure TTimerThread.SetEnabled(const Value: Boolean); begin Lock; try FEnabled := Value; finally Unlock; end; end; end.
    3 балла
  3. предполагается, что пользователь зареган у вас где-то? иначе как вы ему push пошлете? а если пуш пришел, по нему и так откроется ваша программа
    1 балл
  4. ophion

    FireMonkey + PDF

    Если своими силами, то вот необходимая информация http://www.adobe.com/devnet/pdf/pdf_reference.html
    1 балл
  5. dnekrasov

    Таймер в сервисе

    Не забудьте поделиться
    1 балл
  6. Pax Beach

    Таймер в сервисе

    Спасибо большое, хороший полезный класс! Можно еще выложить простой пример использования — создание, инициализация, запуск, остановка, уничтожение? Думаю, очень поможет форумчанам.
    1 балл
  7. krapotkin

    NetHTTPClient и SSL

    таймауты у них только в берлине запилили до этого рекомендовали запускать поток, оттуда второй поток с HTTPClient и первый поток прибивает второй, если нет ответа Timeout миллисекунд и выходит сам...
    1 балл
  8. Ссылка: http://delphifmandroid.blogspot.ru/2016/05/rad-studio-101-berlin-fireui-live.html Автор: Андрей Ефимов Описание: В этот раз, речь пойдёт о новом инструменте FireUI Live Preview, добавленном в RAD Studio 10.1 Berlin . Забегая вперёд скажу, что инструмент очень полезный и удобный, есть исходники и разработан с использованием App Tethering.
    1 балл
  9. Pax Beach

    Таймер в сервисе

    Создавать отдельный поток, а в нем уже sleep(msecs)
    1 балл
  10. Сорцы приложения лежат тут: C:\Program Files\Embarcadero\Studio\18.0\source\Tools\FireUIAppPreview Готовые приложения для Windows: C:\Program Files (x86)\Embarcadero\Studio\18.0\LivePreview\LivePreviewInstaller.exe. OS X: C:\Program Files (x86)\Embarcadero\Studio\18.0\LivePreview\LivePreview101.pkg. iOS: https://itunes.apple.com/us/app/fireui-app-preview-10.1-berlin/id1090861997 Android: https://play.google.com/store/apps/details?id=com.embarcadero.LivePreview101 p.s. Как раз пишу статью про этот инструмент p.s.2. Очень удобный инструмент!
    1 балл
  11. rareMax

    Плагин (Внешний модуль)

    Чисто для винды - есть хорошо описаная тема(статей так на 11, на сколько я помню) от гансмокера. Будь готов вчитываться и стараться понимать что происходит. А вот собственно материал для изучения
    1 балл
  12. YuraProff

    Таймер в сервисе

    Можно в сервисе создать отдельный поток, а в нем: while not Terminated do begin // что то делаем sleep (1000); // пауза 1 сек end;
    1 балл
  13. первый пост >>TFloatAnimation использует ProcessMessages >>очень хочется иметь Repaint без ProcessMessages. второй пост >>я запускаю AnimateFloatWait чтобы нельзя было ее убить до завершения, и ...опять получаю AV >>Разбираюсь - а она оказывается вовсю Processит Messages. >>искал к-нить аналог VCL Repaint. TForm.PaintRects а вот и ответ...
    1 балл
  14. Давайте тогда еще раз вы озвучите полностью ситуацию использования и ваш вопрос. Так как первоначальный вопрос был про одно и на него был дан ответ. Потом всплыли подробности использования, что вам нужно гарантировать, что форма не закроется в момент работы аниматоров. На нее тоже был дан ответ, что нужно использовать компоненты анимации и при закрытии формы проверять факт запущенных аниматоров. Или закрыть форму после завершения аниматоров в TAnimation.OnFinish. Теперь третий уже вопрос, якобы исходная задача (смотрим на первый вопрос). Отдельно ответ на третий вопрос - можете использовать TForm.PaintRects
    1 балл
  15. Это базовая теория, и я в курсе её. Давайте вернемся к исходной задаче. У меня нет фоновых операций. Мне нужно, чтобы именно анимация, именно в главном потоке доработала без прерываний. Нельзя использовать ProcessMessages! Ибо она обрабатывает ВСЕ виды событий. Мне всего лишь нужно, чтобы происходила только перерисовка. И лишь по окончанию анимации главный поток обрабатывал бы очередь сообщений дальше. В VCL это достигается вызовом Repaint. В FMX - не работает.
    1 балл
  16. Да, вы правы. При любом блокировании главного потока, будет происходит блокирование обработки сообщений - это базовый принцип работы настольных приложения для многих операционных систем. Анимация не будет дерганной, она просто полностью зависнет на время блокирования потока. Однако, аниматор в FireMonkey не просто изменяет значение через указанные интервалы, а анализирует ситуацию с возможностью блокировки потока, и основывается на текущем времени. То есть, если анимация должна пройти за 4 секунды и началась в 0:00:00, а у вас на 1 секунду заблокировался основной поток, то анимация все равно закончится в 00:00:04. И будет задавать значение свойства таким, каким оно должно быть равно в момент времени t. Поэтому правилом хорошего тона является вынесение тяжелых операций в отдельные потоки. Как это сделать, есть ответ в статье: Фоновое выполнение операции без "замораживания" отрисовки Еще есть более быстрый вариант решения в случаях, когда длительную операцию можно разбить на маленькие итерации, Это форсировать вызов: Application.ProcessMessage; Однако, я не рекомендую этот способ, так как он может привести к другим неприятным последствиям. Так же, когда меняется значение свойства, которое должно привести к перерисовки сцены, автоматически запрашивается от системы перерисовку сцены.
    1 балл
  17. Спасибо за подсказку, в вообщем-то получилось. Сделал так: Создал отдельный каталог, скопировал туда модуль FMX.Media.Win.pas, FMX.Controls.Win.res, FMX.Filter.res (без последних двух проект не компилировался) Внес каталог в Tools - Options - Library - Library path В модуле FMX.Media.Win.pas в процедуре TWindowsMedia.UpdateMediaFromControl первой строкой в коде добавил добавление масштабирования: procedure TWindowsMedia.UpdateMediaFromControl; var P: TPointF; R: TRect; Bounds: TRectF; Form: TCommonCustomForm; begin FVMRWindowlessControl.SetAspectRatioMode(VMR9ARMode_LetterBox); // <-- Добавить if FWnd <> 0 then .... далее в коде закомментировал строку: Bounds := TRectF.Create(0, 0, P.X, P.Y); вместо P.X и P.Y (Ширина и высота видео) - ввел ширину и высоту контрола: Bounds := TRectF.Create(0, 0, Control.AbsoluteWidth, Control.AbsoluteHeight); После этих манипуляций видео стало растягивать под контрол.
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...