lyrpy 0.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
lyr/LUSheduler.py ADDED
@@ -0,0 +1,940 @@
1
+ """LUSheduler.py"""
2
+ # -*- coding: UTF-8 -*-
3
+ __annotations__ = """
4
+ =======================================================
5
+ Copyright (c) 2023-2024
6
+ Author:
7
+ Lisitsin Y.R.
8
+ Project:
9
+ LU_PY
10
+ Python (LU)
11
+ Module:
12
+ LUSheduler.py
13
+
14
+ =======================================================
15
+ """
16
+
17
+ #------------------------------------------
18
+ # БИБЛИОТЕКИ python
19
+ #------------------------------------------
20
+ import datetime
21
+ from calendar import monthrange
22
+ import threading
23
+
24
+ #------------------------------------------
25
+ # БИБЛИОТЕКИ сторонние
26
+ #------------------------------------------
27
+
28
+ #------------------------------------------
29
+ # БИБЛИОТЕКИ LU
30
+ #------------------------------------------
31
+ import lyr.LULog as LULog
32
+ import lyr.LUStrUtils as LUStrUtils
33
+ import lyr.LUDateTime as LUDateTime
34
+
35
+ minNN = 0
36
+ maxNN = 59
37
+ minHH = 0
38
+ maxHH = 23
39
+ minDW = 1
40
+ maxDW = 7
41
+ minMM = 1
42
+ maxMM = 12
43
+ minDD = 1
44
+ maxDD = 31
45
+ DelimPattern = ' '
46
+ DelimItem = ','
47
+ DelimItems = '-'
48
+ """
49
+ ------------------------------------------------------------------
50
+ NN-NN HH-HH DD-DD MM-MM DW-DW [Program]
51
+ NN,NN,.. HH,HH,... DD,DD,... MM,MM,... DW,DW,... [Program]
52
+ * * * * * [Program]
53
+ ------------------------------------------------------------------
54
+ """
55
+
56
+ def NotifyFileEvent():
57
+ #beginfunction
58
+ ...
59
+ #endfunction
60
+ TNotifyFileEvent = NotifyFileEvent
61
+
62
+ # --------------------------------------------
63
+ # TObjectsItem
64
+ # --------------------------------------------
65
+ class TShedulerEventItem (object):
66
+ """TShedulerEventItem"""
67
+ luClassName = 'TShedulerEventItem'
68
+
69
+ @staticmethod
70
+ def IsBitOn (Value: int, Bit: int) -> bool:
71
+ #beginfunction
72
+ # return n & (1<<b))
73
+ LResult = (Value & (1<<Bit)) != 0
74
+ return LResult
75
+ #endfunction
76
+
77
+ @staticmethod
78
+ def TurnBitOn (Value: int, Bit: int) -> int:
79
+ #beginfunction
80
+ #return value | (1<<bit)
81
+ LResult = Value | (1<<Bit)
82
+ return LResult
83
+ #endfunction
84
+
85
+ @staticmethod
86
+ def TurnBitOff (Value: int, Bit: int) -> int:
87
+ #beginfunction
88
+ # return value & ~(1<<bit)
89
+ LResult = Value & ~ (1<<Bit)
90
+ return LResult
91
+ #endfunction
92
+
93
+ #--------------------------------------------------
94
+ # constructor
95
+ #--------------------------------------------------
96
+ def __init__(self):
97
+ """ Constructor """
98
+ super().__init__()
99
+ self.__FDD: int = 0
100
+ self.__FMM: int = 0
101
+ self.__FDW: int = 0
102
+ self.__FHH: int = 0
103
+ self.__FNN1: int = 0
104
+ self.__FNN2: int = 0
105
+ self.__FList: () = list ()
106
+ self.__FNameEvent: str = ''
107
+ self.Clear()
108
+
109
+ #--------------------------------------------------
110
+ # destructor
111
+ #--------------------------------------------------
112
+ def __del__(self):
113
+ """ destructor """
114
+ #beginfunction
115
+ # удалить объект
116
+ del self.__FList
117
+ LClassName = self.__class__.__name__
118
+ s = '{} уничтожен'.format (LClassName)
119
+ # LUConst.LULogger.log (LULog.DEBUGTEXT, s)
120
+ #print (s)
121
+ #endfunction
122
+
123
+ def Clear(self):
124
+ #beginfunction
125
+ ...
126
+ #endfunction
127
+
128
+ #--------------------------------------------------
129
+ # @property NameEvent
130
+ #--------------------------------------------------
131
+ # getter
132
+ @property
133
+ def NameEvent(self):
134
+ #beginfunction
135
+ return self.__FNameEvent
136
+ #endfunction
137
+ @NameEvent.setter
138
+ def NameEvent(self, Value: str):
139
+ #beginfunction
140
+ self.__FNameEvent: str = Value
141
+ #endfunction
142
+
143
+ def GetXX (self) -> ():
144
+ #beginfunction
145
+ return self.__FNN1,self.__FNN2,self.__FHH,self.__FDD,self.__FMM,self.__FDW
146
+ #endfunction
147
+
148
+ #--------------------------------------------------
149
+ # @property NN
150
+ #--------------------------------------------------
151
+ # property NN [Index: Integer]: Boolean read GetNN write SetNN;
152
+ def GetNN (self, Index: int) -> bool:
153
+ #beginfunction
154
+ LResult = False
155
+ if (Index >= minNN) and (Index <= maxNN):
156
+ if Index <= 31:
157
+ LResult = self.IsBitOn (self.__FNN1, Index)
158
+ else:
159
+ LResult = self.IsBitOn (self.__FNN2, Index-32)
160
+ #endif
161
+ #endif
162
+ return LResult
163
+ #endfunction
164
+ def SetNN (self, Index: int, Value: bool):
165
+ #beginfunction
166
+ if (Index >= minNN) and (Index <= maxNN):
167
+ if Index <= 31:
168
+ if Value:
169
+ self.__FNN1 = self.TurnBitOn (self.__FNN1, Index)
170
+ else:
171
+ self.__FNN1 = self.TurnBitOff (self.__FNN1, Index)
172
+ #endif
173
+ else:
174
+ if Value:
175
+ self.__FNN2 = self.TurnBitOn (self.__FNN2, Index-32)
176
+ else:
177
+ self.__FNN2 = self.TurnBitOff (self.__FNN2, Index-32)
178
+ #endif
179
+ #endif
180
+ #endif
181
+ #endfunction
182
+
183
+ #--------------------------------------------------
184
+ # @property HH
185
+ #--------------------------------------------------
186
+ # property HH [Index: Integer]: Boolean read GetHH write SetHH;
187
+ def GetHH (self, Index: int) -> bool:
188
+ #beginfunction
189
+ LResult = False
190
+ if (Index >= minHH) and (Index <= maxHH):
191
+ LResult = self.IsBitOn (self.__FHH, Index)
192
+ return LResult
193
+ #endfunction
194
+ def SetHH (self, Index: int, Value: bool):
195
+ #beginfunction
196
+ if (Index >= minHH) and (Index <= maxHH):
197
+ if Value:
198
+ self.__FHH = self.TurnBitOn (self.__FHH, Index)
199
+ else:
200
+ self.__FHH = self.TurnBitOff (self.__FHH, Index)
201
+ #endif
202
+ #endif
203
+ #endfunction
204
+
205
+ #--------------------------------------------------
206
+ # @property DD
207
+ #--------------------------------------------------
208
+ # property DD [Index: Integer]: Boolean read GetDD write SetDD;
209
+ def GetDD (self, Index: int) -> bool:
210
+ #beginfunction
211
+ LResult = False
212
+ if (Index >= minDD-1) and (Index <= maxDD-1):
213
+ # if (Index >= minDD - 1) and (Index <= maxDD):
214
+ LResult = self.IsBitOn (self.__FDD, Index)
215
+ return LResult
216
+ #endfunction
217
+ def SetDD (self, Index: int, Value: bool):
218
+ #beginfunction
219
+ if (Index >= minDD-1) and (Index <= maxDD-1):
220
+ if Value:
221
+ self.__FDD = self.TurnBitOn (self.__FDD, Index)
222
+ else:
223
+ self.__FDD = self.TurnBitOff (self.__FDD, Index)
224
+ #endif
225
+ #endif
226
+ #endfunction
227
+
228
+ #--------------------------------------------------
229
+ # @property MM
230
+ #--------------------------------------------------
231
+ # property MM [Index: Integer]: Boolean read GetMM write SetMM;
232
+ def GetMM (self, Index: int) -> bool:
233
+ #beginfunction
234
+ LResult = False
235
+ if (Index >= minMM-1) and (Index <= maxMM-1):
236
+ LResult = self.IsBitOn (self.__FMM, Index)
237
+ return LResult
238
+ #endfunction
239
+ def SetMM (self, Index: int, Value: bool):
240
+ #beginfunction
241
+ if (Index >= minMM-1) and (Index <= maxMM-1):
242
+ if Value:
243
+ self.__FMM = self.TurnBitOn (self.__FMM, Index)
244
+ else:
245
+ self.__FMM = self.TurnBitOff (self.__FMM, Index)
246
+ #endif
247
+ #endif
248
+ #endfunction
249
+
250
+ #--------------------------------------------------
251
+ # @property DW
252
+ #--------------------------------------------------
253
+ # property DW [Index: Integer]: Boolean read GetDW write SetDW;
254
+ def GetDW (self, Index: int) -> bool:
255
+ #beginfunction
256
+ LResult = False
257
+ if (Index >= minDW-1) and (Index <= maxDW-1):
258
+ LResult = self.IsBitOn (self.__FDW, Index)
259
+ return LResult
260
+ #endfunction
261
+ def SetDW (self, Index: int, Value: bool):
262
+ #beginfunction
263
+ if (Index >= minDW-1) and (Index <= maxDW-1):
264
+ if Value:
265
+ self.__FDW = self.TurnBitOn (self.__FDW, Index)
266
+ else:
267
+ self.__FDW = self.TurnBitOff (self.__FDW, Index)
268
+ #endif
269
+ #endif
270
+ #endfunction
271
+
272
+ #--------------------------------------------------
273
+ # @property XXString
274
+ #--------------------------------------------------
275
+ # property XXString[XXName: string]: string read GetXXString;
276
+ def GetXXString (self, XXName: str) -> str:
277
+ #beginfunction
278
+ LResult = ''
279
+ if XXName.upper() == 'DD':
280
+ for i in range (0, maxDD):
281
+ if self.GetDD(i):
282
+ LResult = LResult+LUStrUtils.AddChar(' ', str(i+1), 2)+','
283
+ else:
284
+ LResult = LResult + 'xx' + ','
285
+ #endif
286
+ #endfor
287
+ #endif
288
+ if XXName.upper() == 'MM':
289
+ for i in range (0, maxMM):
290
+ if self.GetMM(i):
291
+ LResult = LResult+LUStrUtils.AddChar(' ', str(i+1), 2)+','
292
+ else:
293
+ LResult = LResult + 'xx' + ','
294
+ #endif
295
+ #endfor
296
+ #endif
297
+ if XXName.upper() == 'DW':
298
+ for i in range (0, maxDW):
299
+ if self.GetDW(i):
300
+ LResult = LResult+LUStrUtils.AddChar(' ', str(i+1), 2)+','
301
+ else:
302
+ LResult = LResult + 'xx' + ','
303
+ #endif
304
+ #endfor
305
+ #endif
306
+ if XXName.upper() == 'HH':
307
+ for i in range (0, maxHH+1):
308
+ if self.GetHH(i):
309
+ LResult = LResult+LUStrUtils.AddChar(' ', str(i), 2)+','
310
+ else:
311
+ LResult = LResult + 'xx' + ','
312
+ #endif
313
+ #endfor
314
+ #endif
315
+ if XXName.upper() == 'NN':
316
+ for i in range (0, maxNN+1):
317
+ if self.GetNN(i):
318
+ LResult = LResult+LUStrUtils.AddChar(' ', str(i), 2)+','
319
+ else:
320
+ LResult = LResult + 'xx' + ','
321
+ #endif
322
+ #endfor
323
+ #endif
324
+ # удалить последний символ ',' в строке
325
+ LResult = LResult [:-1]
326
+ return LResult
327
+ #endfunction
328
+
329
+ def CreateList (self, Pattern: str, Lmin: int, Lmax: int):
330
+ #var
331
+ # i, j, WCount, i11, i12: Integer;
332
+ # S1, S11, S12: string;
333
+ #beginfunction
334
+ self.__FList.clear()
335
+ if Pattern == '*':
336
+ for j in range (Lmin, Lmax+1):
337
+ # self.__FList.append (str(j))
338
+ self.__FList.append (j)
339
+ else:
340
+ WCount = LUStrUtils.WordCount(Pattern, DelimItem)
341
+ for i in range (1, WCount+1):
342
+ s1 = LUStrUtils.ExtractWord (i, Pattern, DelimItem)
343
+ s11 = LUStrUtils.ExtractWord (1, s1, DelimItems)
344
+ s12 = LUStrUtils.ExtractWord (2, s1, DelimItems)
345
+ try:
346
+ i11 = int(s11)
347
+ except:
348
+ i11 = -1
349
+ #endtry
350
+ if i11 > Lmax: i11 = Lmax #endif
351
+ try:
352
+ i12 = int(s12)
353
+ except:
354
+ i12 = i11
355
+ #endtry
356
+ if i12 > Lmax: i12 = Lmax #endif
357
+ if i11 >= 0 and i12 >= 0:
358
+ # for j in range (i11, i12 + 1): self.__FList.append (str (j))
359
+ for j in range (i11, i12 + 1): self.__FList.append (j)
360
+ #endif
361
+ #endfor
362
+ #endif
363
+ #endfunction
364
+
365
+ # def NewPatterns (self, Patterns: str):
366
+ # #beginfunction
367
+ # self.__FDD = 0
368
+ # self.__FMM = 0
369
+ # self.__FDW = 0
370
+ # self.__FHH = 0
371
+ # self.__FNN1 = 0
372
+ # self.__FNN2 = 0
373
+ # self.AddPatterns (Patterns)
374
+ # #endfunction
375
+
376
+ def AddPatterns (self, Patterns: str):
377
+ #beginfunction
378
+ self.__FDD = 0
379
+ self.__FMM = 0
380
+ self.__FDW = 0
381
+ self.__FHH = 0
382
+ self.__FNN1 = 0
383
+ self.__FNN2 = 0
384
+ # NN
385
+ self.CreateList (LUStrUtils.ExtractWord (1, Patterns, DelimPattern), minNN, maxNN)
386
+ for item in self.__FList:
387
+ # self.SetNN(self.__FList.index(item), True)
388
+ self.SetNN(item, True)
389
+ # HH
390
+ self.CreateList (LUStrUtils.ExtractWord (2, Patterns, DelimPattern), minHH, maxHH)
391
+ for item in self.__FList:
392
+ # self.SetHH (self.__FList.index(item), True)
393
+ self.SetHH (item, True)
394
+ # DD
395
+ self.CreateList (LUStrUtils.ExtractWord (3, Patterns, DelimPattern), minDD, maxDD)
396
+ for item in self.__FList:
397
+ # self.SetDD (self.__FList.index(item), True)
398
+ self.SetDD (item-1, True)
399
+ # MM
400
+ self.CreateList (LUStrUtils.ExtractWord (4, Patterns, DelimPattern), minMM, maxMM)
401
+ for item in self.__FList:
402
+ # self.SetMM (self.__FList.index(item), True)
403
+ self.SetMM (item-1, True)
404
+ # DW
405
+ self.CreateList (LUStrUtils.ExtractWord (5, Patterns, DelimPattern), minDW, maxDW)
406
+ for item in self.__FList:
407
+ # self.SetDW (self.__FList.index (item), True)
408
+ self.SetDW (item-1, True)
409
+ #endfunction
410
+ #endclass
411
+
412
+ # --------------------------------------------
413
+ # TSheduler
414
+ # --------------------------------------------
415
+ class TSheduler (object):
416
+ """TSheduler"""
417
+ luClassName = 'TSheduler'
418
+
419
+ #--------------------------------------------------
420
+ # constructor
421
+ #--------------------------------------------------
422
+ def __init__ (self, *args, **kwargs):
423
+ """Constructor"""
424
+ #beginfunction
425
+ super ().__init__ (*args, **kwargs)
426
+ self.args = args
427
+ self.kwargs = kwargs
428
+ #
429
+ self.__FStopThread = False
430
+ #
431
+ self.__FShedulerEvents = list ()
432
+ #
433
+ self.__FNameEvents = list ()
434
+ # 'Следующий сеанс: ', self.DTEvents
435
+ self.__FDTEvents: datetime = 0
436
+ #
437
+ self.__FEnable: bool = False
438
+ #
439
+ self.__FOnSheduler: TNotifyFileEvent = None
440
+ #
441
+ self.__FOnShedulerEvent:TShedulerEventItem = None
442
+
443
+ #endfunction
444
+
445
+ #--------------------------------------------------
446
+ # destructor
447
+ #--------------------------------------------------
448
+ def __del__(self):
449
+ """destructor"""
450
+ #beginfunction
451
+ # удалить объект
452
+ del self.__FShedulerEvents
453
+ del self.__FNameEvents
454
+ LClassName = self.__class__.__name__
455
+ s = '{} уничтожен'.format(LClassName)
456
+ # LUConst.LULogger.log (LULog.DEBUGTEXT, s)
457
+ #endfunction
458
+
459
+ #--------------------------------------------------
460
+ # @property OnSheduler
461
+ #--------------------------------------------------
462
+ # getter
463
+ @property
464
+ def OnSheduler(self) -> TNotifyFileEvent:
465
+ #beginfunction
466
+ return self.__FOnSheduler
467
+ #endfunction
468
+ @OnSheduler.setter
469
+ def OnSheduler(self, Value):
470
+ #beginfunction
471
+ self.__FOnSheduler = Value
472
+ self.__FFunction = Value
473
+ #endfunction
474
+
475
+ #--------------------------------------------------
476
+ # @property Enable
477
+ #--------------------------------------------------
478
+ # getter
479
+ @property
480
+ def Enable(self) -> bool:
481
+ #beginfunction
482
+ return self.__FEnable
483
+ #endfunction
484
+ @Enable.setter
485
+ def Enable(self, Value: bool):
486
+ #beginfunction
487
+ self.__FEnable: bool = Value
488
+ if Value:
489
+ self.CreateNextEvent (True)
490
+ #endif
491
+ #endfunction
492
+
493
+ # #--------------------------------------------------
494
+ # # @property ShedulerEvents
495
+ # #--------------------------------------------------
496
+ # # getter
497
+ # @property
498
+ # def ShedulerEvents(self):
499
+ # #beginfunction
500
+ # return self.__FShedulerEvents
501
+ # #endfunction
502
+ # @ShedulerEvents.setter
503
+ # def ShedulerEvents(self, Value: ()):
504
+ # #beginfunction
505
+ # self.__FShedulerEvents: () = Value
506
+ # #endfunction
507
+
508
+ #--------------------------------------------------
509
+ # @property OnShedulerEvent
510
+ #--------------------------------------------------
511
+ # getter
512
+ @property
513
+ def OnShedulerEvent(self) -> TShedulerEventItem:
514
+ #beginfunction
515
+ return self.__FOnShedulerEvent
516
+ #endfunction
517
+ @OnShedulerEvent.setter
518
+ def OnShedulerEvent(self, Value:TShedulerEventItem):
519
+ #beginfunction
520
+ self.__FOnShedulerEvent = Value
521
+ #endfunction
522
+
523
+ #--------------------------------------------------
524
+ # @property ShedulerEventItem
525
+ #--------------------------------------------------
526
+ def GetShedulerEventItem(self, ANameEvent: str) -> TShedulerEventItem:
527
+ #beginfunction
528
+ for item in self.__FShedulerEvents:
529
+ if item.NameEvent == ANameEvent:
530
+ return item
531
+ #endif
532
+ #endfor
533
+ return None
534
+ #endfunction
535
+
536
+ # #--------------------------------------------------
537
+ # # @property NameEvents
538
+ # #--------------------------------------------------
539
+ # # getter
540
+ # @property
541
+ # def NameEvents(self) -> list:
542
+ # #beginfunction
543
+ # self.CreateNextEvent (True)
544
+ # return self.__FNameEvents
545
+ # #endfunction
546
+
547
+ #--------------------------------------------------
548
+ # @property DTEvents
549
+ #--------------------------------------------------
550
+ # getter
551
+ @property
552
+ def DTEvents(self) -> datetime:
553
+ #beginfunction
554
+ return self.__FDTEvents
555
+ #endfunction
556
+
557
+ #--------------------------------------------------
558
+ # __run_Function
559
+ #--------------------------------------------------
560
+ def run_Function(self):
561
+ """__run_Function"""
562
+ #beginfunction
563
+ s = '__run_Function...'
564
+ # LULog.LoggerTOOLS_AddDebug (s)
565
+ if self.__FEnable:
566
+ LPresentNow = LUDateTime.Now ()
567
+ LYear, LMonth, LDay = LUDateTime.DecodeDate (LPresentNow)
568
+ LHour, LMin, LSec, LMSec = LUDateTime.DecodeTime (LPresentNow)
569
+ LDTEventsNow = LUDateTime.EncodeDateTime (LYear, LMonth, LDay, LHour, LMin, 0, 0)
570
+ # print (LDTEventsNow, self.DTEvents)
571
+ if LDTEventsNow == self.DTEvents:
572
+ self.__Second ()
573
+ # 'Следующий сеанс: ', self.DTEvents
574
+ self.CreateNextEvent (False)
575
+ #endif
576
+ #endif
577
+ #endfunction
578
+
579
+ def CreateNextEvent (self, APrint: bool):
580
+ """__CreateNextEvent"""
581
+ #beginfunction
582
+ LPresent: datetime = LUDateTime.Now ()
583
+ LYear, LMonth, LDay = LUDateTime.DecodeDate (LPresent)
584
+ LHour, LMin, LSec, LMSec = LUDateTime.DecodeTime (LPresent)
585
+ LMin = LMin + 1
586
+ self.__FNameEvents.clear()
587
+ # Year
588
+ for LYear in range (LYear,LYear+1):
589
+ # Month
590
+ for LMonth in range (LMonth, maxMM):
591
+ # MaxDDWork = DateUtils.DaysInMonth (Present)
592
+ MaxDDWork = monthrange (LYear, LMonth)[1]
593
+ # Day of Month
594
+ for LDay in range (LDay, MaxDDWork+1):
595
+ LDayWeek = LUDateTime.DayOfWeek (LUDateTime.EncodeDate(LYear,LMonth,LDay))
596
+ LDayWeek = LDayWeek + 1
597
+ if LDayWeek == 0:
598
+ LDayWeek = 7
599
+ #endif
600
+ # Hour
601
+ for LHour in range (LHour, maxHH+1):
602
+ # Min
603
+ for LMin in range (LMin, maxNN+1):
604
+ # Check List Sheduler
605
+ for item in self.__FShedulerEvents:
606
+ self.OnShedulerEvent:TShedulerEventItem = item
607
+ bDay = self.OnShedulerEvent.GetDD (LDay-1)
608
+ bDayWeek = self.OnShedulerEvent.GetDW (LDayWeek-1)
609
+ bMonth = self.OnShedulerEvent.GetMM (LMonth-1)
610
+ bHour = self.OnShedulerEvent.GetHH (LHour)
611
+ bMin = self.OnShedulerEvent.GetNN (LMin)
612
+ # print (bDay, bDayWeek, bMonth, bHour, bMin)
613
+ if bDay and bDayWeek and bMonth and bHour and bMin:
614
+ self.__FNameEvents.append (self.OnShedulerEvent.NameEvent)
615
+ #endif
616
+ #endfor
617
+ if len(self.__FNameEvents) > 0:
618
+ break
619
+ #endif
620
+ #endfor
621
+ if len(self.__FNameEvents) == 0:
622
+ LMin = minNN
623
+ else:
624
+ break
625
+ #endif
626
+ #endfor
627
+ if len(self.__FNameEvents) == 0:
628
+ LHour = minHH
629
+ else:
630
+ break
631
+ #endif
632
+ #endfor
633
+ if len(self.__FNameEvents) == 0:
634
+ LDay = minDD
635
+ else:
636
+ break
637
+ #endif
638
+ #endfor
639
+ if len(self.__FNameEvents) == 0:
640
+ LMonth = minMM
641
+ else:
642
+ break
643
+ #endif
644
+ #endfor
645
+ if len(self.__FNameEvents) > 0:
646
+ D = LUDateTime.EncodeDate (LYear, LMonth, LDay)
647
+ T = LUDateTime.EncodeTime (LHour, LMin, 0, 0)
648
+ self.__FDTEvents = datetime.datetime.combine (D, T)
649
+ self.__FDTEvents = LUDateTime.EncodeDateTime (LYear, LMonth, LDay, LHour, LMin, 0, 0)
650
+ else:
651
+ self.__FDTEvents = LPresent
652
+ #endif
653
+ s = 'Следующий сеанс: ' + str (self.__FDTEvents)
654
+ if APrint:
655
+ LULog.LoggerTOOLS_AddDebug (s)
656
+ #endif
657
+ #endfunction
658
+
659
+ def __Second (self):
660
+ """Second"""
661
+ #beginfunction
662
+ s = 'Second...'
663
+ # LULog.LoggerTOOLS_AddDebug (s)
664
+ if self.__FEnable:
665
+ LPresent: datetime = LUDateTime.Now()
666
+ LHour, LMin, LSec, LMSec = LUDateTime.DecodeTime (LPresent)
667
+ # Check List Sheduler
668
+ LYear, LMonth, LDay = LUDateTime.DecodeDate (LPresent)
669
+ LDayWeek = LUDateTime.DayOfWeek (LPresent)
670
+ LDayWeek = LDayWeek + 1
671
+ if LDayWeek == 0:
672
+ LDayWeek = 7
673
+ for item in self.__FShedulerEvents:
674
+ LEvent: TShedulerEventItem = item
675
+ bDay = LEvent.GetDD (LDay-1)
676
+ bDayWeek = LEvent.GetDW (LDayWeek-1)
677
+ bMonth = LEvent.GetMM (LMonth-1)
678
+ bHour = LEvent.GetHH (LHour)
679
+ bMin = LEvent.GetNN (LMin)
680
+ if bDay and bDayWeek and bMonth and bHour and bMin:
681
+ self.OnShedulerEvent = item
682
+ if self.OnSheduler is not None:
683
+ self.OnSheduler (LEvent)
684
+ #endif
685
+ #endif
686
+ #endfor
687
+ #endif
688
+ #endfunction
689
+
690
+ def __CreateShedulerEvent(self) -> TShedulerEventItem:
691
+ #beginfunction
692
+ LResult: TShedulerEventItem = TShedulerEventItem()
693
+ self.__FShedulerEvents.append(LResult)
694
+ return LResult
695
+ #endfunction
696
+
697
+ def __DeleteEvent (self, ANameEvent: str):
698
+ #beginfunction
699
+ for item in self.__FShedulerEvents:
700
+ if item.NameEvent == ANameEvent:
701
+ self.__FShedulerEvents.remove(item)
702
+ break
703
+ #endif
704
+ #endfor
705
+ #endfunction
706
+
707
+ def AddEvent (self, ANameEvent:str, APatterns: str) -> TShedulerEventItem:
708
+ """AddEvent"""
709
+ #beginfunction
710
+ LEvent:TShedulerEventItem = None
711
+ for item in self.__FShedulerEvents:
712
+ if item.NameEvent == ANameEvent:
713
+ LEvent: TShedulerEventItem = item
714
+ break
715
+ #endif
716
+ #endfor
717
+
718
+ if LEvent is not None and LEvent.NameEvent == ANameEvent:
719
+ LEvent.AddPatterns (APatterns)
720
+ else:
721
+ LEvent:TShedulerEventItem = self.__CreateShedulerEvent()
722
+ LEvent.NameEvent = ANameEvent
723
+ LEvent.AddPatterns (APatterns)
724
+ #endif
725
+ return LEvent
726
+ #endfunction
727
+
728
+ @staticmethod
729
+ def PrintEvent (AEvent: TShedulerEventItem):
730
+ """PrintEvent"""
731
+ #beginfunction
732
+ LULog.LoggerTOOLS_AddDebug (AEvent.NameEvent)
733
+ s = f'NN={AEvent.GetXXString ("NN")}'
734
+ LULog.LoggerTOOLS_AddDebug (s)
735
+ s = f'HH={AEvent.GetXXString ("HH")}'
736
+ LULog.LoggerTOOLS_AddDebug (s)
737
+ s = f'DD={AEvent.GetXXString ("DD")}'
738
+ LULog.LoggerTOOLS_AddDebug (s)
739
+ s = f'MM={AEvent.GetXXString ("MM")}'
740
+ LULog.LoggerTOOLS_AddDebug (s)
741
+ s = f'DW={AEvent.GetXXString ("DW")}'
742
+ LULog.LoggerTOOLS_AddDebug (s)
743
+ #endfunction
744
+ #endclass
745
+
746
+ # --------------------------------------------
747
+ # TShedulerThread
748
+ # --------------------------------------------
749
+ class TShedulerThread (threading.Thread):
750
+ """TShedulerThread"""
751
+ luClassName = 'TShedulerThread'
752
+
753
+ #--------------------------------------------------
754
+ # constructor
755
+ #--------------------------------------------------
756
+ def __init__ (self, *args, **kwargs):
757
+ """Constructor"""
758
+ #beginfunction
759
+ super ().__init__ (*args, **kwargs)
760
+ self.args = args
761
+ self.kwargs = kwargs
762
+ #
763
+ self.__FStopThread = False
764
+ self.__FSheduler = TSheduler()
765
+ #endfunction
766
+
767
+ #--------------------------------------------------
768
+ # destructor
769
+ #--------------------------------------------------
770
+ def __del__(self):
771
+ """destructor"""
772
+ #beginfunction
773
+ LClassName = self.__class__.__name__
774
+ s = '{} уничтожен'.format(LClassName)
775
+ # LUConst.LULogger.log (LULog.DEBUGTEXT, s)
776
+ #endfunction
777
+
778
+ #--------------------------------------------------
779
+ # @property Sheduler
780
+ #--------------------------------------------------
781
+ # getter
782
+ @property
783
+ def Sheduler(self) -> TSheduler:
784
+ #beginfunction
785
+ return self.__FSheduler
786
+ #endfunction
787
+
788
+
789
+ #--------------------------------------------------
790
+ # run
791
+ #--------------------------------------------------
792
+ def run(self):
793
+ """run - Запуск потока TSheduler"""
794
+ #beginfunction
795
+ s = 'run - Запуск потока TSheduler...'
796
+ LULog.LoggerTOOLS_AddDebug (s)
797
+ super ().run()
798
+
799
+ if self.__FSheduler.DTEvents == 0:
800
+ self.__FSheduler.CreateNextEvent ()
801
+ #endif
802
+ while not self.__FStopThread:
803
+ self.__FSheduler.run_Function ()
804
+ continue
805
+ #endwhile
806
+ #endfunction
807
+
808
+ #--------------------------------------------------
809
+ # StartSheduler
810
+ #--------------------------------------------------
811
+ def StartSheduler(self):
812
+ """StartSheduler"""
813
+ #beginfunction
814
+ s = 'StartSheduler...'
815
+ LULog.LoggerTOOLS_AddDebug (s)
816
+ self.__FStopThread = False
817
+ self.__FSheduler.Enable = True
818
+ # self.__CreateNextEvent ()
819
+ self.start ()
820
+ #endfunction
821
+ #--------------------------------------------------
822
+ # StopSheduler
823
+ #--------------------------------------------------
824
+ def StopSheduler(self):
825
+ """StopSheduler"""
826
+ #beginfunction
827
+ s = 'StopSheduler...'
828
+ LULog.LoggerTOOLS_AddDebug (s)
829
+ self.__FStopThread = True
830
+ self.__FSheduler.Enable = False
831
+ #endfunction
832
+ #endclass
833
+
834
+ # --------------------------------------------
835
+ # TShedulerTimer
836
+ # --------------------------------------------
837
+ class TShedulerTimer (threading.Timer):
838
+ """TSheduler"""
839
+ luClassName = 'TShedulerTimer'
840
+
841
+ #--------------------------------------------------
842
+ # constructor
843
+ #--------------------------------------------------
844
+ def __init__ (self, AInterval, AFunction, *args, **kwargs):
845
+ """Constructor"""
846
+ #beginfunction
847
+ super ().__init__ (AInterval, AFunction, *args, **kwargs)
848
+ self.args = args
849
+ self.kwargs = kwargs
850
+ #
851
+ self.__FSheduler = TSheduler()
852
+ #
853
+ self.__FStopThread = False
854
+ self.__FInterval = AInterval
855
+ self.__FFunction = AFunction
856
+ #endfunction
857
+
858
+ #--------------------------------------------------
859
+ # destructor
860
+ #--------------------------------------------------
861
+ def __del__ (self):
862
+ """destructor"""
863
+ #beginfunction
864
+ LClassName = self.__class__.__name__
865
+ s = '{} уничтожен'.format (LClassName)
866
+ # LUConst.LULogger.log (LULog.DEBUGTEXT, s)
867
+ #endfunction
868
+
869
+ #--------------------------------------------------
870
+ # @property Sheduler
871
+ #--------------------------------------------------
872
+ # getter
873
+ @property
874
+ def Sheduler(self) -> TSheduler:
875
+ #beginfunction
876
+ return self.__FSheduler
877
+ #endfunction
878
+
879
+ #--------------------------------------------------
880
+ # run
881
+ #--------------------------------------------------
882
+ def run (self):
883
+ """run - Запуск таймера TShedulerTimer"""
884
+ #beginfunction
885
+ s = 'run - Запуск таймера TShedulerTimer...'
886
+ LULog.LoggerTOOLS_AddDebug (s)
887
+
888
+ if self.__FSheduler.DTEvents == 0:
889
+ self.__FSheduler.CreateNextEvent (True)
890
+ #endif
891
+ while not self.__FStopThread:
892
+ self.__FSheduler.run_Function ()
893
+ continue
894
+ #endwhile
895
+ #endfunction
896
+
897
+ #--------------------------------------------------
898
+ # StartSheduler
899
+ #--------------------------------------------------
900
+ def StartSheduler (self):
901
+ """StartSheduler"""
902
+ #beginfunction
903
+ s = 'StartSheduler...'
904
+ LULog.LoggerTOOLS_AddDebug (s)
905
+ self.__FStopThread = False
906
+ self.__FSheduler.Enable = True
907
+ # self.__CreateNextEvent (True)
908
+ self.start ()
909
+ #endfunction
910
+ #--------------------------------------------------
911
+ # StopSheduler
912
+ #--------------------------------------------------
913
+ def StopSheduler (self):
914
+ """StopSheduler"""
915
+ #beginfunction
916
+ s = 'StopSheduler...'
917
+ LULog.LoggerTOOLS_AddDebug (s)
918
+ self.__FStopThread = True
919
+ self.__FSheduler.Enable = False
920
+ #endfunction
921
+ #endclass
922
+
923
+ #---------------------------------------------------------
924
+ # main
925
+ #---------------------------------------------------------
926
+ def main ():
927
+ #beginfunction
928
+ ...
929
+ #endfunction
930
+
931
+ #---------------------------------------------------------
932
+ #
933
+ #---------------------------------------------------------
934
+ #beginmodule
935
+ if __name__ == "__main__":
936
+ main()
937
+ #endif
938
+
939
+ #endmodule
940
+