Affichage en cours de calcul
GG
Membre
Bonjour à tous,
je cherche à faire une vue qui permet d'afficher des vignettes d'image en cours de lecture (en gros comme l'application phoenix http://blyt.net/phxslides/).
Savez vous comment je peux procéder ?
Car tous les essais que j'ai fais, stockent tout en mémoire et affiche une fois fini.
Jerome
je cherche à faire une vue qui permet d'afficher des vignettes d'image en cours de lecture (en gros comme l'application phoenix http://blyt.net/phxslides/).
Savez vous comment je peux procéder ?
Car tous les essais que j'ai fais, stockent tout en mémoire et affiche une fois fini.
Jerome
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
ou plus compliqué un thread par création de vignette comprenant l'affichage
C'est assez simple à mettre en oeuvre:
En mettant, un test sur un BOOL dans la boucle de traitement on peut très facilement stopper le chargement des vignettes si on change par exemple de répertoire en cours de route. On a donc moyen de faire une appli beaucoup plus réactive pour l'utilisateur. D'où l'intérêt des threads pour toutes les tâches de chargement en arrière plan.
Rhâââ, bouh !! Surtout pas !
On ne fait pas exécuter de longs calculs par le thread principal et surtout en faisant rafraà®chir de cette manière !
On crée un thread dédié pour le calcul, et dans ce thread on fait rafraà®chir par le thread principal avec ça :
Dois je lancer un thread pour chaque vignette donc le calcul est le suivant :
- chargement de l'image (NSimage)
- modification pour la mettre en vignette par copie
- release de la première image.
- ajout de ce NSImage à une NSImageCell
- ajout de cet NSImageCell à une NSMatrix (d'ailleurs comment dois je faire pour la rattacher à ma vue ? ).
Le rafraichissement s'effectue comment de cet manière ?
Ca dépend... Si tu veux que les vignettes soient traitées en parallèle oui, il faut un thread pour chacune ; si les traiter l'une après l'autre suffit, un seul thread suffit.
Le rafraà®chissement s'effectue en appelant une méthode de rafraà®chissement via "performSelectorOnMainThread"
Tu utilises quoi comme méthode de rafraichissement avec performSelectorOnMainThread ?
Non, il faut juste interagir avec l'interface via "performSelectorOnMainThread"
Ben juste des appels à des méthodes qui font ce qu'il faut...
Toujours "setNeedsDisplay" Et même souvent "setNeedsDisplayInRect"...
Comme a c'est l'application qui choisit quand il est adéquat de la dessiner.
setNeedsDisplay: n'est pas totalement thread-safe selon la doc Apple (lire ici).
Il y est clairement mentionné qu'il faut faire exécuter cette méthode dans le thread principal, comme expliqué par Schlum.
.
Il existe une methode peu connue (enfin, moi je l'ai découverte récemment) :
performSelectorOnMainThread
C'est toujours bon à rappeler
+
Chacha
Et il vaut mieux la connaà®tre si on veut gérer une interface graphique via des threads !
Ah ben oui... désolé j'avais pas lu ce qui précède, j'ai juste réagi au dernier post.
je suis toujours bloqué sur ce problème.
Rien à faire, je n'arrive pas à afficher les images en cours de chargement.
En gros l'algo est :
- je récupère les paths des images dans mon controller.
- je passe à ma classe nsmatrix cet array contenant les paths.
- ma nsmatrix récupère la nsimagecell courante
- chargement de l'image dans nsimagecell, puis à la fin
Oû setNeedsDisplayThreaded est
Puis on continue sur l'image suivante.
Ou est le problème ?
Le but c'était pas de lancer le chargement des images dans des threads à part ?
Tu lances bien un thread quand même ?
dans cette fonction loadImageIntoOYAMatrixThreaded, je gère le nombre de vignettes en fonction du NSRect de la matrice (NSMatrix)
et matrixRect.size.width me retourne 0 alors que juste avant elle vaut 700.
Comment est ce possible que dans le thread, les informations de la matrice soit perdues ?
En gros j'ai perdu le pointeur de la classe principale NSMatrix.
En gros, le self dans detachNewThreadSelector possède la même adresse que dans la fonction display... mais sa frame par exemple contient des valeurs nulles ou négatives (height et width).
Comment régler ce problème.
Comment peut on régler ce problème ?
PS : attention à ne pas oublier [NSThread exit]; à la fin de ta fonction !
La j'ai pas trop le temps de regarder en détail, et ça va pas s'arranger ; je pourrai regarder plus précisément Lundi
Bon weekend.