Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
J'ai un bout de code qui utilise des EXECUTE IMMEDIATE et autres curseurs, mais je voudrai pouvoir le stopper à tout moment...
Malheureusement, il ne me laisse comme seul choix que d'attendre patiement la fin de l'execution...
Est-il possible d'executer un code dans un processus/Thread ?erBui
Dernière modification par Melke (04-09-2007 06:40:54)
Hors ligne
pourquoi pas ?
ici tu as un exemple de thread
Qu'est ce qui doit dechancher l'arret ?
Hors ligne
un bouton par exemple...
Dernière modification par Melke (03-09-2007 11:36:03)
Hors ligne
Melke a écrit:
un bouton par exemple...
Tu declares un boolean à true et avant ton fetch tu testes la valeur de ce boolean que tu mets a false si tu cliques sur le bouton
Hors ligne
le code que tu viens de me montrer m'inspire...
Hors ligne
Je me demande si c'est vraiment du script de JCZ dont tu a besoin vu que tu parles de EXECUTE IMMEDIATE n'est ce pas plutôt du côté du param. DB ASYNC que tu devrais regarder ? (plus simple pour ce que tu veux faire je pense)
tiré de l'aide PB :
Allows you to perform asynchronous operations on your database in PowerBuilder. In other words, if you have coded a RetrieveRow event for a DataWindow object or report, you can cancel the current database retrieval operation or start another (non-database) operation that does not use the same database connection before the current operation completes. You can also switch to another Windows process while the retrieval takes place.
By default, PowerBuilder operates synchronously.
Async = value
Parameter Description
value A value specifying synchronous or asynchronous operation. Values are:· 0 (Default) Synchronous operation· 1 Asynchronous operation
Hors ligne
en faite, il y a enormément de cursor aussi en plus de mes EXECUTE IMMEDIATE, passer par une thread me permet de stopper à tout moment l'execution de mon bout de code
J'ai regardé au départ se Async = 1, mais je reste bloqué par ems boucle
Hors ligne
bon, j'ai mis en pratique ce qui était dans l'exemple, mais j'ai toujours mon bouton bloqué par l'execution du programme!
Dernière modification par Melke (03-09-2007 14:27:13)
Hors ligne
Melke a écrit:
bon, j'ai mis en pratique ce qui était dans l'exemple, mais j'ai toujours mon bouton bloqué par l'execution du programme!
c'est à dire ?
Hors ligne
c'est bon aaprès des recherchers poussé, j'ai rajouté un Yield() avant chaque test du "ib_isgoing", ce qui me permet d'avoir la main et de pouvoir cliquez sur le bouton pour l'arrêter.
Hors ligne
Bien ...
Si tu veux partager ton code avec nos amis pbdonfeurs n'hesite pas
Hors ligne
attends, je le prépare l'exemple car c'est le code d'un prog du travail...
Dernière modification par Melke (04-09-2007 12:17:52)
Hors ligne
– Créer une « Custom Class » pui les sdeux événements principaux : ue_go() et ue_stop()
- Bien sur un bouton lance l'application par ue_go() et un autre pour l'arreter avec ue_stop()
objetnongraphic.event TRIGGER ue_go()
objetnongraphic.event TRIGGER ue_stop()
// ue_go() va démarrer le processus ou l’enchaînement du processus event ue_go; // flag compteur sur actif ib_isgoing = TRUE // départ dans le process this.EVENT POST ue_inc() end event
// et ue_stop() pour stopper le processus event ue_stop; // flag compteur sur inactif ... ib_isgoing = FAlSE end event
- Maintenant, interressons nous au coeur du problème, vous pouvez créer autant de sous evenement que vous le voulez pour les chainer
event ue_inc; // si compteur actif .... IF ib_isgoing = TRUE THEN // on inc le compteur.. ii_val_compteur++ // relance evt.... // les evt sont post pour permettre // le controle avec des evt TRIGGER this.EVENT POST ue_inc() END IF
- Pratique si cela boucle sur la même fonction, sans réel boucle interne qui bloquerait les ressources... donc petites modifications :
event ue_inc; int li_i FOR li_i = 0 TO 20 Yield() IF ib_isgoing = FALSE THEN MessageBox("Interruption Utilisateur", "L'utilisateur a appuyé sur le bouton stop") RETURN END IF NEXT Yield() IF ib_isgoing = TRUE THEN this.EVENT POST ue_inc() END IF END IF
- Quelques explications :
Description
Yields control to other graphic objects, including objects that are not PowerBuilder objects. Yield checks the message queue and if there are messages in the queue, it pulls them from the queue.
Syntax
Yield ( )
Return value
Boolean. Returns true if it pulls messages from the message queue and false if there are no messages.
Usage
Include Yield within a loop so that other processes can happen. For example, use Yield to allow end users to interrupt a loop. By yielding control, you allow the user time to click on a cancel button in another window. Then code in the loop can check whether a global variable's status has changed. You can also use Yield in a loop in which you are waiting for something to finish so that other processing can take place, in either your or some other application.
Using other applications while retrieving data Although the user cannot do other activities in a PowerBuilder application while retrieving data, you can allow them to use other applications on their system. Put Yield in the RetrieveRow event so that other applications can run during the retrieval.
Of course, Yield will make your PowerBuilder application run slower because processing time will be shared with other applications.
- en d'autres termes, Yield() permet, pendant une boucle par exemple, de donner la main et de pouvoir cliquer sur un bouton toujours par exemple
Dernière modification par Melke (04-09-2007 12:21:23)
Hors ligne
80 pépites pour ce zoli script utilisant le Yield()
Hors ligne
arigatoo gozaimasu ありがとうございます
* me presse de les déposer à la banque
Dernière modification par Melke (04-09-2007 12:34:11)
Hors ligne