[Résolu]Transfert d'image impossible au delà  d'une petite taille

mybofymybofy Membre
février 2014 modifié dans API AppKit #1
Bonjour

Mavericks - Xcode 5

serveur PostgreSQL PG

application Herbier en cours de développement.

 

Herbier doit transférer une image vers PG (parmi bien d'autres choses).

L'image est récupérée dans une MYImageView par dragging : OK.

La NSImage associée est convertie en NSData : OK.

La NSData est transformée en "character varying" de PG pour l'insérer dans une requête SQL,via un Framework : OK (structure vérifiée et correcte).

 

Transfert image img0 (20ko) : OK.

 

Transfert image img1 (1Mo) : Herbier ne répond pas !

    - la plante se produit autour de 1,4Mo (valeur aléatoire) 

    - il y a toujours des données envoyées (cf. moniteur d'activité), indéfiniment après la plante...

 

Transfert de img1 vers PG via FTP : OK.

 

Des pistes ?

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur

    timeout ?


  • La piste est intéressante.


     


    Dans la configuration de PG il y a un statement_timeout.


    Mis à  0, cela n'a rien changé.


     


    Ailleurs que danq PG, je ne vois pas où il pourrait y avoir un timeout ?

  • Je commence à  comprendre.


     


    Dans moniteur d'activité, le message "Herbier ne répond pas" ne signifie pas que Herbier est planté, mais qu'il est en attente de la fin de l'opération de transfert.


     


    Pour voir, j'ai laissé tourner : pour transférer une photo de 7Mo, il m'a fallu près de vingt minutes. Et Herbier est redevenu opérationnel.


     


    Pour transférer cette photo, il faut 65 secondes avec Filezzilla, qui est normal avec mon débit montant.


     


    Le problème est qu'avec les conversions, ce n'est pas 7Mo qui sont transférés mais 120Mo (dixit moniteur d'activité), pour une photo qui occupe 60Mo dans PG.


     


    Il faut que je travaille tout cela, sinon je peux mettre mon projet à  la corbeille.


     


    La simple mention de timeout m'a mis sur la voie.


     


    Merci


     


     


     


  • CéroceCéroce Membre, Modérateur


     


    Dans moniteur d'activité, le message "Herbier ne répond pas" ne signifie pas que Herbier est planté, mais qu'il est en attente de la fin de l'opération de transfert.




    Tu veux dire que tu lances la requête réseau sur le thread principal ?!


    Vas vite voir la doc de NSURLConnection et voir comment on lance des requêtes asynchrones.



  • Tu veux dire que tu lances la requête réseau sur le thread principal ?!


    Vas vite voir la doc de NSURLConnection et voir comment on lance des requêtes asynchrones.




     


    Oui.


     


    Je suis allé voir NSURLConnection.


    Problème : j'utilise un Framework, qui masque les requêtes réseau.


     


    Il y a bien NSThread.


    Est-ce que je peux faire quelque chose comme ça :


    - créer un thread qui appelle une fonction via un selector


    - lancer le thread par un start


    - faire une boucle sur isFinished ou mettre dans ma fonction une notification de fin ou installer un sheet...


    - pendant ce temps là  je peux faire autre chose selon l'option choisie : lister des données dans l'application ou aller prendre un café


     


    ça serait sans doute mieux. Mais j'hésite à  le faire car je n'y ai jamais touché et j'ai peur d'introduire des effets parasites nocifs, insoupçonnés et invisibles : j'ai déjà  assez de mal avec le thread principal ...

  • CéroceCéroce Membre, Modérateur

    C'est quoi ton framework ?


    Parce qu'effectivement, créer un thread secondaire n'est pas forcément simple.


     


    Même si tu dois créer un thread secondaire, n'utilise pas NSThread. Préfère NSOperation ou Grand Central Dispatch. Nous en avaons parlé à  maintes reprises.


  • PGSQLKit http://www.druware.com/pgsqlkit/


     


    C'est le seul framework qui me donne satisfaction pour gérer ma base de données PostgreSQL distante.


    Dedans, il y a bien une fonction connectAsync, mais je ne réussis même pas à  établir la connexion.


    La documentation est très succincte.


     


    Je crois que je vais abandonner l'asynchrone, au moins pour l'instant. Ce n'est guère critique pour moi, simplement la petite roue arc-en-ciel est horripilante.


     


     


     


  • Essaye de copier-coller ton code dans ce qui suit.



    id someObject = [self getSomeObject] ;

    dispatch_queue_t newThread = dispatch_queue_create("New thread", NULL) ;

    dispatch_async(newThread, ^ {
    /*
    Ici, tu es sur thread en background.
    Ne mets pas de commandes liées à  l'affichage.
    */
    [self doSomeStuff] ;
    [someObject doSomeStuffOnMyObject] ;

    /*
    Back on the main thread (optionnel)
    */
    dispatch_async(dispatch_get_main_queue(), ^ {
    /*
    Ici, tu retrounes sur le main thread.
    Mets ici tes commandes liées à  l'affichage.
    Ce bloc sera exécuté après le bloc précédent.
    */
    [self doSomeStuffMore] ;
    [someObject doSomeStuffOnMyObjectMore] ;
    }) ;
    }) ;
Connectez-vous ou Inscrivez-vous pour répondre.