Programme trop long à être exécuté [Résolu]

cocodu67... 3040 Messages postés jeudi 28 janvier 2010Date d'inscription 1 avril 2018 Dernière intervention - 5 oct. 2014 à 21:59 - Dernière réponse : cocodu67... 3040 Messages postés jeudi 28 janvier 2010Date d'inscription 1 avril 2018 Dernière intervention
- 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.

Merci d'avance de votre aide :)
Afficher la suite 

10 réponses

Répondre au sujet
KX 15363 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 5 oct. 2014 à 22:16
0
Utile
4
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... 3040 Messages postés jeudi 28 janvier 2010Date d'inscription 1 avril 2018 Dernière intervention - 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 15363 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 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... 3040 Messages postés jeudi 28 janvier 2010Date d'inscription 1 avril 2018 Dernière intervention - 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... 3040 Messages postés jeudi 28 janvier 2010Date d'inscription 1 avril 2018 Dernière intervention - 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.
Commenter la réponse de KX
NHenry 14129 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 19 avril 2018 Dernière intervention - 5 oct. 2014 à 22:16
0
Utile
3
Bonsoir,

Je pense que si tu utilisais un thread, cela serait mieux.
Regardes de ce côté et de celui du BackGroundWorker.
cocodu67... 3040 Messages postés jeudi 28 janvier 2010Date d'inscription 1 avril 2018 Dernière intervention - 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 14129 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 19 avril 2018 Dernière intervention - 5 oct. 2014 à 22:36
Non, Un thread bosse à coté du thread d'affichage, cela permet d'éviter de figer l'affichage.
cocodu67... 3040 Messages postés jeudi 28 janvier 2010Date d'inscription 1 avril 2018 Dernière intervention - 5 oct. 2014 à 22:41
Ah oui en effet ce serait très pratique.
Commenter la réponse de NHenry
cocodu67... 3040 Messages postés jeudi 28 janvier 2010Date d'inscription 1 avril 2018 Dernière intervention - 5 oct. 2014 à 22:44
0
Utile
Merci à vous deux. Ça fonctionne parfaitement :)
Je met en place un thread dès demain.

Bonne soirée
Commenter la réponse de cocodu67...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.