Sei modifiche chieste in questa sessione, di cui una pesa piu' di tutte le altre. CompletedAuctionsStore rileggeva e rideserializzava l'intero file a ogni chiamata: misurati 72 ms su 5876 record, 3,9 MB. Append pagava quel prezzo piu' la riserializzazione e la riscrittura completa per cambiare un record solo, 120 ms in tutto, e la chiamata arriva da un gestore di eventi di MainWindow, quindi dal thread dell'interfaccia, che restava fermo a ogni asta conclusa. Il recupero delle puntate dei vincitori lo faceva in un ciclo: 4675 aste erano 7,2 minuti di solo rimescolamento JSON e 17,8 GB scritti sul disco. Adesso c'e' una copia in memoria invalidata sulla data di modifica del file, cosi' resta giusta anche se il file viene sostituito da fuori (ripristino di un backup), e un AppendMany che applica molti record con un salvataggio solo, con un indice per id perche' il caso per cui esiste non torni quadratico. Il recupero salva a blocchi di cinquanta e deposita comunque quello che ha in mano quando esce, anche per annullamento: le richieste gia' fatte sono state pagate al server. Misurato sullo stesso file: 95 volte piu' veloce, 7,2 minuti diventano 4,5 secondi, 17,8 GB diventano 0,36 GB. Le altre cinque: - Il setup si chiama AutoBidder_<versione>.exe. - I pulsanti di stop sono rossi, sia quello globale sia quelli per asta nella griglia: erano gli unici tre senza colore mentre avvia e osserva ce l'avevano. - La pulizia dello storico sa togliere le aste seguite solo in parte. Non serve nessun campo nuovo: il prezzo finale in centesimi e' il totale delle puntate dell'asta, quindi il rapporto con i reset osservati dice quanta asta si e' vista, e la regola vale anche sullo storico gia' raccolto. Verificata sui dati veri: su 5876 aste nessuna supera copertura 1,02, che e' quanto ci si aspetta se l'identita' e' giusta. - La griglia ricicla i contenitori di riga invece di ricrearli. - Il costo puntata gia' esisteva col predefinito giusto: al suggerimento e' stato aggiunto perche' 0,20 e' il numero da tenere. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
124 lines
4.6 KiB
Plaintext
124 lines
4.6 KiB
Plaintext
; ─────────────────────────────────────────────────────────────────────────────
|
|
; AutoBidder — script di installazione (Inno Setup 6)
|
|
;
|
|
; Non si compila a mano: lo lancia build/Release.proj, che prima pubblica
|
|
; l'eseguibile e poi passa qui versione e percorsi con /D. Compilarlo da solo
|
|
; produrrebbe un pacchetto con la versione sbagliata, perché il numero vive
|
|
; nel .csproj.
|
|
;
|
|
; dotnet msbuild build/Release.proj -t:Pacchetto
|
|
;
|
|
; L'applicazione è un unico .exe self-contained: l'installazione copia quel file,
|
|
; crea i collegamenti e registra la voce per "App installate". I dati dell'utente
|
|
; stanno in %LocalAppData%\AutoBidder e NON vengono toccati né dall'aggiornamento
|
|
; né dalla disinstallazione — sono aste, statistiche e sessione, cioè mesi di
|
|
; raccolta che nessun disinstallatore ha il diritto di buttare via.
|
|
; ─────────────────────────────────────────────────────────────────────────────
|
|
|
|
#ifndef AppVersion
|
|
#define AppVersion "0.0.0"
|
|
#endif
|
|
|
|
#ifndef SourceExe
|
|
#define SourceExe "..\bin\publish\win-x64\AutoBidder.exe"
|
|
#endif
|
|
|
|
#ifndef OutputDir
|
|
#define OutputDir "..\bin\installer"
|
|
#endif
|
|
|
|
#define AppName "AutoBidder"
|
|
#define AppPublisher "Alberto Balbo"
|
|
#define AppExeName "AutoBidder.exe"
|
|
|
|
[Setup]
|
|
; L'AppId identifica il prodotto fra una versione e l'altra: cambiarlo farebbe
|
|
; comparire due voci in "App installate" invece di un aggiornamento.
|
|
AppId={{9F2C6E14-8B3D-4A57-9E10-6C4B0D7A1F52}
|
|
AppName={#AppName}
|
|
AppVersion={#AppVersion}
|
|
AppVerName={#AppName} {#AppVersion}
|
|
AppPublisher={#AppPublisher}
|
|
VersionInfoVersion={#AppVersion}
|
|
|
|
; Installazione per utente: niente richiesta di amministratore, e i dati stanno
|
|
; comunque nel profilo di chi la usa.
|
|
PrivilegesRequired=lowest
|
|
DefaultDirName={autopf}\{#AppName}
|
|
DefaultGroupName={#AppName}
|
|
DisableProgramGroupPage=yes
|
|
DisableDirPage=auto
|
|
|
|
OutputDir={#OutputDir}
|
|
OutputBaseFilename=AutoBidder_{#AppVersion}
|
|
SetupIconFile=..\Icon\favicon.ico
|
|
UninstallDisplayIcon={app}\{#AppExeName}
|
|
UninstallDisplayName={#AppName} {#AppVersion}
|
|
|
|
; L'eseguibile è già compresso (single-file compresso): comprimerlo di nuovo
|
|
; costa minuti di build e guadagna poco.
|
|
Compression=lzma2/normal
|
|
SolidCompression=no
|
|
WizardStyle=modern
|
|
ArchitecturesAllowed=x64compatible
|
|
ArchitecturesInstallIn64BitMode=x64compatible
|
|
|
|
[Languages]
|
|
Name: "italiano"; MessagesFile: "compiler:Languages\Italian.isl"
|
|
|
|
[Tasks]
|
|
Name: "desktopicon"; Description: "Crea un collegamento sul desktop"; GroupDescription: "Collegamenti:"
|
|
Name: "avvioautomatico"; Description: "Avvia AutoBidder all'accesso a Windows"; GroupDescription: "Avvio:"; Flags: unchecked
|
|
|
|
[Files]
|
|
Source: "{#SourceExe}"; DestDir: "{app}"; Flags: ignoreversion
|
|
|
|
[Icons]
|
|
Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}"
|
|
Name: "{group}\Disinstalla {#AppName}"; Filename: "{uninstallexe}"
|
|
Name: "{autodesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Tasks: desktopicon
|
|
|
|
[Registry]
|
|
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; \
|
|
ValueType: string; ValueName: "{#AppName}"; ValueData: """{app}\{#AppExeName}"""; \
|
|
Flags: uninsdeletevalue; Tasks: avvioautomatico
|
|
|
|
[Run]
|
|
Filename: "{app}\{#AppExeName}"; Description: "Avvia {#AppName}"; \
|
|
Flags: nowait postinstall skipifsilent
|
|
|
|
[UninstallDelete]
|
|
; Solo quello che ha creato l'installazione. I dati restano.
|
|
Type: dirifempty; Name: "{app}"
|
|
|
|
[Code]
|
|
{ Un'installazione sopra una copia in esecuzione lascerebbe il vecchio eseguibile
|
|
al suo posto senza dirlo, e l'utente si ritroverebbe la versione precedente
|
|
convinto di aver aggiornato. Meglio fermarsi e chiedere. }
|
|
function IsAppRunning(): Boolean;
|
|
var
|
|
ResultCode: Integer;
|
|
begin
|
|
Result := Exec('cmd.exe',
|
|
'/C tasklist /FI "IMAGENAME eq {#AppExeName}" | find /I "{#AppExeName}"',
|
|
'', SW_HIDE, ewWaitUntilTerminated, ResultCode) and (ResultCode = 0);
|
|
end;
|
|
|
|
function InitializeSetup(): Boolean;
|
|
begin
|
|
Result := True;
|
|
|
|
if IsAppRunning() then
|
|
begin
|
|
if MsgBox('AutoBidder è in esecuzione e sta forse seguendo delle aste.' + #13#10#13#10 +
|
|
'Chiudilo prima di continuare, altrimenti il file non può essere sostituito.' + #13#10#13#10 +
|
|
'Riprovo?', mbConfirmation, MB_YESNO) = IDYES then
|
|
Result := not IsAppRunning()
|
|
else
|
|
Result := False;
|
|
|
|
if not Result then
|
|
MsgBox('Installazione annullata: AutoBidder è ancora aperto.', mbInformation, MB_OK);
|
|
end;
|
|
end;
|