Splash Screen

Signaler
Messages postés
7
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
20 janvier 2010
-
Messages postés
97
Date d'inscription
vendredi 22 octobre 1999
Statut
Membre
Dernière intervention
13 juin 2016
-
Bonjour,

je suis en VB.Net

j'ai créé une form SplashScreen qui se charge au démarrage.
J'y ai insere un objet Label dont je voudrai modifier le contenu au fil du changement du process.

Mon process se trouve dans une autre form "Form1".

Depuis "Form1", je souhaiterai faire quelque chose du genre :
SplashScreen.Label.Text = "Chargement..."

Bien entendu, cela ne fonctionnement pas. L'aide me revoit vers des Thread...

Pouvez vous m'aider ?

Merci d'avance.

9 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Effectivement, il semblerait que le splashscreen soit exécuté dans thread séparé du thread principal. Pour des raisons de stabilité de l'application, l'appel à des controles d'un écran exécuté dans un thread différent est interdit. Il faut passer par un délégué

En analysant l'exemple donné dans l'aide proposée par l'écran de l'exception, on peut en déduire ceci :

Dans ton écran SplashScreen tu rajoute le code ci-dessous :

	Delegate Sub SetTextCallback(ByVal [text] As String)

Public Sub SetText(ByVal [text] As String)

' InvokeRequired required compares the thread ID of the
' calling thread to the thread ID of the creating thread.
' If these threads are different, it returns true.
If Me.Label.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf SetText)
Me.Invoke(d, New Object() {[text]})
Else
Me.Label.Text = [text]
End If
End Sub


Dans ton écran principal, lorsque tu veux modifier le text du splashscreen tu vas, maintenant, simplement faire :
SplashScreen.SetText("Chargement ...")


Le principe :
Tu appelle la fonction SetText dans le même thread que ton écran principal. Celle-ci va tester si elle peut acceder directement à ton contrôle (InvokeRequired). A priori, elle ne pourra pas pas. Elle va donc créer un délégué (SetTextCallback) sur la fonction SetText du thread de l'écran SplashScreen et ainsi, à travers le délégué, appeler (Me.Invoke) cette fonction

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
39
intéressant casy, je garde de côté
merci
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

La question date mais la solution serviras sans doute à quelqu'un un de ces jours ^^
Merci à vpoyo pour le lient ici
Topic où j'ai trouvé la réponse

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Du coup pas besoin de multithreading donc pas besoin de délégué ^^


Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
LE code que tu donne Polack77 ne correspond pas au problème posé ici.

J'y ai insere un objet Label dont je voudrai modifier le contenu au fil du changement du process.

Cela suppose que le processus principal continu à tourner et à effecteur des opérations durant l'affichage du splashscreen. D'où l'utilisation d'un splashscreen dans un thread séparé.

Le but premier du splashscreen est d'afficher une image, un logo ou autre durant un chargement de l'application pouvant parfois être long. Et surtout d'éviter aussi d'avoir à afficher l'écran principal durant sa construction et les effets de clignotements qu'elle engendre, particulièrement désagréable. Il faut donc que le thread principal puisse continuer à fonctionner durant cet affichage.

Dans l'exemple que tu donne, le thread principal est immédiatement suspendu, pour 5 sec dans le cas présent, dès l'affichage du splashscreen. L'utilité du splashscreen, ici, est uniquement l'affichage du splashscreen et rien d'autre.

Ton code n'en reste pas moins utile pour ceux qui ne recherche que cette fonctionnalité


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Bà justement
Sauf erreur de ma part la suspension du thread simule l'occupation de ce même thread (et donc les traitements)
Enfin je peut me tromper mais si j'en crois mes tests l'affichage se passe sans problème alors que le thread principale travail.

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Simuler n'est pas occuper ou traiter.

Dans le code que tu donne, le thread principal est suspendu pendant 5 sec, ce qui a pour effet donc que le splashscreen reste affiché 5 sec comme si le thread principal effectuait quelque chose et qui prendrait 5sec.

Sauf que ce thread principal est bien incapable d'effectuer quelques chose durant ces 5sec, parce qu'il est suspendu, c'est à dire qu'il est endormis, mis sur pause, il n’exécute plus aucune instructions.

Alors à l'écran, oui, ça simule, mais c'est tout.Ça ne peut faire que ça. L'affichage se passe correctement, mais le thread principal ne travaille pas.

Cette solution est tout à fait valable s'il ne s'agit que d'afficher un splashscreen sans avoir de traitement particulier à faire en attendant.
Mais si, effectivement a réellement du traitement à faire, cette solution ne marchera pas.


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

arf j'en as oublier un GROS morceau là

Dans un nouveau projet, j'ajoute un SplashScreen.
Dans ce SplashScreen (nommer automatiquement SplashScreen1) j'ajoute un label (nommer Label1)

Mon code démarre sur Form1 (config par défaut)

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim MySplashScreen As New SplashScreen1
        MySplashScreen.Show()
        MySplashScreen.Update()
        For compteur As Int16 = 0 To 10
            MySplashScreen.Label1.Text = "Texte N°" & compteur
            MySplashScreen.Update()
            System.Threading.Thread.CurrentThread.Sleep(1000)
        Next
        MySplashScreen.Close()
        MySplashScreen.Dispose()
    End Sub
End Class


Et perso plus de problème sans avoir à utiliser le multithreading

........

Re-arf si il reste un petit problème si une autre fenêtre passe par dessus le SplashScreen. Il faut attendre un nouveau tour de boucle

Donc oui besoin de multithreading pour que sa soit parfait...

Dzl

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Messages postés
97
Date d'inscription
vendredi 22 octobre 1999
Statut
Membre
Dernière intervention
13 juin 2016
1
Ce code avec l'utilisation du "SetTextCallback", pour gérer le Thread, est excellent et s'accorde parfaitement avec l'utilisation d'une Form en SplashScreen sous Visual Basic 2010 Express.

Pas besoin de "Sleep" ou de gérer un Activate ou Close d'une Form, avec VB 2010, il suffit d'indiquer une Form dans les propriétés du Projet (onglet Application), le SplashScreen gère sa "vie" et depuis le chargement principal (le New() de votre Form principale, par exemple), il suffit d'initialiser les infos via le SetText comme indiqué par Casy (Call SplashScreen.SetText("Chargement ...")), afin de préciser l'état d'avancement d'un chargement ou d'une initialisation un peu longue.

Merci pour cette aide !