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
|