Annulation de Thread...
Bonjour,
Voilà , je cherche à annuler un thread en cours d'execution.
Je m'explique :
Mon application possède un tableau. Selon la selection dans ce tableau, on obtient des informations affichées dans des textFields. (iFreete pour ceux qui connaissent).
Lorsque la selection d'une ligne change (donc tableViewSelectionDidChange), j'envoi une méthode qui complète les champs selon l'objet sélectionné.
Dans cette méthode, je crée un nouveau Thread qui a pour but de récupérer un texte situé sur le net (initWithContentsOfURL:encoding:error:)
Malheureusement, lorsque je change la selection de la tableView très rapidement et plusieurs fois de suite et que je m'arrête au bout d'un moment, on voit le textField (celui du thread qui récupère le texte sur le net), qui change son contenu ... jusqu'à l'objet sélectionné.
J'aimerai donc pouvoir arrêter un thread en cours. j'ai déjà essayé [NSThread exit]; qui, d'après ce que j'ai compris, stoppe le thread en cours d'execution... Mais l'application plante.
Voilà je suis un peu perdu... :why?:
Voilà , je cherche à annuler un thread en cours d'execution.
Je m'explique :
Mon application possède un tableau. Selon la selection dans ce tableau, on obtient des informations affichées dans des textFields. (iFreete pour ceux qui connaissent).
Lorsque la selection d'une ligne change (donc tableViewSelectionDidChange), j'envoi une méthode qui complète les champs selon l'objet sélectionné.
Dans cette méthode, je crée un nouveau Thread qui a pour but de récupérer un texte situé sur le net (initWithContentsOfURL:encoding:error:)
Malheureusement, lorsque je change la selection de la tableView très rapidement et plusieurs fois de suite et que je m'arrête au bout d'un moment, on voit le textField (celui du thread qui récupère le texte sur le net), qui change son contenu ... jusqu'à l'objet sélectionné.
J'aimerai donc pouvoir arrêter un thread en cours. j'ai déjà essayé [NSThread exit]; qui, d'après ce que j'ai compris, stoppe le thread en cours d'execution... Mais l'application plante.
Voilà je suis un peu perdu... :why?:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Voilà , sinon deux ou trois autres commentaires à lire dans le code ci-dessous sur des choses qui ne me plaisent pas. Avec tout ça, ça devrait déjà aller mieux je pense...;)
A rajouter dans l'interfaçage :
[tt]
NSLock *showUserMarkLock;
[/tt]
Sinon, avec le locking, tes threads en veille vont prendre le lock chacun leur tour, et leur exit se fera tout simplement à la fin de ta méthode showUserMarck. Je trouve pas ça plus mal...
thread = YES au début de la méthode showUserMark: et deviens NO à la fin de la méthode.
Comme le chargement dure quand même quelques secondes, j'ai testé la condition, elle marche bien hein... sauf que quand il prend exit dans la gueule, mon application plante...
J'ai aussi une autre méthode, qui récupère une icone. Là c'est pareil, si je fais rien et que je laisse mon thread faire, il suffit de changer la sélection et là on verra les icônes défiler jusqu'à la dernière correspondante à l'item sélectionné dans la table.
A mon avis, cette ligne ne sert à rien puisque le tread n'est plus actif.
je désactive le thread pour le réactiver depuis le début
Comment veux tu que la ligne en dessous puisse s'exécuter ? :fouf):
Il a raison sur la thériro. Il veut arrêter le thread puis lancer un NOUVEAU thread. Mais actuellement je pense qu'il fait un exit sur le thread principal au mieux.
Il y a un gros problème de conception. Tu ne peux pas arrêter un thread comme ça. Déjà que devient l'autorelease pool du thread dans ce cas ? : fuite de mémoire.
C'est le thread lui même qui doit savoir quand s'arrêter et reprendre un autre téléchargement, déjà dans ce cas il n'y aurait qu'un thread lancé et non plein de threads lancées/stoppés. Ca sous entend que le thread n'a pas de fonction bloquante mais est dans l'attente de la fin du chargement en cours, d'un eventuel arrêt ou un changement des données à chargée.
Je verrais bien un file d'attente avec tous les éléments à charger, car pourquoi les chargers en partie alors qu'il pourront être redemandés par la suite. Tu charges tout ce que l'utilisateur demande et le garder en mémoire.
Tu ajoutes dans un tableau les éléments que l'utilisateur veut charger et charge dans le thread tous ces éléments. Le tableau est commun au thread principal et secondaire. Pour un bonne réactivité charge le dernier élément dès que le chargement en cours est terminé, de cette facon les éléments demandés avant le dernier chargement seront chargé après celui-ci (en fond).
Bon si c'est pas possible, tant pis. c'est juste chiant pour les petites connexions (56K ) Mais avec le cache (notemment pour ce qui est de l'image à récupérer en ligne) c'est super. Et comme le NSString est vraiment léger (moins d'1Ko), c'est pas vraiment long.
J'ai juste posé cette question histoire de savoir s'il y avait moyen d'améliorer mon application, mais si je fais que la pourrir...
Merci,
Louka
Les notes changent ok, mais je parlais d'un cache mémoire le temps que fonctionne ton applicaion. Ce n'est pas grave si la note varie de 0.1 et que l'utilisateur qui n'as pas relancé l'application ne la voit pas. Si ça varie de beaucoup c'est que tu n'as pas beaucoup de votes ce qui est un autre problème.
Il vaut mieux que ton problème soit un peu lent sur un 56K (de toutes facon tout est lent pour eux) une bonne fois pour toute (au démarrage) que d'avoir un programme qui plante ou s'enmelle dans ses threads.
Note aux démonteurs de forum, serait-il possible de réduire en deux la ligne qui défonce tout ? (Je suis sous Camino qui ne s'en sort pas)