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

Messages postés
3058
Date d'inscription
jeudi 28 janvier 2010
Dernière intervention
28 novembre 2018
- - Dernière réponse : cocodu67...
Messages postés
3058
Date d'inscription
jeudi 28 janvier 2010
Dernière intervention
28 novembre 2018
- 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 

Votre réponse

3 réponses

Messages postés
15854
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 décembre 2018
0
Merci
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és
3058
Date d'inscription
jeudi 28 janvier 2010
Dernière intervention
28 novembre 2018
-
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és
15854
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 décembre 2018
-
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és
3058
Date d'inscription
jeudi 28 janvier 2010
Dernière intervention
28 novembre 2018
-
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és
3058
Date d'inscription
jeudi 28 janvier 2010
Dernière intervention
28 novembre 2018
-
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
Messages postés
14316
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
5 décembre 2018
0
Merci
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és
3058
Date d'inscription
jeudi 28 janvier 2010
Dernière intervention
28 novembre 2018
-
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és
14316
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
5 décembre 2018
-
Non, Un thread bosse à coté du thread d'affichage, cela permet d'éviter de figer l'affichage.
cocodu67...
Messages postés
3058
Date d'inscription
jeudi 28 janvier 2010
Dernière intervention
28 novembre 2018
-
Ah oui en effet ce serait très pratique.
Commenter la réponse de NHenry
Messages postés
3058
Date d'inscription
jeudi 28 janvier 2010
Dernière intervention
28 novembre 2018
0
Merci
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.