L'Écran de démarrage d'attente jusqu'à ce thread finitions
J'ai encore un problème avec l'écran de démarrage. Je ne veux pas utiliser la propriété SC.TopMost=true
.
Maintenant mon scénario de l'application est comme suit:
dans progeram.cs:
[STAThread]
static void Main()
{
new SplashScreen(_tempAL);//where _tempAL is an arrayList
Application.Run(new Form1(_tempAL));
}
en classe SplashScreen:
public SplashScreen(ArrayList _Data)
{
DisplaySplash()
}
private void DisplaySplash()
{
this.Show();
this.TopMost = true;
this.CenterToScreen();
this.SetTopLevel(true);
_allServerNarrators = new string[10];
for (int i = 0; i < _allServerNarrators.Length; i++)
_allServerNarrators[i] = null;
GetFromServer();
this.Hide();
_serverData = new ArrayList();
_thisData.Add(_allServerNarrators);
_thisData.Add(_serverNarrators);
}
private void GetFromServer()
{
_serverNarrators = new ArrayList();
string _file = "Suras.serverNar";
if (!Directory.Exists("c:\\ASGAQuraan"))
Directory.CreateDirectory("c:\\ASGAQuraan");
while (counter < 4 && _serverFiles == null)
{
if (Download("c:\\ASGAQuraan", _ftpServerIP, _file))
{
StreamReader _strReader = new StreamReader
("c:\\ASGAQuraan\\"+_file,System.Text.Encoding.Default);
string _line = _strReader.ReadLine();
string _word;
while (true)
{
while (_line != null)
{
_word = _line.Substring(0, _line.IndexOf("*"));
int _narId = Convert.ToInt32(_word);
_line = _line.Substring(2);
int k = 0;
_serverNarratorNode = new ArrayList();
while (true)
{
int ind = _line.IndexOf("*");
if (ind > 0 && ind < _line.Length)
{
string str = _line.Substring(0, (ind));
if (k == 0)
{
_allServerNarrators[_narId] = str;
_serverNarratorNode.Add(str);
}
else
{
_serverNarratorNode.Add(str);
}
_line = _line.Substring(ind + 1);
k++;
}
else
{
_line = null;
break;
}
}
_serverNarrators.Add(_serverNarratorNode);
_serverFiles = "added";
}
_line = _strReader.ReadLine();
if (_line == null)
{
break;
}
}
}
else
counter++;
}
}
Ce que je veux, c'est quelque chose dans l'écran de démarrage de classe qui attend jusqu'à ce que le thread se termine.
Pour plus de détails, s'il vous plaît dites-moi ce que je besoin de vous dire.
- Il n'est pas évident pour moi (quelqu'un qui n'a pas de programme en C#) ce que le _tempAL truc est de cela dont il n'est pas utilisé dans le Splashscreen de classe. Vous avez également le littéral "c:\\ASGAQuraan\\", apparaissent un certain nombre de fois; qui devrait sûrement être une constante nommée, plutôt que de répéter. SEC - Ne pas se Répéter.
- Il aurait été génial si vous avez fourni le lien vers votre autre question. Si vous dites "j'ai toujours le même problème", qui doit savoir ce que votre problème en parlant de tout et ce "toujours le même" fait référence? J'ai trouvé ça maintenant, comme une référence: stackoverflow.com/questions/392787/...
Vous devez vous connecter pour publier un commentaire.
Suivantes sur 2 fils est un peu confus, mais je vais prendre un coup de couteau et de le dire...
Je ne comprends pas tout votre dessin ici, mais si le problème est que lorsque vous lancez une application de l'écran de démarrage de la forme devient blanc... C'est probablement dû au fait que l'écran de démarrage est occupé à exécuter l'ensemble de ce code dans GetFromServer(). Tellement occupé qu'il n'a pas le temps de re-peinture elle-même.
Pour remédier à ce problème, je vous suggère d'utiliser l' Composant BackGroundWorker pour exécuter la GetFromServer méthode. Cela permettra d'exécuter cette méthode dans un thread séparé et laisser le thread du formulaire libre de re-peinture elle-même.
Même question, même réponse:
L' .NET framework est un excellent support intégré pour les écrans de démarrage. Démarrer un nouveau projet WF, Projet + Ajouter une Référence, sélectionnez Microsoft.VisualBasic. Ajouter un nouveau formulaire, appelez ça frmSplash. Ouvrir Un Projet.les cs et les faire ressembler à ceci:
new FormMain(args)
affiche une boîte de message, il sera ouvert derrière, l'écran de démarrage. @Hans Passant, connaissez-vous une solution? Ne dites pas "faire le constructeur simple" —si je pouvais résoudre ce problème je n'aurais pas besoin d'un écran de démarrage!Vous avez pénétré dans un territoire dangereux par la création de l'INTERFACE utilisateur avant votre appel à Candidature.Run(). Application.Run est essentiellement de votre programme de pompe de message. Par l'affichage de l'INTERFACE utilisateur avant de commencer l'application du message de la pompe, vous faites typique de l'INTERFACE utilisateur de l'interaction effectivement impossible de prématuré de l'INTERFACE utilisateur. Pour un écran de démarrage, cela peut ne pas sembler pertinent, mais il sera question si (par exemple) il y a une demande à faire à l'écran de démarrage de disparaître si il est cliqué sur, ou si vous souhaitez utiliser un BackgroundWorker.
Ces peut être contourné par la création d'un message de la pompe dans votre écran de démarrage (en la rendant modal via un appel à ShowDialog() au lieu de l'Afficher()), mais c'est traiter le symptôme lorsque l'on traite le problème n'est pas vraiment difficile.
Je vous recommandons fortement nobugz réponse dans ce cas. Le cadre fournit le soutien dont vous avez besoin. Tandis que les fonctionnalités de Microsoft.VisualBasic espace de noms ne sont pas toujours très détectable C#, programmeurs, ils peuvent être un réel gain de temps et bouée de sauvetage pour les cas de ce genre.
Bonne chance!
Vous devriez vraiment donner plus de détails sur votre problème. Je pourrais être complètement faux, mais je vais prendre un coup de feu dans l'obscurité. De ce que j'imagine est en cours et que vous voulez, vous souhaitez que l'écran de démarrage pour afficher une transformation dans un autre fil, puis l'écran de démarrage pour s'en aller lorsque vous avez terminé.
Pour ce faire, vous allez vouloir déplacer le
GetFromServer()
appel à unBackgroundWorker
. Déplacez ensuite lecode de la
BackgroundWorker_RunWorkerCompleted
gestionnaire d'événement.utilisation De la
BackgroundWorker
:1) Initialiser le
BackGroundWorker
2) Ajouter des gestionnaires d'événements
3) Ajouter du code pour les gestionnaires d'événements.
4) Appel
myWorker.RunWorkerAsync()
pour commencer à travailler.Comme une note à part, vous ne semblez pas faire n'importe quoi avec le
ArrayList
que vous êtes de passage à l'écran de démarrage du constructeur. Est-ce destiné?Malheureusement je n'ai pas assez de réputation pour le commentaire sur someones encore de réponse. 🙁 C'est censé être la réponse à Le Colonel Panique commentaire sur Hans Passant répondre.
Son problème était qu'un
MessageBox
montré denew FormMain(args)
sera affiché derrière l'écran de démarrage. La clé est d'invoquer la MessageBox le fil de l'écran de démarrage s'exécute dans:Où
splashScreen
est une référence à l'écran de démarrage de l'objet qui a été créé dansOnCreateSplashScreen
et, évidemment, doit être donné à la nouvelleForm1
objet.