|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jun 2005
Messaggi: 121
|
[C++] Timer che funziona in background
Salve a tutti
Sto scrivendo un programma in C su Linux (non sono molto esperto, quindi lo faccio in modo molto spartano) e avrei bisogno di un timer che agisce in background (quindi nel frattempo il programma principale continua a girare) e che ad intervalli prestabiliti mi faccia eseguire delle funzioni, dopodichè torna al programma principale fino alla nuova chiamata. Per windows ho una funzione che però usa librerie windows.h, mentre io ho bisogno di implementarlo in Linux. Penso che non vadano bene le funzioni sleep, e meno che non riesca a farle eseguire in un thread in background ma non saprei come fare. Se qualcuno può aiutarmi grazie mille! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Puoi usare obrobri tipo alarm o setitimer, ma io risolverei con un veloce thread dedicato.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jun 2005
Messaggi: 121
|
grazie
Un thread dedicato in cosa consisterebbe e come andrebbe implementato? Scusa ma non sono molto pratico e non so proprio da dove partire! Soprattutto è un metodo sicuro? Non ho bisogno di una precisione al microsecondo, ma una cosa che ogni es. 2 minuti (ripeto non importa un millisecondo in più o in meno, però deve partire) mi fa eseguire una serie di funzioni sui dati acquisiti (e messi in variabili) dal programma principale nel frattempo grazie di nuovo Ultima modifica di PoliX : 26-09-2007 alle 13:00. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Non sai cosa sono i thread? Non posso spiegartelo in due righe...
Usa alarm allora, con i thread dovresti gestire eventuali problemi di concorrenza. Se non conosci i thread tantomeno conosci i problemi connessi.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
scusa ma se il programma e´ semplice ti basta chiamare una funzione ad ogni fine o inizio main loop e controllare se il tempo passato e´ >= 2 minuti allora esegui quello che ti serve e resetti il timer senno` fai niente.
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
perche´ obrobri ?
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Jun 2005
Messaggi: 121
|
Quote:
Inoltre il main loop sta fermo in attesa di leggere da seriale ed a questo punto fa un ciclo, quindi non è detto che possa controllare con continuità il tempo trascorso. Eventualmente dovrei impostare dei timeout della seriale ma preferirei evitarlo. Sarebbe meglio avere delle chiamate periodiche indipendente dal main. Scusate se non mi spiego con linguaggio corretto ma di informatica ho dato solo un esame al primo anno di ingegneria! Per ora sto provando a capire come funziona alarm, grazie per i consigli! ciao |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Peché usano degli obrobri (i segnali).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Per esempio questo programma stampa "Time To" e ritorna 1 ogni 5 secondi, altrimenti ritorna 0. Il tutto dentro un loop "ultrasleepato" nel senso che fai una usleep per non impiegare tutte le risorse ma senza rallentarlo troppo (tipo con una sleep). Codice:
#include <stdio.h>
#include <time.h>
int IsTimeTo()
{
static time_t Time = 0;
if (time(NULL) - Time >= 5)
{
Time = time(NULL);
puts( "Time To" );
return 1;
}
return 0;
}
int main(int argc, char* argv[])
{
while(1)
{
IsTimeTo();
usleep(2000);
}
}
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jun 2005
Messaggi: 121
|
si grazie, per ora penso che adotterò questa soluzione.
Nella read ho il O_NONBLOCK, però i devo vedere come impostare i timeout della seriale perchè fino ad ora erano ad attesa infinita. Poi vedrò come andrà nel programma finale e quali errori di temporizzazione mi comporta (che più o meno sarà al massimo del tempo di un loop, ma non so questo di che ordine sia) |
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
ecco la mia spiegazione: @PoliX: un programma può essere costituito da più parti che girano contemporaneamente: si chiamano thread. su Linux per eseguire una funzione contemporaneamente al resto del programma puoi usare la funzione pthread_create. una riga virgola 6 sul mio monitor (1280x1024), prova a far di meglio
|
|
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Ultimamente è stata sviluppata una nuova interfaccia, finalmente decente, per la gestione dei segnali (signalfd).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Non puoi parlare dei thread senza parlare dei problemi di concorrenza
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#15 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#16 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Tutti gli altri usi che se ne sono fatti sono dovuti a limitazioni dei sistemi unix, che non fornivano alternative su come fare certe cose. Oggi le alternative ci sono, e i segnali possono benissimo essere abbandonati, ad eccezione di quelli fatali (SEGV, ILL, e simili). Almeno su linux.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#19 | ||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() non per altro ma perché se poi su quel sistema operativo io ci devo programmare per studio ed in futuro per lavoro, allora preferisco non aver nulla a che fare coi segnali Quote:
Ultima modifica di 71104 : 28-09-2007 alle 02:46. |
||
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Ovvio che _oggi_ ti sembrano obsoleti, e non mi sembra che li sto difendendo.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:43.













LUNGA VITA AI POJO!








