Garder le contrôle d'un programme qui rame

Signaler
Messages postés
70
Date d'inscription
mercredi 24 septembre 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
70
Date d'inscription
mercredi 24 septembre 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
Bonjour à tous,

Voilà mon problème : je suis en train de develloper un programme en VB6.
Ce programme fait un traitement sur de gros fichier (type films a 700 Mo) en utilisant une DLL que j'ai programmé en C.

Le programme fonctionne sans souci, cela dit pendant le traitement, je perd le contrôle du programme ("form1 (Ne répond pas)")
Le problème, c'est que je me suis bien appliqué a programmer une form qui indique l'etat d'avancement du programme, mais rien à faire, elle plante dès l'ouverture...

Coment pourrais-je éviter cela?

Merci d'avance

9 réponses

Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Bonjour,

en modifiant ton code (qu'on ne voit pas ...!) là où il convient de le faire et comme il convient de le faire ...
Messages postés
70
Date d'inscription
mercredi 24 septembre 2003
Statut
Membre
Dernière intervention
16 juin 2010

voici le code :

    Frame3.Visible = True                          'C'est la Frame qui informe de l'etat d'avancement     
    
     
    For i = 0 To List1.ListCount - 1          'Les fichiers de la listbox sont les fichiers à traiter
       
       OriginalFile = File1.Path + "" + List1.List(i)
        FinalFile = OriginalFile + ".cpt"
       
        Label4.Caption = List1.List(i)      'On affiche le nom du fichier en cours de traitement dans la frame d'avancement
        
        retour = Traitement(OriginalFile, FinalFile, Text1.Text)                'La fonction traitement est la fonction de ma DLL
    Next
    
    Frame3.Visible = False                       'On masque la frame d'avancement, normal : c'est fini...

Le problème est que la premiere ligne, l'affichage de la frame3, ne se fait pas! Et ma form devient "flou" (sous vista, c'est un signe que ca va pas... :) )
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Cà, ce n'est que le code de traitement d'une liste déjà remplie et l'affichage, juste avant, de ton Frame3


Ca ne nous dit pas vraiment grand chose ...


On peut toutefois deviner un tout petit peu :


Mets voir un DoEvents à la ligne  juste après
Label4.Caption = List1.List(i)

Je ne comprends par contre pas pourquoi ton Frame n'est pas visible dès la première ligne !
Mets un Doevents juste après égalemen,t + un Frame3.Refresh
Messages postés
70
Date d'inscription
mercredi 24 septembre 2003
Statut
Membre
Dernière intervention
16 juin 2010

C'est pourtant tout le code que j'ai dans mon projet VB, le traitement des fichier étant fait la DLL que j'ai programmer en C...

Pour la frame3, c'est simplement un "effet de style", elle n'apparait que lors du traitement des données.

Est-ce que je devrais plutot me tourner vers une modification de ma DLL??

Pour faire cours, la DLL ouvre le fichier en binaire, et fait un XOR octet par octet avec le Text1.Text passé en parametre...

Je le repete encore une fois : tout fonctionne, j'ai simplement une perte du controle de la form le temp du traitement
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Je ne comprends pas...


 


Quiestions :


1) ton OS ?


2) dans quel évènement as-tu mis ce code ?


3) as-tu tenté ce que je t'ai dit ?
Messages postés
70
Date d'inscription
mercredi 24 septembre 2003
Statut
Membre
Dernière intervention
16 juin 2010

1) Mon OS : Vista


2) Evenement : Lors du clic sur le bouton de départ


3) J'ai tenté ce que tu m'a dit. La frame s'affiche effectivement, mais mon programme passe toujour au bout de 5 sec en mode (Ne répond pas)...


 
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Alors :

Sous Vista : essaye de désactiver AERO, s'il est activé.
Pour le reste (ton programme qui ne répond plus) : dur dur ...


C'est soit (plus probablement) un problème avec un chemin dans ta listbox, soit un problème dans ta fonction C


5 secondes, dis-tu ? curieux, çà ...


Mets un compteur sur la variable i ou passe en mode debug pour voir sur quel i elle plante !
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Attends ....
Regarde aussi l'évolution de l'utilisation de tes ressources... à tout hasard ...
Ta fonction C crée-t-elle des objets ? Les supprime-t-elle au fur et à mesure (lorsque terminée, au moins) ?
Messages postés
70
Date d'inscription
mercredi 24 septembre 2003
Statut
Membre
Dernière intervention
16 juin 2010

Merci pour ton aide jmf0!

Pour ce qui est de AERO, je sais pas trop ce que sais, mai bon... Google est mon ami!

Je ne pense pas que ce soit un probleme dans la listbox ou avec la variable i, puisque quand je fait un test avec un seul fichier dans cette listbox, le programme rame quand même! Et pour ce qui est des objet, ma fonction étant en C, je ne travaille pas sur des objets.

A tout hasard, je poste le code de ma fonction en C, même si j'ai bien conscience que sa place serais plutot sur Cppfrance :)

int DLL_EXPORT _stdcall Xcrypt (char * NomFichier, char * NomFichierCrypt, char * clef)
{
FILE *fichier;
FILE *fichierCrypt;
char Caract;
int PosClef, LongClef;
PosClef=0;
LongClef = strlen(clef);

fichier = fopen(NomFichier, "rb");
fichierCrypt = fopen(NomFichierCrypt, "wb");




fread(&Caract, sizeof(Caract), 1, fichier);





while(!feof(fichier))
{
    Caract = Caract^clef[PosClef];



    PosClef++;



    if(PosClef==LongClef) PosClef=0;





    fwrite(&Caract, sizeof(Caract), 1, fichierCrypt);
    fread(&Caract, sizeof(Caract), 1, fichier);
}





fclose(fichier);
fclose(fichierCrypt);





return(1);
}


Je pense tout simplement que mon prog est trop gourmand en ressources. Mais j'ai déja eu des programme, comme par exemple un programme de récupération de mot de passe d'archive en brute force, qui testait 300 mot de passe à la seconde, et qui utilisait 90% du proc en moyenne. Et il ne plantait pas! Et on pouvais suivre en direct les test de mots de passe...
Donc il doit y avoir un moyen d'éviter cela... Mais lequel?

En tous cas merci a toi de prendre le temps de m'aider...