Hallo,
ich bin dabei einen timer zu bauen, der nur einmal nach dem Start
ablaufen soll und dann ist Schluss.
das Problem ist, dass der timer wahrscheinlich nach dem "0-setzen" schon
wieder losgelaufen ist und seine Arbeit erst zuende bringen will. die
Folge ist, er läuft 2 mal durch.
root:~> ./timer
Timer went off.
Timer went off.
root:~>
hat jemand eine Idee, was ich ändern müsste um dem timer sofort nach dem
ersten ablauf den Gar aus zumachen?
vielen Dank im Voraus
ralph
mein code:
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#define INTERVAL 5000
void DoStuff(void);
volatile int status;
int main(int argc, char *argv[])
{
struct itimerval it_val; /* for setting itimer */
if (SIG_ERR == signal(SIGALRM, (void (*) (int)) DoStuff))
{
perror("Unable to catch SIGALRM");
}
status = 1;
it_val.it_value.tv_sec = INTERVAL/1000;
it_val.it_value.tv_usec = (INTERVAL*1000) % 1000000;
it_val.it_interval = it_val.it_value;
if (setitimer(ITIMER_REAL, &it_val, NULL) == -1)
{
perror("error calling setitimer()");
}
while (1)
{
if(status == 0)
{
it_val.it_value.tv_sec = 0;
it_val.it_value.tv_usec = 0;
it_val.it_interval = it_val.it_value;
break;
}
}
pause();
return 0;
}
void DoStuff(void)
{
printf("Timer went off.\n");
status = 0;
}
Ralph Feuchter schrieb:1 | > while (1) |
2 | > { |
3 | > if(status == 0) |
4 | > { |
5 | > it_val.it_value.tv_sec = 0; |
6 | > it_val.it_value.tv_usec = 0; |
7 | > it_val.it_interval = it_val.it_value; |
8 | > break; |
9 | > } |
10 | > } |
11 | > pause(); |
Naja, du wartest hier in einer Schleife (übrigens böse...) darauf, daß status 0 wird, also der Timer ausgelöst wird. Danach rufst du pause() auf, das wartet, bis ein Signal ausgelöst wird. Und was versprichst du dir davon:
1 | > it_val.it_value.tv_sec = 0; |
2 | > it_val.it_value.tv_usec = 0; |
3 | > it_val.it_interval = it_val.it_value; |
Da weist du einer Variablen etwas zu, das du danach nirgends benutzt.
danke für die Antwort eigentlich ist das nur ein Test um die Funtionalität auszuprobieren. Ich habe auch schon pause() weggelasssen und einen langen sleep()dafür benutzt um ein weiteren Programablauf zu simulieren (gleiches Ergebnis). klar, wenn ich das nicht mache, wird nur einmal getriggert, da das Programm eher abgelaufen ist bevor der timer das zweitmal ausgelöst wird. Rolf Magnus schrieb: > Da weist du einer Variablen etwas zu, das du danach nirgends benutzt. das "0-setzen" mache ich um den timer zu stoppen, was, glaube ich, wohl nicht die richtige Variante ist. aber das war gerade der Kern meiner Farge. ralph
feucom schrieb: > Rolf Magnus schrieb: >> Da weist du einer Variablen etwas zu, das du danach nirgends benutzt. > > das "0-setzen" mache ich um den timer zu stoppen, was, glaube ich, wohl > nicht die richtige Variante ist. aber das war gerade der Kern meiner > Farge. Wie gesagt, du schreibst halt einen Wert in eine Variable, aber das ändert erstmal nichts. Du mußt dann schon nochmal setitimer mit dem neuen Wert aufrufen. Aber warum läßt du nicht gleich it_interval auf 0, dann ist der Timer gar nicht erst zyklisch.
Rolf Magnus schrieb: > it_interval auf 0 Ok vielen Dank!! ich werde es ausprobieren. das wars sicher was ich suchte. und dann kann ich ja auch das "0-setzen" + anschliessendes stitemer() weglassen. Ich gehe mal davon aus, um ihn wieder zu starten rufe ich einfach setitimer() auf und er làuft wieder los. Nur noch eine Frage, kann man so auch mehrere timer parallel laufen lassen?
prima, hat alles geklappt. vielen Dank so làuft er nur einmal durch: it_val.it_value.tv_sec = 3; it_val.it_value.tv_usec = 0; it_val.it_interval.tv_sec = 0; it_val.it_interval.tv_usec = 0; setitimer(ITIMER_REAL, &it_val, NULL) Aber eine Sache interessiert mich noch. Da der SIGALARM [14] bemüht wird kann also nur ein timer definiert werden, denke ich. was müsste ich machen um mehr einen timer parallel laufen zu lassen?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.