Differenze tra le versioni di "Creare un Timer con le funzioni esterne delle librerie standard C "signal.h" e "time.h""
Da Gambas-it.org - Wikipedia.
(Creata pagina con "Usando alcune funzioni esterne delle librerie standard C "''signal.h''" e "''time.h''", è possibile creare ed utilizzare un ''Timer'' E' necessario avere installata nel sist...") |
|||
Riga 1: | Riga 1: | ||
Usando alcune funzioni esterne delle librerie standard C "''signal.h''" e "''time.h''", è possibile creare ed utilizzare un ''Timer'' | Usando alcune funzioni esterne delle librerie standard C "''signal.h''" e "''time.h''", è possibile creare ed utilizzare un ''Timer'' | ||
− | E' necessario avere installata nel sistema e richiamare in Gambas la libreria | + | E' necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "''/usr/lib/x86_64-linux-gnu/libvlccore.so.9.0.0'' " o altra, purché contenente le funzioni esterne "timer_create()", "timer_settime()" e "timer_delete()". |
− | |||
Mostriamo un esempio: | Mostriamo un esempio: | ||
Private id As Long | Private id As Long | ||
Private num As Byte | Private num As Byte | ||
− | + | ||
Library "libc:6" | Library "libc:6" | ||
Riga 18: | Riga 17: | ||
− | Library "/usr/lib/ | + | Library "/usr/lib/x86_64-linux-gnu/libvlccore:9.0.0" |
Public Struct timespec | Public Struct timespec | ||
Riga 61: | Riga 60: | ||
'''End''' | '''End''' | ||
− | |||
'''Private''' Procedure Start_Timer(vlr As Long) | '''Private''' Procedure Start_Timer(vlr As Long) | ||
Riga 78: | Riga 76: | ||
'''End''' | '''End''' | ||
− | |||
'''Private''' Procedure timer_callback(signum As Integer) | '''Private''' Procedure timer_callback(signum As Integer) | ||
Riga 87: | Riga 84: | ||
'''End''' | '''End''' | ||
− | |||
'''Private''' Procedure Stop_Timer() | '''Private''' Procedure Stop_Timer() | ||
Dim spec As New Itimerspec | Dim spec As New Itimerspec | ||
− | + | ||
− | + | With spec | |
− | + | .it_value.tv_sec = 0 | |
− | + | .it_value.tv_nsec = 0 | |
− | + | .it_interval.tv_sec = 0 | |
− | + | .it_interval.tv_nsec = 0 | |
− | + | End With | |
− | + | ||
− | + | timer_settime(id, 0, spec, Null) | |
− | + | timer_delete(id) | |
− | + | ||
'''End''' | '''End''' | ||
− | |||
Versione attuale delle 15:23, 4 set 2022
Usando alcune funzioni esterne delle librerie standard C "signal.h" e "time.h", è possibile creare ed utilizzare un Timer
E' necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "/usr/lib/x86_64-linux-gnu/libvlccore.so.9.0.0 " o altra, purché contenente le funzioni esterne "timer_create()", "timer_settime()" e "timer_delete()".
Mostriamo un esempio:
Private id As Long Private num As Byte Library "libc:6" Private Const SIGALRM As Integer = 14 ' Alarm clock (POSIX) ' __sighandler_t signal (int __sig, __sighandler_t __handler) ' Set the handler for the signal SIG to HANDLER. Private Extern signal(__sig As Integer, __handler As Pointer) As Pointer Library "/usr/lib/x86_64-linux-gnu/libvlccore:9.0.0" Public Struct timespec tv_sec As Long tv_nsec As Long End Struct Public Struct itimerspec it_interval As Struct Timespec it_value As Struct Timespec End Struct Private Enum CLOCK_REALTIME = 0, CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID, CLOCK_MONOTONIC_RAW, CLOCK_REALTIME_COARSE, CLOCK_MONOTONIC_COARSE, CLOCK_BOOTTIME, CLOCK_REALTIME_ALARM, CLOCK_BOOTTIME_ALARM ' int timer_create (clockid_t __clock_id, struct sigevent *__restrict __evp, timer_t *__restrict __timerid) ' Create new per-process timer using CLOCK_ID. Private Extern timer_create(__clock_id As Integer, __evp As Pointer, __timerid As Pointer) As Integer ' int timer_settime (timer_t __timerid, int __flags, const struct itimerspec *__restrict __value, struct itimerspec *__restrict __ovalue) ' Set timer TIMERID to VALUE, returning old value in OVALUE. Private Extern timer_settime(__timerid As Long, __flags As Integer, __value As Itimerspec, __ovalue As Itimerspec) As Integer ' int timer_delete (timer_t __timerid) ' Delete timer TIMERID. Private Extern timer_delete(__timerid As Long) As Integer Public Sub Main() signal(SIGALRM, timer_callback) Start_Timer(300000000) While num < 99 Sleep 0.01 Wend Stop_Timer() timer_delete(id) End Private Procedure Start_Timer(vlr As Long) Dim spec As New Itimerspec With spec .it_value.tv_sec = 0 .it_value.tv_nsec = vlr ' Attende 300.000.000 di nanosecondi prima di inviare un segnale Timer .it_interval.tv_sec = 0 .it_interval.tv_nsec = vlr ' Invia un segnale Timer ogni 300.000.000 nanosecondi End With timer_create(CLOCK_REALTIME, 0, VarPtr(id)) timer_settime(id, 0, spec, Null) End Private Procedure timer_callback(signum As Integer) Print num; " Intercettato segnale Timer: "; signum Inc num End Private Procedure Stop_Timer() Dim spec As New Itimerspec With spec .it_value.tv_sec = 0 .it_value.tv_nsec = 0 .it_interval.tv_sec = 0 .it_interval.tv_nsec = 0 End With timer_settime(id, 0, spec, Null) timer_delete(id) End
Riferimenti
- http://man7.org/linux/man-pages/man2/timer_create.2.html
- http://pubs.opengroup.org/onlinepubs/009695399/functions/timer_create.html
- https://linux.die.net/man/2/timer_create
- http://www.gnu.org/software/libc/manual/html_node/Signal-Handling.html
- https://linux.die.net/man/2/signal
- http://digilander.libero.it/uzappi/C/librerie/funzioni/signal.html