Afficher "l'heure a sonnée" si correspondance il y

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Afficher "l'heure a sonnée" si correspondance il y

Message par nico »

@Spaceman

Voilà ce que tu demandes, j'ai légèrement modifié la procédure GetTime(...)

Code : Tout sélectionner

Enumeration
  #Window_0 : #StatusBar_Window_0 : #ListIcon_0
EndEnumeration

Enumeration #PB_Event_FirstCustomValue
  #EvenementHorloge
EndEnumeration

Define.l Event, EventWindow, EventGadget, EventType, EventMenu

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 643, 30, 372, 288, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    If CreateStatusBar(#StatusBar_Window_0, WindowID(#Window_0))
    EndIf
    ListIconGadget(#ListIcon_0, 20, 25, 335, 215, "N°",100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    AddGadgetColumn(#ListIcon_0, 1, "Time", 100)
    AddGadgetColumn(#ListIcon_0, 2, "", 300)
    AddGadgetItem(#ListIcon_0, -1, "1" + Chr(10)+"22:43:25")
    AddGadgetItem(#ListIcon_0,  1, "2" + Chr(10)+"22:43:35")
    AddGadgetItem(#ListIcon_0,  2, "3" + Chr(10)+"22:44:25")
    AddGadgetItem(#ListIcon_0,  3, "4" + Chr(10)+"22:45:25")
    AddGadgetItem(#ListIcon_0,  4, "5" + Chr(10)+"22:46:25")
  EndIf
EndProcedure

Procedure GetTime_(Parameter)
  Repeat
    time=Date()
    x=CountGadgetItems(#ListIcon_0) 
    
    For n=0 To x-1
      Debug GetGadgetItemText(#ListIcon_0,n,1)
      hl = Val(Mid(GetGadgetItemText(#ListIcon_0,n,1),1,2))
      ml = Val(Mid(GetGadgetItemText(#ListIcon_0,n,1),4,2))
      sl = Val(Mid(GetGadgetItemText(#ListIcon_0,n,1),7,2))
      Resultat = Date(Year(time), Month(time), Day(time), hl, ml, sl)
      
      If Resultat <= time
        If GetGadgetItemText(#ListIcon_0,n,2) <> "L'heure a sonné"
          SetGadgetItemText(#ListIcon_0,n,"L'heure a sonné",2)
          PostEvent(#EvenementHorloge)
        EndIf
      Else
        SetGadgetItemText(#ListIcon_0,n,"Pas encore",2)
      EndIf
    Next
    
    Delay(1000)
  ForEver
EndProcedure

OpenWindow_Window_0()

CreateThread(@ GetTime_(),255)
Repeat
  Event = WaitWindowEvent()
  Select Event 
    Case #EvenementHorloge
      MessageRequester("AutoStart","Il est l'heure !");ce message doit d'afficher une seule fois
      
    Case #PB_Event_CloseWindow
      CloseWindow(#Window_0)
      End 
  EndSelect
ForEver
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Afficher "l'heure a sonnée" si correspondance il y

Message par Ar-S »

+1 pour le timer en se qui concerne les alarmes / chronos
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Mesa
Messages : 1092
Inscription : mer. 14/sept./2011 16:59

Re: Afficher "l'heure a sonnée" si correspondance il y

Message par Mesa »

@dobro:
il y a pas mal de temps , je me suis fait un prg d'alerte...
Alors pourquoi tu ne le partages pas ? 8O
Le forum est fait pour ça non ? :roll:

Sauf erreur, le timergadget utilise déjà un thread.
Voici donc une solution sans thread et qui consomme quasi zéro de temps processeur.
Pour info, il ne faut pas utiliser un messagerequester dans ce cas là, voir explications dans le code.
J'ai aussi utilisé des fonctions auxquelles on ne pense jamais et qui sont bien utiles ici (SetGadgetData, SetGadgetItemData

Code : Tout sélectionner

Enumeration fenetre
  #Window_Principale : #Window_Alerte
EndEnumeration; pas la peine de créer des numéros de gadgets inutiles
Enumeration gadget
  #StatusBar_Window_0 : #ListIcon_0 : #TexteAlerte
EndEnumeration 
Enumeration timer; pas la peine de créer des numéros de timers inutiles
  #Timer
EndEnumeration
Enumeration #PB_Event_FirstCustomValue
  #EvenementHorloge
EndEnumeration

Global Compteur=0, Delai=800

Define.l Event, EventWindow, EventGadget, EventType, EventMenu
Declare Alerte(Parameter)
  
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_Principale, 643, 30, 372, 288, "Minuterie", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    If CreateStatusBar(#StatusBar_Window_0, WindowID(#Window_Principale))
      AddStatusBarField(#PB_Ignore)
    EndIf
    ListIconGadget(#ListIcon_0, 20, 25, 335, 215, "N°",100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    AddGadgetColumn(#ListIcon_0, 1, "Time", 100)
    AddGadgetColumn(#ListIcon_0, 2, "", 300)
    DateEnCours=Date()
    tmpHeure=DateEnCours ; on garde, ça peut servir
    For i=0 To 4
      tmpHeure= AddDate(tmpHeure, #PB_Date_Minute, 1)
      tmpHeure$=FormatDate("%hh:%ii:%ss", tmpHeure)
      AddGadgetItem(#ListIcon_0, i, Str(i+1) + Chr(10)+tmpHeure$)
      SetGadgetItemData(#ListIcon_0, i, tmpHeure)
    Next i
  EndIf
  SetGadgetData(#ListIcon_0,GetGadgetItemData(#ListIcon_0, 0))
  
  AddWindowTimer(#Window_Principale,#Timer,Delai);
EndProcedure
Procedure OpenWindow_Alerte()
  If OpenWindow(#Window_Alerte, 0, 0, 200, 100, "Alerte", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_NoActivate|#PB_Window_Invisible )
    ; Avec un webgadget on peut afficher un GIF animé
    ; Avec un canvasgadget, on peut créer sa propre animation, pour attirer l'oeil
    TextGadget(#TexteAlerte, 0, 35, 200, 30, "Il est l'heure !", #PB_Text_Center)
  EndIf
   StickyWindow(#Window_Alerte, #True) 
EndProcedure
Procedure Alerte(Parameter)

  SetWindowData(#Window_Principale,GetWindowData(#Window_Principale)+Delai)

  progression=100*GetWindowData(#Window_Principale)/60000; ici je triche, je sais que le delta entre 2 dates est de 1min mais il faudrait le calculer
  StatusBarProgress(#StatusBar_Window_0, 0, progression)
  
  If 	Date()=GetGadgetData(#ListIcon_0)
    SetGadgetItemText(#ListIcon_0,Parameter,"L'heure a sonné",2) 
    
    Compteur=Compteur + 1
    SetGadgetData(#ListIcon_0,GetGadgetItemData(#ListIcon_0, Compteur))
    SetWindowData(#Window_Principale,0)
    ;     MessageRequester("AutoStart","Il est l'heure !")
    ; ne pas utiliser de requester car ils sont bloquant, ce qui ne convient pas ici
    ; car le timer doit poursuivre son compte même après l'affichage d'une alerte
    ; il faut donc créer son propre requester non bloquant avec une simple fenêtre
    ; Dans ce cas le gadget MDI est à essayer !
    
    HideWindow(#Window_Alerte,#False,#PB_Window_NoActivate |#PB_Window_ScreenCentered)
   
  EndIf

EndProcedure

OpenWindow_Window_0()
OpenWindow_Alerte()

Repeat
  Event = WaitWindowEvent()
  

  Select Event 
    Case #PB_Event_Timer
      If EventTimer()=#Timer
Alerte(Compteur)
    EndIf
    
  Case #PB_Event_CloseWindow
    If EventWindow() =#Window_Principale
      CloseWindow(#Window_Principale)
      End 
    Else
      HideWindow(#Window_Alerte,#True)
      EndIf
  EndSelect
ForEver
M.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Afficher "l'heure a sonnée" si correspondance il y

Message par Ollivier »

@mesa

je comprends ton effort et ton code est très bien, celui de nico aussi, celui de Brossden aussi. Seulement, après l'intervention de Brossden, je me suis bien pris la tête à rédiger une bonne doc explicative, pour faire comprendre ce que le code source était en capacité d'exécuter, et dont voici deux extraits :
Au démarrage, tu peux augmenter le nombre d'alarmes jusqu'à 256:

Code : Tout sélectionner

; Initialisation
Alarm\MaxQty = 256 ; 256 alarmes disponibles
AlarmResetAll(Alarm)
Cette intervention peut avoir lieu N'IMPORTE OU dans ton programme. Tu peux appeler
la procédure AlarmNewOne() de toutes les manière possibles:
AlarmNewOne(Alarm) ; Direct
CallFunctionFast(Alarm\NewOne, Alarm) ; Indirect
CreateThread(Alarm\NewOne, Alarm) ; Parallèle
Toutes les procédures peuvent être accessibles de cette manière si bien que ce
programme est compatible avec une compilation en DLL.
Voilà, c'est écrit noir sur blanc depuis huit ans. Ceux qui ne comprennent pas par inadvertance, ça n'est franchement pas grave.

Mais je viens de lire un message d'une personne capable de faire croire que le nombre "256" s'écrivait comme ceci : "2 ou 3".

Si c'était le cas, il avait huit années pour prouver la véracité de sa maladresse.

Ainsi, PAPIPP a bien raison, et sans avoir même à modifier la moindre virgule dans mes messages de 2009 ci-dessus. Ça se voit d'ailleurs. :o
On peut gérer logiciellement la sécurité des threads.

Bonne lecture
Répondre