Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как изменить курсор мыши в отдельном потоке в приложениях на Delphi без блокировки главного потока

Delphi , Компоненты и Классы , Потоки

Разработчики, работающие с технологиями Delphi и Object Pascal, часто сталкиваются с необходимостью оптимизации пользовательского интерфейса, в том числе и с изменением курсора мыши в зависимости от текущей активности приложения. Одной из распространенных задач является изменение курсора на индикатор загрузки (например, на часовую стрелку) при длительных операциях, которые выполняются в основном потоке. При этом важно, чтобы изменение курсора происходило с небольшой задержкой, чтобы избежать частых и раздражающих переключений курсора.

Проблема

Пользователь столкнулся с проблемой, что ему необходимо изменить курсор мыши на индикатор загрузки при выполнении длительных операций в основном потоке. Он хочет, чтобы это изменение происходило с задержкой в 250 миллисекунд, чтобы избежать лишних переключений курсора. Попытка изменить курсор в отдельном потоке не увенчалась успехом, так как объекты VCL, включая Screen, предназначены для работы в основном потоке.

Решение

Для решения этой задачи можно использовать подход, при котором изменение курсора мыши осуществляется в основном потоке, но инициируется из отдельного потока. Это достигается с помощью метода Synchronize, который позволяет выполнить код в основном потоке, даже если он был инициирован из другого потока.

Пример кода на Object Pascal для класса, который управляет изменением курсора мыши:

unit MouseCursorManager;

interface

uses
  Classes, Winapi.Windows, Vcl.Forms;

type
  TMouseCursorManager = class
  private
    FWorkerThread: TThread;
    FIsBusy: Boolean;
    procedure DoSetCursor;
  public
    constructor Create;
    destructor Destroy; override;
    procedure SetBusy;
    procedure SetDone;
  end;

implementation

constructor TMouseCursorManager.Create;
begin
  inherited;
  FWorkerThread := TThread.CreateAnonymousThread(
    procedure
    begin
      while True do
      begin
        Synchronize(DoSetCursor);
        Sleep(1000); // Ждем команду, чтобы не занимать процессор
      end;
    end);
  FWorkerThread.Start;
end;

destructor TMouseCursorManager.Destroy;
begin
  FWorkerThread.Terminate;
  inherited;
end;

procedure TMouseCursorManager.DoSetCursor;
begin
  if FIsBusy then
    Screen.Cursor := crHourGlass
  else
    Screen.Cursor := crDefault;
end;

procedure TMouseCursorManager.SetBusy;
begin
  FIsBusy := True;
  FWorkerThread.Suspend;
end;

procedure TMouseCursorManager.SetDone;
begin
  FIsBusy := False;
  FWorkerThread.Resume;
end;

end.

Использование этого класса позволит изменить курсор мыши на индикатор загрузки с задержкой, необходимой для пользователя, не блокируя основной поток и не вызывая ошибки доступа к VCL из отдельного потока.

Альтернативные подходы

В качестве альтернативы можно рассмотреть использование анонимных потоков, которые активируются только при необходимости и завершаются после выполнения задачи, что может быть более предпочтительным в некоторых сценариях.

Заключение

Изменение курсора мыши в отдельном потоке в приложениях на Delphi может быть выполнено с использованием метода Synchronize, который позволяет безопасно изменять состояние пользовательского интерфейса, не блокируя основной поток. Это решение обеспечивает плавную и эффективную работу приложения, сохраняя при этом отзывчивость интерфейса.

Создано по материалам из источника по ссылке.

Задача состоит в изменении курсора мыши на индикатор загрузки в приложениях на Delphi без блокировки главного потока, используя методы синхронизации потоков для обеспечения плавной смены курсора с задержкой.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Потоки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 19:20:15/0.003727912902832/0