cocodu67...
Messages postés3153Date d'inscriptionjeudi 28 janvier 2010StatutMembreDernière intervention 4 avril 2024
-
5 oct. 2014 à 21:59
cocodu67...
Messages postés3153Date d'inscriptionjeudi 28 janvier 2010StatutMembreDernière intervention 4 avril 2024
-
5 oct. 2014 à 22:44
Bonsoir
J'ai créé un programme en C# qui génère toutes les combinaisons possibles (si on mélange les lettres) à partir d'une chaîne de caractères. J'ai pris tout l'alphabet et j'ai choisis de générer toutes les combinaisons pour 4 caractères de long mais ça met beaucoup de temps et au bout d'un moment j'ai un message d'erreur :
Le CLR n'a pas pu effectuer de transition du contexte COM 0x4a8490 au contexte COM 0x4a8600 pendant 60 secondes. Le thread qui possède le contexte/cloisonnement de destination est probablement en train d'attendre ou de traiter une opération très longue sans pompage des messages Windows. Cette situation a généralement des effets négatifs sur les performances et peut parfois entraîner le blocage de l'application ou une utilisation ininterrompue de la mémoire. Pour éviter ce problème, tous les threads STA (Single Threaded Apartment) doivent utiliser des primitives d'attente de pompage (par exemple CoWaitForMultipleHandles) et pomper de manière régulière les messages lors des opérations qui sont longues à s'exécuter.
Est ce que vous avez une solution ?
Je ne peux pas faire ça en deux fois, par exemple avec la moitié de l'alphabet puis avec l'autre moitié sinon toutes les combinaisons ne seront pas générées.
KX
Messages postés16733Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 janvier 2024127 5 oct. 2014 à 22:16
Bonjour,
Si je comprends bien ton programme plante pour générer les tous les mots de 4 lettres possibles ?
Je ne connais pas C# mais à raison de 26 lettres dans l'alphabet ça fait moins de 500 000 résultats, ça ne devrait pas prendre 60 secondes.
Il faudrait voir ton code, mais à mon avis il y a une coquille...
Où est-ce que tu les mets tes résultats ? Dans une console ? Un fichier ?
Si c'est une interface graphique il a peut être du mal à tout afficher...
cocodu67...
Messages postés3153Date d'inscriptionjeudi 28 janvier 2010StatutMembreDernière intervention 4 avril 20241 5 oct. 2014 à 22:27
Ah bon tellement peu ...
En faite je fais tout en local et je stocke le tout dans une base de données avec quelques autres infos à chaque fois. J'ai déjà essayé de générer toutes les combinaisons de 3 caractères de long et c'est assez rapide (et surtout ça fonctionne donc pas de bug dans le code) mais là avec 4 mon pc a vraiment du mal.
Mon PC a 3 Go de ram et 2.16 Ghz pour le processeur, c'est peut être lié à ça aussi.
En faite je n'ai rien de précis en tête à part le fait de coder un peu en C# histoire de ne pas oublier.
KX
Messages postés16733Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 janvier 2024127 5 oct. 2014 à 22:30
26 lettres possibles sur 4 caractères, ça fait 26^4 possibilités (environ 457 000).
À raison de 1 octet par caractères, ça fait moins de 2 Mo en mémoire...
Je viens de faire le test en Java, j'ai mis 6 secondes, affichage inclus.
cocodu67...
Messages postés3153Date d'inscriptionjeudi 28 janvier 2010StatutMembreDernière intervention 4 avril 20241 5 oct. 2014 à 22:35
Oups là j'en suis à 80 Mo, j'ai l'impression que la génération repend à l'infini. Je vais voir ce qui cloche.
Je vais également voir ce que ça donne avec un Thread comme conseillé par NHenry et pourquoi pas un backgroundworker.
cocodu67...
Messages postés3153Date d'inscriptionjeudi 28 janvier 2010StatutMembreDernière intervention 4 avril 20241 5 oct. 2014 à 22:44
Effectivement, c'était une erreur bête qui faisait tourner la génération des chaines de caractères à l'infini. Ouf heureusement que chez toi c'était assez rapide, je serais encore en train d'attendre dans 1 heure.
NHenry
Messages postés15112Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention13 avril 2024159 5 oct. 2014 à 22:16
Bonsoir,
Je pense que si tu utilisais un thread, cela serait mieux.
Regardes de ce côté et de celui du BackGroundWorker.
cocodu67...
Messages postés3153Date d'inscriptionjeudi 28 janvier 2010StatutMembreDernière intervention 4 avril 20241 5 oct. 2014 à 22:24
J'ai utilisé un backgroundworker dans une des applications que j'ai fais pour mon projet de fin de deuxième année mais je n'ai pas vraiment compris à quoi il sert et quel est l'avantage de l'utiliser.
Pour les thread j'en ais déjà utilisé. Qu'est ce que je devrais en faire ? Le mettre en "pause" parfois ?
NHenry
Messages postés15112Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention13 avril 2024159 5 oct. 2014 à 22:36
Non, Un thread bosse à coté du thread d'affichage, cela permet d'éviter de figer l'affichage.
cocodu67...
Messages postés3153Date d'inscriptionjeudi 28 janvier 2010StatutMembreDernière intervention 4 avril 20241 5 oct. 2014 à 22:41
5 oct. 2014 à 22:27
En faite je fais tout en local et je stocke le tout dans une base de données avec quelques autres infos à chaque fois. J'ai déjà essayé de générer toutes les combinaisons de 3 caractères de long et c'est assez rapide (et surtout ça fonctionne donc pas de bug dans le code) mais là avec 4 mon pc a vraiment du mal.
Mon PC a 3 Go de ram et 2.16 Ghz pour le processeur, c'est peut être lié à ça aussi.
En faite je n'ai rien de précis en tête à part le fait de coder un peu en C# histoire de ne pas oublier.
5 oct. 2014 à 22:30
À raison de 1 octet par caractères, ça fait moins de 2 Mo en mémoire...
Je viens de faire le test en Java, j'ai mis 6 secondes, affichage inclus.
5 oct. 2014 à 22:35
Je vais également voir ce que ça donne avec un Thread comme conseillé par NHenry et pourquoi pas un backgroundworker.
5 oct. 2014 à 22:44