Splash Screen

cs_artisti Messages postés 7 Date d'inscription lundi 28 avril 2003 Statut Membre Dernière intervention 20 janvier 2010 - 31 déc. 2009 à 11:30
blq Messages postés 97 Date d'inscription vendredi 22 octobre 1999 Statut Membre Dernière intervention 13 juin 2016 - 12 oct. 2012 à 09:33
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

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
31 déc. 2009 à 12:27
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
31 déc. 2009 à 14:04
intéressant casy, je garde de côté
merci
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
28 avril 2011 à 12:11
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
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
28 avril 2011 à 12:12
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
28 avril 2011 à 13:15
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
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
4 mai 2011 à 17:01
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
4 mai 2011 à 17:16
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
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
4 mai 2011 à 17:26
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
0
blq Messages postés 97 Date d'inscription vendredi 22 octobre 1999 Statut Membre Dernière intervention 13 juin 2016 1
12 oct. 2012 à 09:33
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 !
0
Rejoignez-nous