Generation ran in a single worker, one proposition after another, using one core. A pool of workers now takes propositions by rank, as many as the cores set: automatic by default (every logical CPU), or a count from 1 to that number. Each proposition is still computed from its own derived seed, so the result is byte-identical whatever the core count, ordered by identifier. One progress bar sums the workers; Cancel stops them all; the duration estimate counts the cores. The setting is per session and never written. Checked: 2872 node, 586 browser, 62 long; 5 workers in Electron. --- FR --- [ADD] génération : réserve de travailleurs sur les processeurs, cœurs La génération tournait dans un seul travailleur, une proposition après l'autre, sur un seul cœur. Une réserve de travailleurs prend maintenant les propositions par rang, autant que de cœurs réglés : automatique par défaut (tous les processeurs logiques), ou un nombre de 1 à ce total. Chaque proposition se calcule toujours depuis sa graine dérivée : le résultat est identique à l'octet quel que soit le nombre de cœurs, rangé par identifiant. Une seule barre ; Annuler arrête tout ; l'estimation compte les cœurs. Réglage de séance, jamais écrit. Vérifié : 2872, 586, 62. Assisted-by: Claude Opus 5.5
69 lines
3.1 KiB
JavaScript
69 lines
3.1 KiB
JavaScript
// © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
|
|
|
// Point d'entrée de la page : le seul module de src/ qui choisit la
|
|
// plateforme (§ 13.4). Sous la coquille Electron, le préchargement expose
|
|
// window.gtt — le système de fichiers du processus principal et la copie
|
|
// dans le presse-papiers ; sans lui, la page est la plateforme web, sur
|
|
// l'OPFS et le presse-papiers du navigateur. Il construit les dépendances
|
|
// d'App — l'horloge du système, l'exécuteur de la génération sur le
|
|
// travailleur, les identifiants tirés par crypto.randomUUID, les
|
|
// démonstrations livrées nommées par le catalogue — et monte App dans le
|
|
// corps du document. Le thème de départ est laissé à App, qui lit la
|
|
// préférence du système.
|
|
//
|
|
// Il est le seul module qui importe le travailleur de génération, par
|
|
// « ?worker&inline » : Vite l'inclut dans la page, que la coquille charge
|
|
// par file://, sans fichier de travailleur à côté. Chaque génération fait
|
|
// naître un groupe de travailleurs neufs, un par cœur employé, que
|
|
// l'exécuteur termine à son issue (§ 5.10). Il est aussi le seul à lire le
|
|
// nombre de processeurs logiques du poste, navigator.hardwareConcurrency,
|
|
// hyperthreads compris : l'exécuteur l'annonce au contrôleur, qui en fait
|
|
// la valeur des cœurs automatiques ; une épreuve donne le sien à
|
|
// l'exécuteur qu'elle monte.
|
|
import { mount } from 'svelte';
|
|
import { creerExecuteurTravailleur } from './application/executeur_travailleur.js';
|
|
import { creerHorlogeSysteme } from './application/horloge.js';
|
|
import { CATALOGUE } from './demo/catalogue.js';
|
|
import { LIVREES } from './demo/livrees.js';
|
|
import App from './interface/App.svelte';
|
|
import Travailleur from './interface/generation/travailleur.js?worker&inline';
|
|
import { FORMAT } from './stockage/document.js';
|
|
import { creerFichiersElectron } from './stockage/fichiers_electron.js';
|
|
import { creerFichiersWeb } from './stockage/fichiers_web.js';
|
|
import { VERSION } from './version.genere.js';
|
|
|
|
const pont = window.gtt;
|
|
const sousElectron = pont !== undefined;
|
|
|
|
const fs = sousElectron ? creerFichiersElectron(pont.fichiers) : creerFichiersWeb();
|
|
const pressePapiers = sousElectron
|
|
? { copier: async (texte) => void (await pont.copier(texte)) }
|
|
: { copier: (texte) => navigator.clipboard.writeText(texte) };
|
|
|
|
// Chaque démonstration livrée, nommée par l'entrée de même clé du catalogue,
|
|
// dans l'ordre du catalogue.
|
|
const demonstrations = LIVREES.map(({ cle, texte }) => ({
|
|
cle,
|
|
nom: CATALOGUE.find((entree) => entree.cle === cle).nom,
|
|
texte,
|
|
}));
|
|
|
|
mount(App, {
|
|
target: document.body,
|
|
props: {
|
|
fs,
|
|
horloge: creerHorlogeSysteme(),
|
|
executeur: creerExecuteurTravailleur(() => new Travailleur(), {
|
|
coeursDisponibles: navigator.hardwareConcurrency,
|
|
}),
|
|
pressePapiers,
|
|
identifiant: () => crypto.randomUUID(),
|
|
langue: 'fr',
|
|
provenance: import.meta.env.MODE,
|
|
demonstrations,
|
|
formatCourant: FORMAT,
|
|
produitVersion: VERSION.affichee,
|
|
versionWindows: VERSION.windows,
|
|
},
|
|
});
|