realbasic-nug.fr
[Top] [All Lists]

Re: Evénements, shell ou socket, asynchrone... (+ Refresh !)

To: REALbasic NUG French <realbasic-nug dot fr at lists dot realsoftware dot com>
Subject: Re: Evénements, shell ou socket, asynchrone... (+ Refresh !)
From: Powel <powel at mac dot com>
Date: Sun, 8 Jul 2007 18:19:17 +0200
Delivered-to: listarchive at realsoftware dot com
Delivered-to: realbasic-nug dot fr at lists dot realsoftware dot com
References: <B415C407-21EB-4569-A078-6D15A7A6BDBD at mac dot com> <CA46FC9A-9C5D-4125-91D4-13EF6F4EECE6 at marine-label dot com>
Merci.

C'est en effet la seule solution que j'ai trouvée et elle s'avère être intéressante.

Afin d'éviter la destruction du Shell à la fin de l'exécution du programme principal (alors que le Shell n'a pas terminé son activitée), j'utilise :
        While myShell.isrunning
                myShell.Poll
        Wend


Cela marche très bien. Mais cela ne résout pas vraiment mon problème...

En fait, je charge des pages web avec Curl par le Shell (même principe que les sockets mais plus rapide et plus fiable). Mon problème est le suivant : je souhaite charger différentes url en parallèle, sans attendre que chaque page soit chargée et afficher les résultats progressivement (à chaque fois qu'une page est chargée).

Pour cela, j'ai d'abord utilisé un thread, mais cela ne marche pas avec les Shell (tout du moins, il n'y a aucun affichage tant que tout n'est pas terminé).

J'ai donc créé une classe héritée du Shell afin d'utiliser le mode 1 (asynchrone) que j'appelle depuis un Thread. Et là, cela fonctionne mieux, mais seulement pour quelques pages. Si je lance réellement mon programme, qui ne charge pourtant qu'une centaine de pages et n'en affiche que 2000 lignes dans une listebox, les données s'affichent après une très longue attente, une fois que la majeure partie des chargements est terminé. J'ai essayé avec Refresh dans le Thread et dans un Timer. Cela ne marche pas !

Je ne vois donc pas de solution :
- J'utilise un Mac Pro avec 4Go de Ram
- Une connexion à très haut débit (j'utilise un procédé semblable en Ajax/PHP et cela marche sans problème sur la même config). - Le processeur, RB et Curl sont à peine sollicités (cf. moniteur d'activité).

J'en déduis que RB décide de lui-même s'il est judicieux ou non d'afficher les résultats ? Comment contourner cela, je croyais que Refresh était précisément destiné à cela. Je suis assez déçu, car une des raisons qui m'ont fait passer de PHP/ Ajax à RB est justement d'avoir un meilleur contrôle de l'affichage en s'affranchissant du navigateur et en pouvant communiquer plus directement avec l'interface. Dans ce cas, j'ai perdu trois jours de travail pour un résultat nettement moins bien que ce que j'avais en PHP. J'en déduis qu'il doit y avoir un point qui m'échappe.

Powel




Le 8 juil. 07 à 15:12, frael a écrit :


Tu ajoutes dans ton projet une classe dérivée de socket, et c'est elle que tu instancies
Tu pourras alors accéder à tout ce qui va bien...

Marc

Le 7 juil. 07 à 19:17, Powel a écrit :

Bonjour,

Comment fait-on pour accéder aux événements d'un shell ou d'un Socket que l'on a instancié dans le code ? En effet, le mode asynchrone suppose d'utiliser l'événement DataAvaillable.

Powel




<Prev in Thread] Current Thread [Next in Thread>