chore(autofill): mesurer ou passe le temps d'un remplissage
Un autofill lent apres une periode d'inactivite peut l'etre pour des raisons sans rapport qui se ressemblent parfaitement de l'exterieur : le moteur WebView2 qui se reveille, la prise du premier plan, ou l'attente de la relache des modificateurs. Elles se corrigent a des endroits opposes, donc on les separe au lieu de deviner laquelle accuser. Trois marques : le temps que met la PAGE a repondre au raccourci, le total, et le detail des deux attentes internes. Premiere mesure : 13 ms de reponse apres 23 minutes en tray, total 635 ms. Le renderer ne dormait donc pas - l'hypothese la plus evidente etait fausse - et 635 ms est le cout nominal de la sequence, faite de pauses fixes (80 + 120 + 60 + 200 + 200). Le cas lent reste a attraper. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -30,6 +30,7 @@ interface
|
||||
|
||||
uses
|
||||
System.SysUtils, System.Classes, System.Math, System.Types,
|
||||
System.Diagnostics,
|
||||
FMX.Types, FMX.Forms,
|
||||
Winapi.Windows, Winapi.ShellAPI, Winapi.Messages, Winapi.MultiMon,
|
||||
PM.SingleInstance, PM.UserPrefs;
|
||||
@@ -162,6 +163,8 @@ type
|
||||
// settings_json : elle peut etre allumee coffre ferme, quand aucune session
|
||||
// n'existe pour lire les reglages du serveur.
|
||||
FLazyAlphaPct: Integer;
|
||||
// Voir la propriete LastFillWaits.
|
||||
FLastFillWaits: string;
|
||||
// Dernier etat connu du survol, pour ne reposer l'opacite que sur un
|
||||
// changement - SetLayeredWindowAttributes force un repaint a chaque appel.
|
||||
FLazyHover: Boolean;
|
||||
@@ -250,6 +253,10 @@ type
|
||||
function ExecuteAutofill(ATargetHWND: HWND;
|
||||
const AUsername, APassword: string; AUsernameOnly: Boolean = False;
|
||||
ARestoreAfter: Boolean = False; AClearFirst: Boolean = True): Boolean;
|
||||
/// Le detail des deux attentes du dernier remplissage, pour le journal de
|
||||
/// l'hote. Une chaine plutot qu'un evenement : ExecuteAutofill s'execute
|
||||
/// sur le thread principal, juste avant que l'hote journalise.
|
||||
property LastFillWaits: string read FLastFillWaits;
|
||||
property SecureClipboard: TSecureClipboard read FSecureClipboard;
|
||||
property TrayAdded: Boolean read FTrayAdded;
|
||||
// Show or hide the lazy strip. Idempotent, and remembered across launches.
|
||||
@@ -1989,11 +1996,23 @@ begin
|
||||
Sleep(MinimizeSettleMs);
|
||||
end;
|
||||
|
||||
// LES DEUX SEULES ATTENTES QUI PEUVENT ENFLER, mesurees separement.
|
||||
//
|
||||
// Le total d'un remplissage est d'environ 660 ms par construction - des
|
||||
// Sleep fixes. Quand il depasse plusieurs secondes, c'est forcement l'une de
|
||||
// ces deux-la : la prise du premier plan, qui sonde jusqu'a 600 ms, ou
|
||||
// l'attente de la relache des modificateurs, jusqu'a 1000 ms. Les confondre
|
||||
// ferait chercher du cote du moteur web, qui n'y est pour rien.
|
||||
var LSw := TStopwatch.StartNew;
|
||||
if ATargetHWND <> 0 then
|
||||
ForceForegroundWindow(ATargetHWND);
|
||||
var LFgMs := LSw.ElapsedMilliseconds;
|
||||
|
||||
LSw := TStopwatch.StartNew;
|
||||
WaitForModifierRelease(1000);
|
||||
ForceReleaseModifiers; // timeout hit with keys still down → clean state
|
||||
FLastFillWaits := Format('foreground=%d ms, modifiers=%d ms',
|
||||
[LFgMs, LSw.ElapsedMilliseconds]);
|
||||
Sleep(FocusSettleDelayMs);
|
||||
|
||||
// Never type into our own window: if the target refused the foreground,
|
||||
|
||||
Reference in New Issue
Block a user