[Résolu][Basic] timer et multithreading avec libreoffice

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

[Résolu][Basic] timer et multithreading avec libreoffice

Message par martinbrait »

Bonjour,

Comment déclencher une macro à un horaire donné ?
Peut on lancer un service soffice.bin / soffice.exe à un horaire donné ?
Comment VRAIMENT séparer les process, faire du multithreading ?
Comment être libre d'insérer pendant l'exécution répétée de la routine,
des appuis touches clavier, ou des clics souris ?
Comment laisser courir une barre de progression, simultanément ?

Bref, je cherche l'équivalent de :
Application.OnTime pour MsOffice
DoEvents 'redonne la main au système d'exploitation
le manuel msdn a écrit :Vous pouvez avoir besoin d'exécuter du code périodiquement et automatiquement. Pour cela, vous pouvez faire appel à la méthode OnTime de l'application afin d'exécuter automatiquement une procédure. Cette méthode permet de planifier l'exécution d'une action spécifique lorsqu'un délai donné s'est écoulé ou de planifier l'exécution d'une action à une heure définie. Elle met donc en attente l'exécution d'une action. Contrairement à d'autres méthodes (Application.Wait...), avec Application.Ontime, l'utilisateur ne perd jamais la main.
L'idée ici est de créer un appel, à intervalle régulier, de notre fonction, à partir d'elle-même. En s'auto-appelant toutes les x secondes, elle laisse le temps, à l'utilisateur, de réaliser des actions.

Comme paramètres, la méthode OnTime prend l'heure précise à laquelle elle doit exécuter la procédure et le nom de la procédure à exécuter. Si vous devez annuler un OnTime, vous devez fournir l'heure exacte à laquelle l'événement a été calendrier avoir lieu. Il n'y a pas moyen de dire à Excel d'annuler le prochain événement OnTime ou d'annuler tous les événements OnTime attente. Par conséquent, vous avez besoin de stocker l'heure à laquelle la procédure est à exécuter dans une variable publique et utiliser la valeur de cette variable dans les appels à OnTime.

Bien que des sujets voisins soient traités dans le forum,
je n'ai pas strictement trouvé la réponse.


Finalement, on peut commencer à travailler avec ces 3 sujets, que je n'avais pas trouvé initialement :
TIMER
ThierryM a écrit :déclencher un événement à une heure donnée (comme une alarme) :
dans cette macro il s'agit de l'affichage d'un msgbox à l'heure voulue (c'est en fait la routine "Alarme" qui détermine ce qui doit être fait).
Il y a une cellule (B1) qui affiche le temps qui défile comme une horloge.
15-102133(1).ods
INTERVALLE
Piaf a écrit :une solution ... utilisant la fonction Timer
inconvénient, le classeur doit être fermé par le menu Fichier > Fermer, si la macro alerte tourne. Si le classeur est fermé directement par la fenêtre, le fichier Lock n'est pas détruit.
Pour les tests le message s'affiche toutes les minutes.
karstou_msgbox_heure(1).ods
ONTIME
Loopingss a écrit : il y aura un très léger décalage par rapport à la minute étalon lié au corps d'instructions que vous effectuez toutes les minutes. S'il vous faut vraiment du 60 secondes précises alors utiliser l'instruction Timer en boucle et faites un test pour sortir de cette boucle et exécuter le reste du code.
1/ un code avec deux macros utilisant une récursivité entre elles :
testrecursif_loopingss.ods

Code : Tout sélectionner

'déclaration des variables partagées
private i As Integer

'Auteur: loopingss
'modification : martinbrait
Sub LaunchRepetiteur()
'amorce, pour déclencher la routine parametree
Repetiteur
End Sub






    Sub Repetiteur(optional i As Integer)
	    If IsMissing(i) Then
	    i=0'premier lancement
	    Call MacroToutesLesMinutes(1)
	    Else
	    
		    If i < 3 Then
		    i = i+1
		    Wait 3*1000'une minute
		    Call MacroToutesLesMinutes(i)
		    Else
		    Msgbox("Vous avez lancé 3 fois la routine",16+48,"MERCI ET AU REVOIR")
		    i=0'réinitialisation
		    End If
		    'au bout de 3 appels, 
		    'il n'y a plus de lancement 

	    End If
    End Sub

    Sub MacroToutesLesMinutes(NumPass As Integer)
    REM instructions de la macro principale
    
    'ICI ON REPETE L'EXECUTION SUCCESSIVE DE LA MEME ROUTINE
    '...
    '...
    '...
    '...
    ThisComponent.Sheets(0).getCellByPosition(0,0).String="PASSAGE " & NumPass
   ' Msgbox "passage " & NumPass
    'attention, pas de multithreading.
    
    Call Repetiteur(NumPass)
    End Sub



'2/ un code avec une macro récursive sur elle même


    Sub MacroTemps2()
    REM instructions de la macro

    i = i+1
    If i <= 3 Then
    Call MsgBox("PASSAGE " & i,16+48,"INFO")
    Wait 2*1000 'toutes les deux secondes.
    Call MacroTemps2    
    Else
    'on cesse la répétition
    End If
    
    End Sub

Auriez-vous des suggestions d'améliorations, notamment liées au multithreading,
et aux interruptions, permettant de laisser la main à l'utilisateur tout en
exécutant les actions récursives ?

Merci et à bientôt .
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12226
Inscription : 08 nov. 2005 16:23
Localisation : Caen, France

Re: [Résolu][Basic] timer et multithreading avec libreoffice

Message par Bidouille »

martinbrait a écrit :Auriez-vous des suggestions
Comme d'habitude, faire une recherche : https://forum.openoffice.org/fr/forum/v ... =8&t=19739
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

Re: [Résolu][Basic] timer et multithreading avec libreoffice

Message par martinbrait »

Bonjour Bidouille,
Merci, c'est une excellente documentation.

A bientôt !
LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

Re: [Résolu][Basic] timer et multithreading avec libreoffice

Message par Jurassic Pork »

hello,
martinbrait a écrit :Bonjour,
Comment VRAIMENT séparer les process, faire du multithreading ?
ma réponse n'est peut-être pas adéquate , vu que l'on est dans un fil de discussion avec balisage [Basic], mais une autre voie pour faire du multithreading, c'est d'utiliser une macro en python avec des "workers".
Voici un exemple qui lance 2 processus en parallèle dont l'un dure 30 secondes et l'autre 1 minute.

Code : Tout sélectionner

#   J.P  aout 2017 macros python pour calc
from threading import Thread
from time import sleep
import uno
t = None
t2 = None
def test_worker(doc):
    # Attendre 30 secondes pour la démo
    sleep(30)
    #  écrit Tâche 1 terminée dans la cellule A1 au bout des 30 secondes
    doc.Sheets.getByIndex(0).getCellByPosition(0,0).String = "Tâche 1 terminée"
    
def test_worker2(doc):
    # Attendre 60 secondes pour la démo
    sleep(60)	
    # écrit Tâche 2 terminée dans la cellule B1 au bout de 1 minute
    doc.Sheets.getByIndex(0).getCellByPosition(1,0).String = "Tâche 2 terminée"

def exectaches(*args):
    global t,t2
    doc = XSCRIPTCONTEXT.getDocument()
    t = Thread(target = test_worker, args = (doc,))
    t.start()
    t2 = Thread(target = test_worker2, args = (doc,))
    t2.start()

g_exportedScripts = exectaches,
Ami calmant, J.P
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

Re: [Résolu][Basic] timer et multithreading avec libreoffice

Message par martinbrait »

Excellente idée,
Merci beaucoup JP ! :D
LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !