Programme trop long à être exécuté

Résolu
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 - 5 oct. 2014 à 21:59
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Derniè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.

Merci d'avance de votre aide :)

3 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
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...
0
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 1
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.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
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.
0
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 1
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.
0
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 1
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.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
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.
0
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 1
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 ?
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
5 oct. 2014 à 22:36
Non, Un thread bosse à coté du thread d'affichage, cela permet d'éviter de figer l'affichage.
0
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 1
5 oct. 2014 à 22:41
Ah oui en effet ce serait très pratique.
0
cocodu67... Messages postés 3153 Date d'inscription jeudi 28 janvier 2010 Statut Membre Dernière intervention 4 avril 2024 1
5 oct. 2014 à 22:44
Merci à vous deux. Ça fonctionne parfaitement :)
Je met en place un thread dès demain.

Bonne soirée
0
Rejoignez-nous