Maison > développement back-end > Golang > le corps du texte

Comment puis-je créer un indicateur d'attente/occupé visuellement attrayant pour les processus de longue durée dans Go ?

Patricia Arquette
Libérer: 2024-10-24 18:59:02
original
801 Les gens l'ont consulté

How can I create a visually appealing waiting/busy indicator for long-running processes in Go?

Création d'un indicateur d'attente/occupé pour les processus exécutés

Lors de l'exécution de processus enfants, comme dans l'exemple fourni, il peut être avantageux de fournir retour visuel à l'utilisateur indiquant que le processus est en cours d'exécution, en particulier lorsque le temps d'exécution peut être long. Cela peut aider à empêcher l'utilisateur de penser que le programme est gelé.

Pour créer un indicateur d'attente/occupé, une approche consiste à utiliser une goroutine pour imprimer périodiquement quelque chose pendant l'exécution du processus. Une fois le processus terminé, un signal peut être envoyé à la goroutine pour y mettre fin.

Voici un exemple de code qui illustre cette approche :

<code class="go">package main

import (
    "fmt"
    "log"
    "os/exec"
    "time"
)

func indicator(shutdownCh <-chan struct{}) {
    ticker := time.NewTicker(time.Second)
    defer ticker.Stop()
    for {
        select {
        case <-ticker.C:
            fmt.Print(".")
        case <-shutdownCh:
            return
        }
    }
}

func main() {
    cmd := exec.Command("npm", "install")
    log.Printf("Running command and waiting for it to finish...")

    // Start indicator:
    shutdownCh := make(chan struct{})
    go indicator(shutdownCh)

    err := cmd.Run()

    close(shutdownCh) // Signal indicator() to terminate

    fmt.Println()
    log.Printf("Command finished with error: %v", err)
}</code>
Copier après la connexion

Ce code utilise un ticker pour imprimer un point toutes les secondes et un canal d'arrêt pour signaler à la goroutine de l'indicateur de se terminer lorsque le processus est terminé.

Pour démarrer une nouvelle ligne tous les cinq points, modifiez la fonction de l'indicateur comme suit :

<code class="go">func indicator(shutdownCh <-chan struct{}) {
    ticker := time.NewTicker(time.Second)
    defer ticker.Stop()
    for i := 0; ; {
        select {
        case <-ticker.C:
            fmt.Print(".")
            if i++; i%5 == 0 {
                fmt.Println()
            }
        case <-shutdownCh:
            return
        }
    }
}</code>
Copier après la connexion

En mettant en œuvre ce type d'indicateur, vous pouvez fournir un retour visuel clair aux utilisateurs, indiquant que le processus est en cours et n'est pas gelé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!