

This example shows how to setup timer callbacks. It starts a timer that will tick (expire) every 1 second, and then setup other timers that will expire only once, but each of them will affect the first timer still executing with a different API, to demonstrate its usage. To see the full code for this example, click \mbox{\hyperlink{ecore_timer_example_8c-example}{here}}.

To demonstrate this, let\textquotesingle{}s define some constants that will determine at which time each timer will expire\+:


\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{\textcolor{comment}{//Compile\ with:}}
\DoxyCodeLine{\textcolor{comment}{//\ gcc\ -\/o\ ecore\_timer\_example\ ecore\_timer\_example.c\ `pkg-\/config\ -\/-\/libs\ -\/-\/cflags\ ecore`}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{preprocessor}{\#include\ <Ecore.h>}}
\DoxyCodeLine{\textcolor{preprocessor}{\#include\ <unistd.h>}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ TIMEOUT\_1\ 1.0\ }\textcolor{comment}{//\ interval\ for\ timer1}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ TIMEOUT\_2\ 3.0\ }\textcolor{comment}{//\ timer2\ -\/\ delay\ timer1}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ TIMEOUT\_3\ 8.2\ }\textcolor{comment}{//\ timer3\ -\/\ pause\ timer1}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ TIMEOUT\_4\ 11.0\ }\textcolor{comment}{//\ timer4\ -\/\ resume\ timer1}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ TIMEOUT\_5\ 14.0\ }\textcolor{comment}{//\ timer5\ -\/\ change\ interval\ of\ timer1}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ TIMEOUT\_6\ 18.0\ }\textcolor{comment}{//\ top\ timer1\ and\ start\ timer7\ and\ timer8\ with\ changed\ precision}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ TIMEOUT\_7\ 1.1\ }\textcolor{comment}{//\ interval\ for\ timer7}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ TIMEOUT\_8\ 1.2\ }\textcolor{comment}{//\ interval\ for\ timer8}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ DELAY\_1\ \ \ 3.0\ }\textcolor{comment}{//\ delay\ time\ for\ timer1\ -\/\ used\ by\ timer2}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ INTERVAL1\ 2.0\ }\textcolor{comment}{//\ new\ interval\ for\ timer1\ -\/\ used\ by\ timer5}}

\end{DoxyCodeInclude}
 These constants should tell by themselves what will be the behavior of the program, but I\textquotesingle{}ll explain it anyway. The first timer is set to tick every 1 second, but all the other timers until the 6th one will be started concurrently at the beginning of the program. Each of them will expire at the specified time in these constants\+:

\begin{DoxyItemize}
\item The timer2, after 3 seconds of the program being executed, will add a delay of 3 seconds to timer1; \item The timer3 will pause timer1 at 8.\+2 seconds; \item timer4 will resume timer1 at 11.\+0 seconds; \item timer5 will will change the interval of timer1 to 2 seconds; \item timer6 will stop timer1 and start timer7 and timer8, with 1.\+1 and 1.\+2 seconds of interval, respectively; it also sets the precision to 0.\+2 seconds; \item timer7 and timer8 will just print their expiration time.\end{DoxyItemize}

\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static}\ \textcolor{keywordtype}{double}\ \_initial\_time\ =\ 0;}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{struct\ }context\ \ \ \textcolor{comment}{//\ helper\ struct\ to\ give\ some\ context\ to\ the\ callbacks}}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_gaf96ffb609956658ec038e54bd39f46f0}{Ecore\_Timer}}\ *timer1;}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_gaf96ffb609956658ec038e54bd39f46f0}{Ecore\_Timer}}\ *timer2;}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_gaf96ffb609956658ec038e54bd39f46f0}{Ecore\_Timer}}\ *timer3;}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_gaf96ffb609956658ec038e54bd39f46f0}{Ecore\_Timer}}\ *timer4;}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_gaf96ffb609956658ec038e54bd39f46f0}{Ecore\_Timer}}\ *timer5;}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_gaf96ffb609956658ec038e54bd39f46f0}{Ecore\_Timer}}\ *timer6;}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_gaf96ffb609956658ec038e54bd39f46f0}{Ecore\_Timer}}\ *timer7;}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_gaf96ffb609956658ec038e54bd39f46f0}{Ecore\_Timer}}\ *timer8;}
\DoxyCodeLine{\};}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static}\ \textcolor{keywordtype}{double}}
\DoxyCodeLine{\_get\_current\_time(\textcolor{keywordtype}{void})}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{group__Ecore__Time__Group_ga98f2439b5d3e7114a75bfe2f0c22c4e9}{ecore\_time\_get}}()\ -\/\ \_initial\_time;}
\DoxyCodeLine{\}}

\end{DoxyCodeInclude}
 As almost all the other examples, we create a context structure to pass to our callbacks, so they can have access to the other timers. We also store the time of the program start in {\ttfamily \+\_\+initial\+\_\+time}, and use the function {\ttfamily \+\_\+get\+\_\+current\+\_\+time} to retrieve the current time relative to that time. This will help demonstrate what is going on.

Now, the behavior and relationship between the timers that was described above is dictated by the following timer callbacks\+:


\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static}\ \mbox{\hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}}}
\DoxyCodeLine{\_timer1\_cb(\textcolor{keywordtype}{void}\ *data\ \mbox{\hyperlink{group__Eina__Types__Group_ga82d751be730f849719ca292f9558be87}{EINA\_UNUSED}})}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ printf(\textcolor{stringliteral}{"{}Timer1\ expired\ after\ \%0.3f\ seconds.\(\backslash\)n"{}},\ \_get\_current\_time());}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{group__Ecore__Main__Loop__Group_ga1ee9db07f9a46a8b20fb83e1c6dbed09}{ECORE\_CALLBACK\_RENEW}};}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static}\ \mbox{\hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}}}
\DoxyCodeLine{\_timer2\_cb(\textcolor{keywordtype}{void}\ *data)}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \textcolor{keyword}{struct\ }context\ *ctxt\ =\ data;}
\DoxyCodeLine{\ \ \ printf(\textcolor{stringliteral}{"{}Timer2\ expired\ after\ \%0.3f\ seconds.\ "{}}}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}Adding\ delay\ of\ \%0.3f\ seconds\ to\ timer1.\(\backslash\)n"{}},}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \_get\_current\_time(),\ DELAY\_1);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga74a51cf0c7f07f1b48cac29cef5e8817}{ecore\_timer\_delay}}(ctxt-\/>timer1,\ DELAY\_1);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ ctxt-\/>timer2\ =\ NULL;}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{group__Ecore__Main__Loop__Group_gae0c653baad8836232c0dc27f91f875d6}{ECORE\_CALLBACK\_CANCEL}};}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static}\ \mbox{\hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}}}
\DoxyCodeLine{\_timer3\_cb(\textcolor{keywordtype}{void}\ *data)}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \textcolor{keyword}{struct\ }context\ *ctxt\ =\ data;}
\DoxyCodeLine{\ \ \ printf(\textcolor{stringliteral}{"{}Timer3\ expired\ after\ \%0.3f\ seconds.\ "{}}}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}Freezing\ timer1.\(\backslash\)n"{}},\ \_get\_current\_time());}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga9fb759297c1c828cafe5c3ccc1a2614b}{ecore\_timer\_freeze}}(ctxt-\/>timer1);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ ctxt-\/>timer3\ =\ NULL;}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{group__Ecore__Main__Loop__Group_gae0c653baad8836232c0dc27f91f875d6}{ECORE\_CALLBACK\_CANCEL}};}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static}\ \mbox{\hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}}}
\DoxyCodeLine{\_timer4\_cb(\textcolor{keywordtype}{void}\ *data)}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \textcolor{keyword}{struct\ }context\ *ctxt\ =\ data;}
\DoxyCodeLine{\ \ \ printf(\textcolor{stringliteral}{"{}Timer4\ expired\ after\ \%0.3f\ seconds.\ "{}}}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}Resuming\ timer1,\ which\ has\ \%0.3f\ seconds\ left\ to\ expire.\(\backslash\)n"{}},}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \_get\_current\_time(),\ \mbox{\hyperlink{group__Ecore__Timer__Group_gae07617b24116e69c9c973387c8c5f396}{ecore\_timer\_pending\_get}}(ctxt-\/>timer1));}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_gaa026b898456329411d043f36170ad644}{ecore\_timer\_thaw}}(ctxt-\/>timer1);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ ctxt-\/>timer4\ =\ NULL;}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{group__Ecore__Main__Loop__Group_gae0c653baad8836232c0dc27f91f875d6}{ECORE\_CALLBACK\_CANCEL}};}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static}\ \mbox{\hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}}}
\DoxyCodeLine{\_timer5\_cb(\textcolor{keywordtype}{void}\ *data)}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \textcolor{keyword}{struct\ }context\ *ctxt\ =\ data;}
\DoxyCodeLine{\ \ \ \textcolor{keywordtype}{double}\ interval\ =\ \mbox{\hyperlink{group__Ecore__Timer__Group_ga2be02360c275de1390b1f602dbc307cf}{ecore\_timer\_interval\_get}}(ctxt-\/>timer1);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ printf(\textcolor{stringliteral}{"{}Timer5\ expired\ after\ \%0.3f\ seconds.\ "{}}}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \textcolor{stringliteral}{"{}Changing\ interval\ of\ timer1\ from\ \%0.3f\ to\ \%0.3f\ seconds.\(\backslash\)n"{}},}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \_get\_current\_time(),\ interval,\ INTERVAL1);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga4d8f44e32858827d09866efba5e0ad35}{ecore\_timer\_interval\_set}}(ctxt-\/>timer1,\ INTERVAL1);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ ctxt-\/>timer5\ =\ NULL;}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{group__Ecore__Main__Loop__Group_gae0c653baad8836232c0dc27f91f875d6}{ECORE\_CALLBACK\_CANCEL}};}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static}\ \mbox{\hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}}}
\DoxyCodeLine{\_timer7\_cb(\textcolor{keywordtype}{void}\ *data)}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \textcolor{keyword}{struct\ }context\ *ctxt\ =\ data;}
\DoxyCodeLine{\ \ \ printf(\textcolor{stringliteral}{"{}Timer7\ expired\ after\ \%0.3f\ seconds.\(\backslash\)n"{}},\ \_get\_current\_time());}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ ctxt-\/>timer7\ =\ NULL;}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{group__Ecore__Main__Loop__Group_gae0c653baad8836232c0dc27f91f875d6}{ECORE\_CALLBACK\_CANCEL}};}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static}\ \mbox{\hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}}}
\DoxyCodeLine{\_timer8\_cb(\textcolor{keywordtype}{void}\ *data)}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \textcolor{keyword}{struct\ }context\ *ctxt\ =\ data;}
\DoxyCodeLine{\ \ \ printf(\textcolor{stringliteral}{"{}Timer8\ expired\ after\ \%0.3f\ seconds.\(\backslash\)n"{}},\ \_get\_current\_time());}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ ctxt-\/>timer8\ =\ NULL;}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{group__Ecore__Main__Loop__Group_gae0c653baad8836232c0dc27f91f875d6}{ECORE\_CALLBACK\_CANCEL}};}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keyword}{static}\ \mbox{\hyperlink{group__Eina__Types__Group_ga3fe0caf72e93b1bab1ca8ee3ccf3f226}{Eina\_Bool}}}
\DoxyCodeLine{\_timer6\_cb(\textcolor{keywordtype}{void}\ *data)}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \textcolor{keyword}{struct\ }context\ *ctxt\ =\ data;}
\DoxyCodeLine{\ \ \ printf(\textcolor{stringliteral}{"{}Timer6\ expired\ after\ \%0.3f\ seconds.\(\backslash\)n"{}},\ \_get\_current\_time());}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ printf(\textcolor{stringliteral}{"{}Stopping\ timer1.\(\backslash\)n"{}});}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga7c118b6a6d232b63a6500e599d2a1b47}{ecore\_timer\_del}}(ctxt-\/>timer1);}
\DoxyCodeLine{\ \ \ ctxt-\/>timer1\ =\ NULL;}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ printf(\textcolor{stringliteral}{"{}Starting\ timer7\ (\%0.3fs)\ and\ timer8\ (\%0.3fs).\(\backslash\)n"{}},}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ TIMEOUT\_7,\ TIMEOUT\_8);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ ctxt-\/>timer7\ =\ \mbox{\hyperlink{group__Ecore__Timer__Group_ga926423e464d7ef71105dd822d90e1187}{ecore\_timer\_add}}(TIMEOUT\_7,\ \_timer7\_cb,\ ctxt);}
\DoxyCodeLine{\ \ \ ctxt-\/>timer8\ =\ \mbox{\hyperlink{group__Ecore__Timer__Group_ga926423e464d7ef71105dd822d90e1187}{ecore\_timer\_add}}(TIMEOUT\_8,\ \_timer8\_cb,\ ctxt);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_gaf7d0f56778f5614c63a69d4cfbee7b3d}{ecore\_timer\_precision\_set}}(0.2);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ ctxt-\/>timer6\ =\ NULL;}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{return}\ \mbox{\hyperlink{group__Ecore__Main__Loop__Group_gae0c653baad8836232c0dc27f91f875d6}{ECORE\_CALLBACK\_CANCEL}};}
\DoxyCodeLine{\}}

\end{DoxyCodeInclude}
 It\textquotesingle{}s possible to see the same behavior as other Ecore callbacks here, returning \mbox{\hyperlink{group__Ecore__Main__Loop__Group_ga1ee9db07f9a46a8b20fb83e1c6dbed09}{ECORE\+\_\+\+CALLBACK\+\_\+\+RENEW}} when the timer needs to continue ticking, and \mbox{\hyperlink{group__Ecore__Main__Loop__Group_gae0c653baad8836232c0dc27f91f875d6}{ECORE\+\_\+\+CALLBACK\+\_\+\+CANCEL}} when it needs to stop its execution. Also notice that later on our program we are checking for the timers pointers in the context to see if they are still executing before deleting them, so we need to set these timer pointers to {\ttfamily NULL} when we are returning \mbox{\hyperlink{group__Ecore__Main__Loop__Group_gae0c653baad8836232c0dc27f91f875d6}{ECORE\+\_\+\+CALLBACK\+\_\+\+CANCEL}}. Otherwise the pointer would still be not {\ttfamily NULL}, but pointing to something that is invalid, since the timer would have already expired without renewing.

Now the main code, which will start the timers\+:


\begin{DoxyCodeInclude}{0}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keywordtype}{int}}
\DoxyCodeLine{main(\textcolor{keywordtype}{void})}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \textcolor{keyword}{struct\ }context\ ctxt\ =\ \{0\};}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{if}\ (!\mbox{\hyperlink{group__Ecore__Init__Group_ga77757609684a2c922dc5ec398274751b}{ecore\_init}}())}
\DoxyCodeLine{\ \ \ \ \ \{}
\DoxyCodeLine{\ \ \ \ \ \ \ \ printf(\textcolor{stringliteral}{"{}ERROR:\ Cannot\ init\ Ecore!\(\backslash\)n"{}});}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ -\/1;}
\DoxyCodeLine{\ \ \ \ \ \}}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \_initial\_time\ =\ \mbox{\hyperlink{group__Ecore__Time__Group_ga98f2439b5d3e7114a75bfe2f0c22c4e9}{ecore\_time\_get}}();}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ ctxt.timer1\ =\ \mbox{\hyperlink{group__Ecore__Timer__Group_ga926423e464d7ef71105dd822d90e1187}{ecore\_timer\_add}}(TIMEOUT\_1,\ \_timer1\_cb,\ \&ctxt);}
\DoxyCodeLine{\ \ \ ctxt.timer2\ =\ \mbox{\hyperlink{group__Ecore__Timer__Group_ga926423e464d7ef71105dd822d90e1187}{ecore\_timer\_add}}(TIMEOUT\_2,\ \_timer2\_cb,\ \&ctxt);}
\DoxyCodeLine{\ \ \ ctxt.timer3\ =\ \mbox{\hyperlink{group__Ecore__Timer__Group_ga926423e464d7ef71105dd822d90e1187}{ecore\_timer\_add}}(TIMEOUT\_3,\ \_timer3\_cb,\ \&ctxt);}
\DoxyCodeLine{\ \ \ ctxt.timer4\ =\ \mbox{\hyperlink{group__Ecore__Timer__Group_ga926423e464d7ef71105dd822d90e1187}{ecore\_timer\_add}}(TIMEOUT\_4,\ \_timer4\_cb,\ \&ctxt);}
\DoxyCodeLine{\ \ \ ctxt.timer5\ =\ \mbox{\hyperlink{group__Ecore__Timer__Group_ga926423e464d7ef71105dd822d90e1187}{ecore\_timer\_add}}(TIMEOUT\_5,\ \_timer5\_cb,\ \&ctxt);}
\DoxyCodeLine{\ \ \ ctxt.timer6\ =\ \mbox{\hyperlink{group__Ecore__Timer__Group_ga926423e464d7ef71105dd822d90e1187}{ecore\_timer\_add}}(TIMEOUT\_6,\ \_timer6\_cb,\ \&ctxt);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ printf(\textcolor{stringliteral}{"{}start\ the\ main\ loop.\(\backslash\)n"{}});}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Main__Loop__Group_gaf103b9f668bb3e4fed12e52c6180132d}{ecore\_main\_loop\_begin}}();}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{if}\ (ctxt.timer1)}
\DoxyCodeLine{\ \ \ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga7c118b6a6d232b63a6500e599d2a1b47}{ecore\_timer\_del}}(ctxt.timer1);}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{if}\ (ctxt.timer2)}
\DoxyCodeLine{\ \ \ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga7c118b6a6d232b63a6500e599d2a1b47}{ecore\_timer\_del}}(ctxt.timer2);}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{if}\ (ctxt.timer3)}
\DoxyCodeLine{\ \ \ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga7c118b6a6d232b63a6500e599d2a1b47}{ecore\_timer\_del}}(ctxt.timer3);}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{if}\ (ctxt.timer4)}
\DoxyCodeLine{\ \ \ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga7c118b6a6d232b63a6500e599d2a1b47}{ecore\_timer\_del}}(ctxt.timer4);}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{if}\ (ctxt.timer5)}
\DoxyCodeLine{\ \ \ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga7c118b6a6d232b63a6500e599d2a1b47}{ecore\_timer\_del}}(ctxt.timer5);}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{if}\ (ctxt.timer6)}
\DoxyCodeLine{\ \ \ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga7c118b6a6d232b63a6500e599d2a1b47}{ecore\_timer\_del}}(ctxt.timer6);}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{if}\ (ctxt.timer7)}
\DoxyCodeLine{\ \ \ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga7c118b6a6d232b63a6500e599d2a1b47}{ecore\_timer\_del}}(ctxt.timer7);}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{if}\ (ctxt.timer8)}
\DoxyCodeLine{\ \ \ \ \ \mbox{\hyperlink{group__Ecore__Timer__Group_ga7c118b6a6d232b63a6500e599d2a1b47}{ecore\_timer\_del}}(ctxt.timer8);}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \mbox{\hyperlink{group__Ecore__Init__Group_ga768298b932f18d7e7593a447493e5cde}{ecore\_shutdown}}();}
\DoxyCodeLine{}
\DoxyCodeLine{\ \ \ \textcolor{keywordflow}{return}\ 0;}
\DoxyCodeLine{\}}

\end{DoxyCodeInclude}
 This code is very simple. Just after starting the library, it will save the current time to {\ttfamily \+\_\+initial\+\_\+time}, start all timers from 1 to 6, and begin the main loop. Everything should be running right now, displaying the time which each timer is expiring, and what it is doing to affect the other timers.

After returning from the main loop, every timer is checked to see if it\textquotesingle{}s still alive and, in that case, deleted, before finalizing the library. This is not really necessary, since \mbox{\hyperlink{group__Ecore__Init__Group_ga768298b932f18d7e7593a447493e5cde}{ecore\+\_\+shutdown()}} will already delete them for you, but it\textquotesingle{}s good practice if you have other things going on after this point that could restart the main loop. 