AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MouseMove verzögern

Ein Thema von Bjoerk · begonnen am 22. Mär 2016 · letzter Beitrag vom 24. Mär 2016
 
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: MouseMove verzögern

  Alt 22. Mär 2016, 18:07
Deutet für mich darauf hin, dass du die Arbeit, die im MouseMove passiert, in einen Thread auslagern solltest. So passiert die aufwendige Aktualisierung so oft wie es geht, aber ohne die GUI zu blockieren.

Delphi-Quellcode:
uses
  syncobjs;

type
  TProcessingThread = class(TThread)
  protected
    FEvent: TEvent;
    FMutex: TCriticalSection;
    FSavedX, FSavedY: Integer;
    procedure Execute; override;
    procedure DoTerminate; override;
    procedure DoMouseMove(X, Y: Integer);
    procedure UpdateUI;
  public
    constructor Create;
    destructor Destroy; override;

    procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  end;

implementation

procedure TProcessingThread.Execute;
var
  X, Y: Integer;
begin
  while FEvent.WaitFor() and not Terminated do
  begin
    FMutex.Acquire;
    X := FSavedX;
    Y := FSavedY;
    FMutex.Release;

    DoMouseMove(X, Y);
  end;
end;

procedure TProcessingThread.DoTerminate;
begin
  inherited DoTerminate;
  FEvent.Set;
end;

procedure TProcessingThread.DoMouseMove(X, Y: Integer);
begin
  { ... actual work ... }

  Synchronize(UpdateUI);
end;

procedure TProcessingThread.UpdateUI;
begin
  { ... }
end;

constructor TProcessingThread.Create;
begin
  inherited Create(False);
  FEvent := TEvent.Create(nil, False, False, '');
  FMutex := TCriticalSection.Create;
end;

destructor TProcessingThread.Destroy;
begin
  FEvent.Free;
  FMutex.Free;
end;

procedure TProcessingThread.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  FMutex.Acquire;
  FSavedX := X;
  FSavedY := Y;
  FMutex.Release;
  FEvent.Set;
end;
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  FProcessingThread.MouseMove(Sender, Shift, X, Y);
end;
Code ist ungetestet, nur eben im Beitragseditor hier geschrieben.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz