Enregistrement et barre de progression

VeillardVeillard Membre
23:29 modifié dans API AppKit #1
Bonjour,

Comment gère-ton une barre de progression à  l'ouverture d'un fchier ?
Je m'explique : j'ai des fichiers assez volumineux qui mettent 2 à  3 sec. voire plus pour s'ouvrir. Pour montrer que tout se passe bien, j'aimerais afficher une barre de progression pour montrer l'état d'avancement lors du chargement du fichier. Comment fait-on ?

Réponses

  • Eddy58Eddy58 Membre
    23:29 modifié #2
    Il faut utiliser un objet de classe NSProgressIndicator, que tu places ou tu veux dans ta fenêtres sous IB, ensuite tu fais l'outlet classique.
    Tu as deux types : Determinate (Barre de progression) et Indeterminate (la célèbre roue avec ses dégradés de gris).
    Pour un type Determinate, tu règles la barre avec les méthodes incrementBy: ou setDoubleValue:.
    Et pour démarrer ton progress indicator, tu fais simplement un startAnimation: dessus, puis un stopAnimation: pour l'arrêter.
    Mais pour plus de précisions il vaut mieux jeter un coup d'oeil dans la doc... :)
  • VeillardVeillard Membre
    23:29 modifié #3
    Pour la gestion des barres de progression, j'ai quelques exemples dans mon appli.  :P
    En revanche, comment peut-on envoyer le signal d'affichage de la fenêtre contenant la barre après avoir fait un "openDocument:" puis comment envoyer le signal de fin (dès que le fichier est chargé).
    ...Et surtout comment faire progresser cette barre ? On part de "0.0" et on arrive à  "100.0" ça, c'est facile  :) la barre est blanche puis toute bleue sans une vraie progression.  :-\\
  • Eddy58Eddy58 Membre
    23:29 modifié #4
    Ok Favouille, en effet je comprend mieux ton cas, ça doit etre possible à  faire, mais je pense qu'il faudrait lancer ta barre de progression dans un thread a part, et trouver un moyen de trouver la taille des données lues dans le fichier par rapport à  la taille totale du fichier pour pouvoir régler le pourcentage de la barre... :)
  • fouffouf Membre
    23:29 modifié #5
    Pour lancer le thread avec un indicateur de progression, il y a
    [aProgressIndicator setUseThreadedAnimation:YES]

    Je ne sais pas si c'est ce que tu cherche.
  • VeillardVeillard Membre
    23:29 modifié #6
    OK merci, je vais voir ce que ça donne...
  • odjauodjau Membre
    23:29 modifié #7
    Pour pouvoir faire un progressBar avec des valeur cohérente il faut charger le fichier par paquet. Pour charger le fichier, est-ce qu'il faudrait pas regarder du coté de NSStream et NSStreamImput ?  :o

    J'ai pas de Mac sous la main, alors ces une idée comme ça...
  • VeillardVeillard Membre
    23:29 modifié #8
    Je crois que "NSInputStream" semble être une voie intéressante avec des trucs du style :
    - (id)initWithFileAtPath:(NSString *)path
    


    J'ai essayé la solution de Fouf, mais le compilo ne reconnaà®t pas "setUseThreadedAnimation"  ???
  • fouffouf Membre
    23:29 modifié #9
    dans 1108573820:

    Je crois que "NSInputStream" semble être une voie intéressante avec des trucs du style :
    - (id)initWithFileAtPath:(NSString *)path
    


    J'ai essayé la solution de Fouf, mais le compilo ne reconnaà®t pas "setUseThreadedAnimation"  ???


    Merde, j'ai fais une typo : c'est setUsesThreadedAnimation:
    La c'est sur, j'ai fais un copier-coller.

    :o :o :o
  • VeillardVeillard Membre
    23:29 modifié #10
    OK, j'ai la doc !
    Par contre ça risque de ne pas être cool en termes de vitesse...  :-\\
    If the application becomes multithreaded as a result of an invocation of this method, the application's performance could become noticeably slower.
  • fouffouf Membre
    23:29 modifié #11
    Qu'est ce que tu veux que je te dise ??  :-)

    Qui ne veux rien n'a rien. CQFD  ;D
  • VeillardVeillard Membre
    23:29 modifié #12
    Non, simplement il faut savoir si le jeu en vaut la chandelle... Pour une appli comme la mienne, ça ne va pas changer grand chose sur la vitesse. Je vais voir quand-même.
  • Eddy58Eddy58 Membre
    23:29 modifié #13
    Le problème le plus délicat est celui d'obtenir un ratio données chargées/données totales....pour des temps de 2 ou 3 secondes, ne serait-il pas plus simple de mettre un progress indicator de type Indeterminate ?  ???
  • VeillardVeillard Membre
    23:29 modifié #14
    Dans un premier temps je peux faire ça. Reste maintenant comment faire apparaà®tre et disparaà®tre ma fenêtre contenant le progress indicator.  ???
  • VeillardVeillard Membre
    23:29 modifié #15
    En revanche, comment peut-on envoyer le signal d'affichage de la fenêtre contenant la barre après avoir fait un "openDocument:" puis comment envoyer le signal de fin (dès que le fichier est chargé).


    J'ai toujours pas trouvé  :'(
    Quelqu'un a une petite idée ?  :why?:
  • ClicCoolClicCool Membre
    23:29 modifié #16
    dans 1109494235:

    En revanche, comment peut-on envoyer le signal d'affichage de la fenêtre contenant la barre après avoir fait un "openDocument:" puis comment envoyer le signal de fin (dès que le fichier est chargé).


    J'ai toujours pas trouvé  :'(
    Quelqu'un a une petite idée ?  :why?:


    Salut Favouille )

    C'est la progression de ton "parsing" des datas contenues dans un fichier que tu veux visualiser ?

    Tu peux pas tout simplement appeler l'affichage de ta barre en entrant dans ta méthode loadDataRepresentation et en la quitter à  la fin de cette méthode ?

    Je sens que c'est pas tout à  fait ce qui te bloque, tu peux préciser ta question ?

    P.S. Et si tu veux être compatible windows n'oublies pas de également de prévoir de figer la barre de progression et toute l'appli avant la fin de ta méthode, si possible en imposant un redémarrage complêt de la machine  ;D :P
  • VeillardVeillard Membre
    23:29 modifié #17
    Salut ClicCool  ;)

    L'idéal serait de faire apparaà®tre une fenêtre avec une barre de progression indiquant l'avancée de chargement du fichier. Ce serait mieux que la roue chromatique...

    Tu peux pas tout simplement appeler l'affichage de ta barre en entrant dans ta méthode loadDataRepresentation et en la quitter à  la fin de cette méthode ?

    Comment on fait ???

    P.S. Et si tu veux être compatible windows n'oublies pas de également de prévoir de figer la barre de progression et toute l'appli avant la fin de ta méthode, si possible en imposant un redémarrage complêt de la machine

    Désolé, c'est plus dur sur Mac  :)beta:
  • ClicCoolClicCool Membre
    23:29 modifié #18
    dans 1109516735:

    Comment on fait ???


    bein tu peux tout simplement créer ta fenêtre sous I.B. avec sa barre de progression et un outlet sur la fenêntre et sur la barre.

    - En entrant dans ta méthode loadDataRepresentation tu commence par un:
    [maFenetreProgress orderFront:self];
    ou
    [maFenetreProgress makeKeyAndOrderFront:self];
    si tu veux que ta fenêtre puisse recevoir des actions de l'utilisateur (annulation ...)

    - puis t'adresse à  la barre tous les messages que tu veux pour la mettre à  jour au fur et à  mesure.

    - puis en fin de méthode, si t'as rien planté, tu envoies un:
    [maFenetreProgress orderBack:self]
  • VeillardVeillard Membre
    23:29 modifié #19
    OK merci ClicCool, je cherche toujours à  me compliquer la vie... ???
  • ClicCoolClicCool Membre
    23:29 modifié #20
    Et tiens nous au courant Favouille :)
  • VeillardVeillard Membre
    23:29 modifié #21
    Bon, je viens d'eaasyer et ça na marche pas...

    - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType<br />{<br />&nbsp; &nbsp; [loadingWindow orderFront:self];<br /><br />&nbsp; &nbsp; [_carnet release];<br />&nbsp; &nbsp; _carnet =[NSUnarchiver unarchiveObjectWithData:data];<br /><br />&nbsp; &nbsp; if( _carnet == nil)<br />&nbsp; &nbsp; &nbsp; &nbsp; if([self importFromVersion20: data] == FALSE)&nbsp;  // format XML<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;Format non reconnu&quot;);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return NO;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; [_carnet retain];<br />	<br />&nbsp; &nbsp; [loadingWindow orderBack:self];<br /><br />&nbsp; &nbsp; [self updateUI:nil];<br />&nbsp; &nbsp; return YES;<br />}<br />
    


    Que faire ?
  • ClicCoolClicCool Membre
    23:29 modifié #22
    Salut Favouille,

    Qu'est-ce donc qui marche pas ?
    Ta fenêtre n'apparaà®t pas ?
  • VeillardVeillard Membre
    23:29 modifié #23
    Oui...
    J'ai utilisé "[loadingWindow orderFront:self]" dans d'autres méthodes et ça marche...
  • ClicCoolClicCool Membre
    23:29 modifié #24
    Oups excuses moi Favouille j'ai manqué de préscision,

    N'aurais tu pas mis ta fenêtre de progression dans le nid du document au lieu du main.nib?

    En fait ton nib du document n'est pas encore chargé à  ce moment là  et ce genre de fenêtre de progression et d'alerte n'a pas vocation à  exister en autant d'exemplaire que de document.

    Si c'est là  ton erreur alors mets donc tout ça dans le main.nib.

    Eventuellement crée et instancie un délégate de ton appli dans le main.nib pour recevoir les outlets.
    dans loadDataRepresentation t'as "plus qu'à " écrire les choses de cette façon par exemple:
    [[NSApp delegate] showFenetre];<br />.../...
    


    Bien sur après avoir implémenté dans ton AppDelegate les méthodes showFenetre advanceProgress hideFenetre ... tout ce dont t'as besoin quoi.

  • VeillardVeillard Membre
    février 2005 modifié #25
    Si c'est là  ton erreur alors mets donc tout ça dans le main.nib.


    OK, j'ai corrigé.

    Eventuellement crée et instancie un délégate de ton appli dans le main.nib pour recevoir les outlets.


    C'est bon !

    Bien sur après avoir implémenté dans ton AppDelegate les méthodes showFenetre...[quote/]

    dans loadDataRepresentation t'as "plus qu'à " écrire les choses de cette façon par exemple:
    Code:
    [[NSApp delegate] showFenetre];
    .../...


    C'est là  que ça coince. Dans mon AppDelegate, j'ai implémenté :
    - (void)showLoadingWindow<br />{<br />&nbsp; &nbsp; [loadingWindow orderFront:self];<br />}<br />
    


    et forcément dans "Carnet.m" (mon NSDocument), le compilo ne reconnaà®t pas
    - (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)aType<br />{<br />	[[NSApp delegate] showLoadingWindow];&nbsp; &lt;- ceci<br />...
    


    Désolé pour le temps de réponse, j'ai dépassé mon forfait 50 h !  :'(
  • ClicCoolClicCool Membre
    23:29 modifié #26
    C'est pas grave que le compilo sache pas, ça devrait marcher quand même.

    Mais bon, t'as qu'a importer le header de ton AppController
    et typer, comme AppDelegate, l'objet auquel t'adresses ton showLoadingWindow.
    Tu fais alors l'appel en 2 lignes

    AppCtrl* monController = [NSApp delegate];<br />[monController showLoadingWindow];
    
  • VeillardVeillard Membre
    23:29 modifié #27
    Merci ClicCool, ça marche  :brule:
    Il ne me reste plus qu'à  chercher comment animer cettre progressBar...
Connectez-vous ou Inscrivez-vous pour répondre.