Waitable Timer unter Linux

Tikonteroga

Erfahrenes Mitglied
Hallo,

ich muss unter Linux einen Thread erstellen, der alle n Sekunden eine bestimmte Aktion durchführt.

Unter Windows habe ich so etwas schön einmal gelöst. Dabei habe ich einen WaitableTimer verwendet und in einer Schleife mit WaitForSingleObjects auf das ablaufen des Timers gewartet.

Jetzt versuche ich das mit POSIX Thread und Timer unter Linux zu realiiseren.

Ich bin soweit, dass ich einen pthread erstellt habe, der timer_create und timer_settime mit den Default-Einstellungen aufruft. Doch ich kann nicht herausfinden, wie ich jetzt in einer Schleife recourcenschonend auf so ein Signal warten kann, dass durch den POSIX Timer nach ablaufen des Timers gefeuert wird.

Währe euch sehr dankbar wenn ihr mir mit einem Code-Beispiel weiterhelfen könntet. Ich suche schon seit mehreren Stunden unter google. Aber die LINUX libs sind meiner Meinung nach ganz schön schlecht dokumentiert ---> ("Example: none" ^^).

Gruß

Tikonteroga
 
Linux ist nicht gleich Linux. Welche Distribution?
Welche Priorität hat deine Aktion? MUSS sie alle 1000ms ausgeführt werden oder reicht es das Sich das ganze auf 1100ms verschiebt, aber allgemien immer in dem ersten Bruchteil der jeweiligen Sekunde bleibt, d.h. dadurch keiner Auswirkung auf die danachfoglende Aktion im Time-Managemend hat.
Mir ist keine API unter Linux bekannte welche Timer mit liefert. Somit musst du dies selber Programmieren. Du musst mit dme Prozessor-Takt arbeiten.

MFG

EDIT:

Doch ich kann nicht herausfinden, wie ich jetzt in einer Schleife recourcenschonend auf so ein Signal warten kann, dass durch den POSIX Timer nach ablaufen des Timers gefeuert wird.
Tikonteroga
Was meisnt du damit?


Das mit dem POSIX Timer nicht gelesen.
Meinst du so etwas als Beispiel?:
C++:
void TimerHandler(timer_t id_timer,int own_value)
{
    printf("1sec later \n");
}

void startTimer(void)
{
    timer_t id_timer;
    struct itimerspec value;

    value.it_value.tv_sec = 1;
    value.it_value.tv_nsec = 0;

    value.it_interval.tv_sec = 1;
    value.it_interval.tv_nsec = 0;

    timer_create (CLOCK_REALTIME, NULL, &id_timer);
    timer_connect (id_timer, TimerHandler, 0);
    timer_settime (id_timer, 0, &value, NULL);
}
 
Zuletzt bearbeitet:
Hallo,

ja genau, das Beispiel von dir habe ich auch schon implementiert. Bis jedoch auf den Aufruf von timer_connect und die Callback Funktion.

Der Timer soll möglichst auch nach ca. 1 ms auslösen können. Als Betriebssystem kommt ein Realtime-Linux zum Einsatz.

Ich habe mal dein Beispiel etwas modifiziert.

Code:
/* PTHREAD */
void* Thread(void* param)
{    
	timer_t id_timer;    
	struct itimerspec value;     
	value.it_value.tv_sec = 1;    
	value.it_value.tv_nsec = 0;     
	value.it_interval.tv_sec = 1;    
	value.it_interval.tv_nsec = 0;     
	
	timer_create (CLOCK_REALTIME, NULL, &id_timer);
	timer_settime (id_timer, 0, &value, NULL);

	while(1)
	{
		// 1. Warten, dass der Timer signalisiert.

		// 2. Zeitgesteuerte Aktionen durchführen
	}
}

Unter /* 1. */ sollte jetzt ein LINUX äquivalent zu der Funktion WaitForSingleObjects() stehen, die man unter Windows verwenden kann.

Wenn ich unter Windows den Mechanismus mit der Callback Funktion gewählt hatte, wurde der Aufruf der Callback Funktion oft blockiert. Ich weiss nicht ob das unter Linux genau so ist.
 
Zurück