Merci de lire mon Dernier message en bas du thread, Changement complet de sujet.
Merci de lire mon Dernier message en bas du thread, Changement complet de sujet.
La balise [ CODE][ /CODE] existe
Le programme ne plante pas mais reste bloquer car il n'y a qu'un seul Thread et que tu lui demandes de se figer (Sleep d'un seconde)
Il faut jouer avec soit un timer, soit creer un autre thread
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
Salut,
Ton programme ne plante pas à proprement parlé.
C'est surtout que tu lances une boucle infinie sur le thread principal de ton application et qu'une fois lancé tu ne peux plus interagir sur l'interface.
A mon sens le mieux serait d'utiliser la classe background worker.
Tu trouveras un tutoriel sur l'utilisation de cette classe ici:
http://webman.developpez.com/article...ckroundworker/
Tu disposes également d'un exemple concret ici
Bonne chance.
MvK
Les questions ne sont pas obligées d'avoir du sens. Mais les réponses, si.
Terry Pratchett (Procrastination)
Essaye un truc comme ça mais j'ai pas testé.
Et c'est la première fois que j'essaye d'aider kkun alors te fie pas trop a moi ;D
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 public int i; public BackgroundWorker bgwboucle; public void bgwboucle_Dowork(object sender, DoWorkEventArgs e) { int o = 0; do{ o++; UIUpdaterDelegate delegate1 = delegate { nbcycle.Text = Convert.ToString(o); }; nbcycle.Invoke(delegate1); // Label affiche nombre de cycle effectué Thread.Sleep(1000); // Pause: 1Sec } while (this.i == 1); } private void launch_Click(object sender, EventArgs e) { this.i = 1; if(!this.bgwboucle.IsBusy) { this.bgwboucle.RunWorkerAsync(); } } private void stop_Click(object sender, EventArgs e) { this.i = 0; } this.bgwboucle.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgwboucle_DoWork);
Et le while ?
la variable i ne varie jamais... donc boucle infinie... pas la peine de sortir l'artillerie lourde avec le BackgroundWroker ! (En tous cas, pas de suite).
Suggestion :
au lieu de
Code : Sélectionner tout - Visualiser dans une fenêtre à part while (o < i);
À priori, effectivement l'utilisation d'un timer serait largement plus approprié !
Code : Sélectionner tout - Visualiser dans une fenêtre à part while (i == 1);
"Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
"Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
"Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry
Je penses que la boucle infini c'est le but recherché.Et le while ?
la variable i ne varie jamais... donc boucle infinie... pas la peine de sortir l'artillerie lourde avec le BackgroundWroker !
D'où l'utilisation d'un autre thread via BgW,ce qui me semble le plus propre. Après je peux me planter.
Si on reste dans le main thread impossible de mettre à jour le label avec le nombre d’occurrences de cycle, sauf si on utilise l'Application.doEvents() ce qui serait, à mon sens, fort peu subtil.
MvK
Les questions ne sont pas obligées d'avoir du sens. Mais les réponses, si.
Terry Pratchett (Procrastination)
Ben il a 2 boutons il dit. Un qui lance la boucle l'autre qui l'arrête
Le premier bouton fixe this.i a 1 et lance le backgroundworker qui tourne temps qu'on click pas sur le bouton stop qui passe this.i à 0
C'est sur on doit pouvoir faire mieux mais dans le principe ça devrais marcher non ?
Bonjour.
Un truc simple pour commencer et pour comprendre :
PS : préférer les méthodes proposées précédemment.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 private bool bContinue; public void boucle () { int o = 0; do{ o = o + 1; nbcycle.Text = Convert.ToString(o); // Label affiche nombre de cycle effectué System.Threading.Thread.Sleep(1000); // Pause: 1Sec } while (bContinue); } private void launch_Click(object sender, EventArgs e) { bContinue = true; boucle(); } private void stop_Click(object sender, EventArgs e) { bContinue = false; }
Open Source Microsoft MediaFoundation
https://github.com/mofo7777
http://jeux.developpez.com/faq/directx/?page=dshow
Bon ben, L'interface n'etant pas obligatoire (vu que c'est un petit logiciel qui tourne sans l'aide de personne)
je suis passer a une appli console.
J'ai donc reussi ma boucle avec le timer etc
Maintenant le probleme qui se presente c'est que j'ai eu l'idée d'utiliser Directory.Move pour Deplacer les Dossier
Sauf qu'avec cette commande, on ne peux transferer des dossiers d'un endroit a un autre du MEME disque dur.
Code: [Sélectionner]
Variables:
dans le main:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 string Dossier1 = @"Z:\Soft_**\***_***\Desktop"; string Dest1 = @"C:\serv\";
Erreur affiché:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Directory.Move(Dossier1,Dest1);
Le chemin d'accès source et celui de destination doivent avoir des racines identiques. Le déplacement n'est pas possible entre ces volumes.
Je me retrouve bloqué sur 'Comment deplacer les dossiers D'un PC a un serveur (via reseau). (Z = serveur // C = Local).
P.s (les etoiles sur les chemins, c'est juste de la censure.)
Une solution
Doublon, Message a supprimer
Directory.Copy(source,destination)
Directory.Delete(source)
Pourquoi faire simple quand on peut faire compliquer
dans un try catch ca peut etre utile
Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes
Directory.Copy N'existe pas
ou du moins mon Visual Studio ne me le propose pas.
Edit: en regardant sur le net, il y aurait une alternative a Directory.Copy
Ce serait:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 private void XCopy(string dir1, string dir2) { string[] files = Directory.GetFiles(dir1); foreach (string f in files) { File.Copy(f, dir2 + f.Substring(dir1.Length), true); } string[] dirs = Directory.GetDirectories(dir1); foreach (string d in dirs) { XCopy(d, dir2 + d.Substring(dir1.Length)); }
Sauf que quand je met cette fonction Dans ma class
Mon main ne reconnait pas Xcopy, je n'arrive pas a utiliser la fonction, pourquoi ?
incompréhensible ton Thread!!
Nouveau sujet = Nouveau thread
Problème d'accès, tu appels surement ta méthode depuis une méthode static.
Essai avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part private static void XCopy(...)
Je prend note pour mes prochains threads.
Merci beaucoup pour le static !!!
Voila nouveau message d'erreur.
Impossible de trouver une partie du chemin d'accès
Voici le code:
Variables:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public static void copidos(string dir1, string dir2) { string[] files = Directory.GetFiles(dir1); foreach (string f in files) { File.Copy(f, dir2 + f.Substring(dir1.Length), true); } string[] dirs = Directory.GetDirectories(dir1); foreach (string d in dirs) { copidos(d, dir2 + d.Substring(dir1.Length)); } }
et le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 string Dossier1 = @"Z:\Soft_***\****_***\Desktop"; string Dossier2 = @"Z:\Soft_*****_***\Documents"; string Dossier3 = @"Z:\Soft_***\****_***\***_***_****_DISTRIBUTION"; string Dest1 = @"C:\serv\";
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 copidos(Dossier1,Dest1); copidos(Dossier2, Dest1); copidos(Dossier3, Dest1);
l'endroit surligner est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 string[] files = Directory.GetFiles(dir1); de la fonction
Une explication ?
Cela arrive quelque fois lors de l'accès aux lecteurs réseaux, si je ne me trompe pas c'est ton cas.
La seule solution est de recréer le lecteur réseau:Cela devrait corriger ton problème d'accès réseau
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 if(!Directory.Exists(@"Z:\")){ Process delete = Process.Start("net.exe", @"use Z: /DELETE /YES"); delete.WaitForExit(); Process create = Process.Start("net.exe", @"use Z: \\SERVEUR\Path password /USER:username /PERSISTENT:YES"); create.WaitForExit(); }
Open Source Microsoft MediaFoundation
https://github.com/mofo7777
http://jeux.developpez.com/faq/directx/?page=dshow
Malheuresement cela ne viens pas de la, et je viens de remarquer un truc,
Le dossier 1 & 2 est effectivement bien copié, mais le dossier 3 non.
Le dossier 1 contient un .exe, le dossier 2 contient un .txt, et le dossier 3 contient un autre dossier
du coup le programme se stop a ce moment j'ai remarqué que cela bloque sur la ligne ou il y a le GETFILES.
Je pense que je doit faire une condition 'si c'est un dossier, ignorer cette etape' car en dessous il y un a GETDIRECTORY
une idée de comment je peux faire ca?
Edit: j'ai retiré mon Dossier 3 du transfert, et ce depuis tout va bien, allez savoir pourquoi.
RESOLU
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager