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

Re: ProgressBar

To: REALbasic NUG French <realbasic-nug dot fr at lists dot realsoftware dot com>
Subject: Re: ProgressBar
From: Arnaud Nicolet <arnaud at tribu dot ch>
Date: Mon, 22 Jan 2007 16:48:01 +0100
Delivered-to: listarchive at realsoftware dot com
Delivered-to: realbasic-nug dot fr at lists dot realsoftware dot com
References: <FA8559B7-CD58-42A0-9263-354F673206C4 at mac dot com> <5CBC8E68-6629-4BD2-A947-404B869791EE at albireo dot biz> <0C111400-12FB-4C15-A6ED-999C2F487C3E at realsoftware dot fr> <4B9AD5A4-7887-4AB3-87B0-EB6680329836 at albireo dot biz> <478ACC93-EC1C-4FFB-AB30-0E726888792D at mac dot com> <0A07A8CA-19DF-412C-868F-15B9511298BC at albireo dot biz> <F129875E-4164-4DA5-AF2B-DCA4AE83E5EE at beaude dot net> <79B4AFFD-743A-4841-B89A-66A8393AB81A at albireo dot biz> <69CFF131-88BE-495D-BA25-DD419CBA07E8 at beaude dot net> <358ED573-57E2-43A9-8C07-E23B8E248CF7 at albireo dot biz> <588DEDFF-4825-4649-A756-F521A70128C6 at tribu dot ch> <897D631B-D8D0-45FA-BF2A-EE416F89EF4E at briq dot com> <218BD5B8-3C7E-4DA4-8437-BA3575614320 at tribu dot ch> <8646C2A5-78AF-4B1D-BEDC-222B57213F2C at beaude dot net> <BD1ADDD1-99BB-49D9-B3A5-F33A40F38A48 at tribu dot ch> <D981CB07-771E-4453-A92A-2A4C07942ECD at beaude dot net>
Pour éviter tous les doublons, les tableaux ne sont effectivement pas les meilleurs "objets" à utiliser (il faudrait faire une boucle dans une autre et comparer chaque élément distinct, ce qui serait lent, particulièrement en Realbasic (comme beaucoup de langages du genre)).
Je vous conseille les "Dictionary".
Un "Dictionary", c'est un objet. Il est constitué d'un tableau de clés. Chaque clé possède une valeur. Les clés et les valeurs sont de type "variant". Cependant, il ne peut pas y avoir plus d'une clé identique (je vais expliquer):

Par exemple, on créé un nouvel objet:

MyDictionary As Dictionary 'Ça doit généralement être une propriété de la fenêtre pour être efficace.

MyDictionary=new Dictionary

MyDictionary.Value(2)=True '2, c'est la clé; True, c'est la valeur. Comme la valeur n'est pas utile (on n'a besoin que d'une dimension), on met simplement une valeur.
MyDictionary.Value(5)=False 'Juste pour l'exemple; voir après
MyDictionary.Value(7)=True
MyDictionary.Value(5)=True

if MyDictionary.HasKey(7)=False then 'Est-ce que la clé 7 existe déjà dans l'objet? Si non:
MyDictionary.Value(7)=False
end if

If MyDictionary.Value(5)=True then
MsgBox "Le premier est vrai."
end if
if MyDictionary.Value(7)=True then
MsgBox "Le deuxième est vrai."
end if

Vous obtenez les deux messages, parce que:
Pour la clé 5, la valeur "False" a été remplacée par la valeur "True" (puisqu'il n'y a pas de doublons). Pour la clé 7, la fonction HasKey(7) ayant renvoyé "True", la ligne "MyDictionary.Value(7)=false" n'a pas été exécutée.

Attention cependant: n'essayez pas de mettre "If MyDictionary.Value (24)=true then" si la clé 24 n'existe pas. Vous obtenez une exception de type KeyNotFoundException.

Que de changements, hein?

Le 22 janv. 07 à 10:30 Matin, Boris (Com) a écrit:

Alors là, c'est mon cadeau du matin.
Exactement ce qu'il me manquait. Et du coup, j'ai l'impression que ce RealBasic est vraiment très puissant pour l'investissement nécessaire. Je fais surtout du développement Web, mais certains traitements nécessitent trop de calcul pour être adaptés à une interface Web, même en Ajax. J'ai besoin d'avoir des informations sur l'état du traitement en cours, certain pouvant durer une heure. Là, en une semaine, j'ai pratiquement atteint le niveau pour migrer ces fonctionnalités en RealBasic et ce, dans une interface assez convaincante.

Je ne peux m'empêcher de solliciter votre expertise encore une fois. Mon nouveau "problème" est le suivant. J'ai remarqué qu'il n'y a pas de fonction pour enlever tout les doublons d'un tableau à la différence d'autres langages plus courants. Or, cette fonction est importante pour moi. Je dois donc créer une fonction ou une classe si j'en profite pour créer aussi d'autres fonctions (méthodes) associées aux tableaux.
Quel est le meilleur moyen de le faire et comment ?
J'ai essayé de créer une fonction au sein d'un script et RealBasic m'indiquait erreur de syntaxe alors que je suis convaincu qu'il n'y en avait pas. Je n'ai pas du m'y prendre convenablement. Il faut probablement les créer comme les threads. Désolé pour cette question stupide, mais jusqu'à présent, j'étais un peu un puriste du code et je n'utilisais pas d'interface. J'ai même abandonné DreamWeaver depuis longtemps. Je travaille par ailleurs avec TextMate qui est un petit bijou. Mais la logique n'est pas la même. On crée toute l'architecture. La méthode de RealBasic me plaît, car elle est assez cohérente, mais l'organisation des scripts est sensiblement différente. En autre dans la déclaration des méthodes.

Alors à l'occasion, si vous pouvez me donner un coup de pouce...

:-)




Le 21 janv. 07 à 22:26, Arnaud Nicolet a écrit :

Tant que j'y suis, est-ce que je peux envoyer des variables au thread, comme pour une méthode de class?

Je suppose que vous parlez d'ajouter une nouvelle méthode au thread.

Pour cela, rien de moins compliqué:

Vous ajoutez une méthode normale à ce thread. Ensuite, comme vous avez une référence au thread dans votre fenêtre, vous pouvez tout simplement écrire, en reprenant l'exemple précédent:
Thread1.MyMethod Parameter1,Parameter2

Voilà. Je porte encore votre attention sur un fait:
Vous avez une fenêtre qui a une référence à un "thread". Dans ce "thread", vous avez une référence à votre fenêtre. C'est ce qu'on appelle une référence circulaire. Le petit problème en Realbasic, c'est qu'un objet est enlevé de la mémoire quand le compte de ses références atteint 0 (autrement dit, quand plus aucun autre objet ne s'en "souvient"). Dans ce cas de figure, alors même que la fenêtre est fermée ou que le "thread" a terminé, les deux objets restent en mémoire (vous perdez alors de la mémoire disponible). Donc, pour résoudre cela, je vous suggère de mettre l'une ou l'autre référence à nil avant que la fenêtre ne soit réellement fermée (ou quand vous n'en avez plus besoin), ou les deux, du genre:
Thread1.MyWindow=nil
Thread1=nil

Merci encore :-)

Ça me fait plaisir

Le 21 janv. 07 à 20:09 Soir, Boris (Com) a écrit:

Excellent le Thread. C'est effectivement plus efficace. Personnellement, je n'ai pas peur de ce genre de truc. Je viens du PHP mais j'y ai un très bon niveau et j'utilise essentiellement des classes dans mes programmes. PHP 5 est extrêmement puissant et riche en fonctionnalités ! Mais c'est visiblement moins rapide que RealBasic. Il me reste un jour pour tester. C'est difficile car je n'ai pas eu le temps de totalement me convaincre de "lâcher " 500 euros. Il y a très peu de documentation sur RealBasic et je trouve les fonctions liées aux tableaux (Array) extrêmement limitées. Sinon, globalement, c'est vraiment intéressant comme plate-forme de développement.

Tant que j'y suis, est-ce que je peux envoyer des variables au thread, comme pour une méthode de class ?

Merci encore :-)

Le 21 janv. 07 à 19:58, Arnaud Nicolet a écrit :

Pour créer un Thread:

1: Créez une nouvelle classe dans le projet.
2: Dans les propriétés de cette nouvelle classe, inscrivez "Thread" dans le champ "Super". Nommez-la comme bon vous semble (exemple: MyWonderfulThread). Voilà, le nouveau Thread a été crée. Maintenant, il faut lui faire exécuter du code.

3: Double-cliquez sur cette classe et allez dans les événements (events) de celle-ci, dans l'événement "Run".
4: Déplacez le code à effectuer dans cet événement.
5: Si vous avez besoin de vous référer à quelque chose de la fenêtre où se trouvait le code avant, ajoutez une référence à la fenêtre dans le Thread (par exemple, "MyWindow As Win1"). Il faudra se référer à cette propriété pour accéder à la fenêtre en question (ne pas oublier de définir la variable à l'instance de la fenêtre). 6: Définissez une propriété destinée à se rappeler du "Thread" (par exemple, dans la fenêtre affichée). Exemple: "Thread1 As MyWonderfulThread".
7: Inscrivez ce code à l'endroit qui vous paraît justifié:

Thread1=New MyWonderfulThread
Thread1.MyWindow=self
Thread1.Run

8: ça devrait fonctionner. Sinon, j'attends de vos nouvelles.

Bonne chance.

Le 18 janv. 07 à 17:26 Soir, Francis Gorge a écrit:

Serait-il possible d'avoir un exemple de création de Thread ?
Le rafraichissement d'une progressbar serait pour moi très utile !
J'aimerai afficher correctement (mettre à jour) ma progressbar pendant que mon application est occupé à copier ou déplacer des fichiers et à compressér des fichiers vidéos.

Merci

Francis


Le 18 janv. 07 à 16:15, Arnaud Nicolet a écrit :

Le 18 janv. 07 à 12:32 Soir, Michel LO a écrit:

Il y a plus efficace :

crée un timer que vous lancez au début de traitement (multiple c'est à dire qui n'arrête pas de tourner) et qui se déclenche toutes les secondes.
Dans le timer, faire un refresh

A la fin du traitement arrêter le timer.

Comme ca, il ne se met à jour qu'une fois par seconde indépendamment de la longueur du traitement.

Pas tout-à-fait. Le "Timer" ne va pas s'exécuter plus que le rafraîchissement de la fenêtre (en d'autres termes: si le rafraîchissement est bloqué pas une boucle exécutée ailleurs, alors le "Timer" aussi, il ne va être exécuté qu'à la fin).

Ce que l'on conseille, en général, c'est de déplacer le code dans un fil d'exécution ("thread" si vous préférez). Pour créer un fil d'exécution, il faut créer une nouvelle classe. Usuellement, une application fonctionne sur le fil d'exécution principal (c'est pour cela que le rafraîchissement ne peut se faire en même temps qu'autre chose). En créant un nouveau fil d'exécution, on fait les choses en "parallèle", c'est comme du multitâche, mais dans la même application.












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