From c23ca903cd2479043c67fd8094581475b9af296b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20B=C3=A9nier?= Date: Mon, 7 Sep 2015 10:20:55 +0200 Subject: [PATCH] Wiki page main_loop_pg created: 1 main + 5 PG + index + 2 images MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Clément Bénier --- media/mainloop_idlers.png | Bin 0 -> 6996 bytes media/mainloop_pos_map_all.png | Bin 0 -> 35966 bytes pages/docs.txt | 1 + pages/program_guide/index.txt | 1 + pages/program_guide/main_loop/animators.txt | 130 ++++++++++++++++++ .../main_loop/file_descriptors.txt | 96 +++++++++++++ pages/program_guide/main_loop/idlers.txt | 70 ++++++++++ pages/program_guide/main_loop/index.txt | 5 + pages/program_guide/main_loop/threads.txt | 123 +++++++++++++++++ pages/program_guide/main_loop/timers.txt | 105 ++++++++++++++ pages/program_guide/main_loop_pg.txt | 63 +++++++++ 11 files changed, 594 insertions(+) create mode 100644 media/mainloop_idlers.png create mode 100644 media/mainloop_pos_map_all.png create mode 100644 pages/program_guide/main_loop/animators.txt create mode 100644 pages/program_guide/main_loop/file_descriptors.txt create mode 100644 pages/program_guide/main_loop/idlers.txt create mode 100644 pages/program_guide/main_loop/index.txt create mode 100644 pages/program_guide/main_loop/threads.txt create mode 100644 pages/program_guide/main_loop/timers.txt create mode 100644 pages/program_guide/main_loop_pg.txt diff --git a/media/mainloop_idlers.png b/media/mainloop_idlers.png new file mode 100644 index 0000000000000000000000000000000000000000..9d497a405a062996b2336d3ad4b4893cccd8d213 GIT binary patch literal 6996 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�m|Ii@)4BG+4&lC7;`+4G4IDb)DE(N}g9T@DCXZZE@-{p**U|*f)3&ycU7R7CC(~sTw{e)&udO7_$jQ$GC z%UFuT378i>pK|roET6+Z^Vfzk)WhCOF}ao7cBRJpYIzI2r+q%YG_RlK?Bx0+4T`u! zWp?m}%n79v7QgzTPnI`fxjOH|wq}}uwXtjpgMF}GiEU+U1ia)EY;My2HOp^@1bGnn zyRXJ>Vfj>ZJ+N(@;8ytgv~BD2D{SlKVK+u|F|;GGZJR4-J}CA)mNM=&A3SRUd$*#4 z<~&Qq6na-I|MNJ^qa9?N|L+{ymS4QB_p-z%v;34^Gq6ya(|r(5#Ny)i1^(#&AK>46 zw@)%%Xg(dD%g1|#U(Y!2Z<8@^{UKNm*DFHy;ZFX(@4A8WYd5BL^u9X4uOUZ&pPWVo zJd5P@yE-XBr7xoXZ{Epk{d3|7}&t0Nrip_ghW0_?h^tOG&4aJq+pdaaT zcG$6#&tfcmVx0G}{IH8^v}xG>JSc?zDu*3Q{BO%L^;EeGsPMgnX}eN$-gzv4nE7q& z;OwQoxOv3eU=7T3f31dS^GdeZ;jfK0^POCA<~)~Q`r}RkgX%1oajqRF06XP^g%#lik<|Zmm!DiKQX$vl{&Q$$9Nk?2wk`2h9&zoF59c^@muol)6^5 zBks+-(G`2{Al$xrpI4|YcJtRy&+`=SjK$Ih52{`3jsm>x3-yT^Qu8emX5Q=UM%kNz z|4($ot8^yjepix6YErFo!SJykAY?j?-e%4xg7C9b&- zwmX;q{KjsyFZKVu?sHuS4b^N?m*MMGiDw}+KWKgsLI^37RB-`?Pp;3z;_ITIJGQO( zb%C~gjKWzkYUz4}(EOnJL5OOxEf#a1@2%~Od3U4ACiD{u@3M8GcnyqNx*j2b;@kI8 zZix;qaUF4lRV3|tgwXt;`9X+kF3^kh>A?|R#|*-S6xQnX2qA{ABindex}} +--------- +===== Animators ===== + +Animators are a specific type of timer, specially designed for on-screen +animation purposes: + + * The time interval is usually known when they are created. + * They are called at each screen refresh and their interval can vary. The interval can depend on the system load, the target power consumption, and other factors. The exact interval is not relevant. + +To implement animators, Ecore provides the Ecore animator subsystem. + +=== Table of Contents === + + * [[#Forever-running_Animator|Forever-running Animator]] + * [[#Specific-duration_Animator|Specific-duration Animator]] + * [[#To_create_and_destroy_the_animator|To create and destroy the animator]] + * [[#To_create_the_animator|To create the animator]] + * [[#To_destroy_the_animator|To destroy the animator]] + * [[#To_manage_the_animator|To manage the animator]] + * [[#To_pause_the_currently_running_animator|To pause the currently running animator]] + * [[#To_query_Ecore_for_the_interval_between_2_animator_calls|To query Ecore for the interval between 2 animator calls]] + * [[#To_change_the_interval|To change the interval]] + +=== Related Info === + + * [[https://build.enlightenment.org/job/nightly_efl_gcc_x86_64/lastSuccessfulBuild/artifact/doc/html/group__Ecore__Animator__Group.html|Ecore Animator functions API]] + * [[https://build.enlightenment.org/job/nightly_efl_gcc_x86_64/lastSuccessfulBuild/artifact/doc/html/tutorial_ecore_animator.html|Ecore Animator Example]] + +==== Forever-running Animator ==== + +To create an animation that runs for an indefinite time: + + +Eina_Bool my_anim_cb(void *data) +{ + static int count = 0; + count++; + if (count < 5) + return ECORE_CALLBACK_RENEW; + + return ECORE_CALLBACK_CANCEL; +} +ecore_animator_add(my_anim_cb, my_data); + + +This example looks the same as the one using an Ecore timer. The +''ecore_animator_add()'' function takes the callback function and data to pass +to it, and returns an ''Ecore_Animator'' object. The function is called at a +system-defined interval until it returns ''ECORE_CALLBACK_CANCEL'' instead of +''ECORE_CALLBACK_RENEW''. + +==== Specific-duration Animator ==== + +An animator callback for an animator running a specific time has a different +prototype than the forever running animator. + +This callback function receives both data and a position which represents the +current time among the full timeline, 0 meaning the beginning of the +animation, and 1 meaning the end of the animation, returning +''ECORE_CALLBACK_CANCEL'' to abort, or ''ECORE_CALLBACK_RENEW'' to continue. + +==== To create and destroy the animator ==== + +== To create the animator == + +Use the ''ecore_animator_timeline_add()'' function. The first parameter +specifies the animator duration, the second parameter is the callback +function, and the third parameter is the data to pass to the callback. The +data parameter is optional. + + +Eina_Bool my_anim_cb(void *data, double position) +{ + if (position < .5) + return ECORE_CALLBACK_RENEW; + + return ECORE_CALLBACK_CANCEL; +} +ecore_animator_timeline_add(5., my_anim_cb, my_data); + + +In this example, the animator is specified to run for five seconds. The +function returns ''ECORE_CALLBACK_CANCEL'' as soon as the position among the +timeline passes half of the duration, 2.5 seconds. + +Ecore can generate a virtual position from the original one using +''ecore_animator_pos_map(position, map, v1, v2)''. Several maps are available: + + * ''ECORE_POS_MAP_LINEAR'': linear from 0.0 to 1.0. + * ''ECORE_POS_MAP_ACCELERATE'': start slow, then speed up. + * ''ECORE_POS_MAP_DECELERATE'': start fast, then slow down. + * ''ECORE_POS_MAP_SINUSOIDAL'': start slow, speed up, then slow down at the end. + * ''ECORE_POS_MAP_ACCELERATE_FACTOR'': start slow, then speed up, v1 being a power factor: 0.0 is linear, 1.0 is standard acceleration, 2.0 is a much more pronounced acceleration (squared), and 3.0 is cubed. + * ''ECORE_POS_MAP_DECELERATE_FACTOR'': start fast, then slow down, v1 being a power factor: 0.0 is linear, 1.0 is standard deceleration, 2.0 is a much more pronounced deceleration (squared), and 3.0 is cubed. + * ''ECORE_POS_MAP_SINUSOIDAL_FACTOR'': start slow, speed up, then slow down at the end, v1 being a power factor: 0.0 is linear, 1.0 is a standard sinusoidal, 2.0 is a much more pronounced sinusoidal (squared), and 3.0 is cubed. + * ''ECORE_POS_MAP_DIVISOR_INTERP'': start at gradient * v1, interpolated with the power of v2 curve. + * ''ECORE_POS_MAP_BOUNCE'': start at 0.0, then drop like a ball bouncing to the ground at 1.0, and bounce v2 times, with a decay factor of v1. + * ''ECORE_POS_MAP_SPRING'': start at 0.0, then wobble like a spring to the rest position 1.0, and wobble v2 times, with a decay factor of v1. + +{{ :mainloop_pos_map_all.png }} + +== To destroy the animator == + +Use the ''ecore_animator_del()'' function. The animator to destroy must be +running, that is, it has not returned a ''false'' value. If the animator is +not running, the function cannot be called. + + +==== To manage the animator ==== + +== To pause the currently running animator == + +Use the ''ecore_animator_freeze()'' function. Note that time continues ticking +even if the animator is frozen, and that resuming the animation using the +''ecore_animator_thaw()'' function does not actually resume, if the full +runtime has been passed in the meanwhile. + +== To query Ecore for the interval between 2 animator calls == + +Use the ''ecore_animator_frametime_get()'' function. + +== To change the interval == + +Use the ''ecore_animator_frametime_set(interval)'' function. Note that too +small a value causes performance and power consumption issues, and too high a +value makes the animation jerky. + +------ +{{page>index}} diff --git a/pages/program_guide/main_loop/file_descriptors.txt b/pages/program_guide/main_loop/file_descriptors.txt new file mode 100644 index 000000000..1f84af15b --- /dev/null +++ b/pages/program_guide/main_loop/file_descriptors.txt @@ -0,0 +1,96 @@ +{{page>index}} +--------- +===== File Descriptors ===== + +Ecore provides an infrastructure to monitor file descriptors, so that files do +not have to be blocked or polled to read or write on them. Instead, monitor +sockets, pipes, or other streams are used to get a file descriptor. + +=== Table of Contents === + + * [[#To_manage_the_file_descriptors|To manage the file descriptors]] + * [[#To_set_a_callback|To set a callback]] + * [[#To_listen_to_events|To listen to events]] + * [[#To_wait_for_incoming_data_on_the_file_descriptor|To wait for incoming data on the file descriptor]] + * [[#To_delete_a_file_descriptor_handler|To delete a file descriptor handler]] + * [[#To_get_the_handler's_file_descriptor|To get the handler's file descriptor]] + * [[#To_select_whether_a_flag_is_active_on_a_handler|To select whether a flag is active on a handler]] + * [[#To_change_the_flags_the_handler_is_monitoring|To change the flags the handler is monitoring]] + +=== Related Info === + + * [[https://build.enlightenment.org/job/nightly_efl_gcc_x86_64/lastSuccessfulBuild/artifact/doc/html/group__Ecore__FD__Handler__Group.html|File Descriptor Handling Functions API]] + * [[https://build.enlightenment.org/job/nightly_efl_gcc_x86_64/lastSuccessfulBuild/artifact/doc/html/ecore_fd_handler_example_c.html|File Descriptors Example]] + +==== To manage the file descriptors ==== + +== To set a callback == + +Use the ''_my_cb_func()'' function. Its first parameter is the data passed to +it (optional), and the second one is the Ecore file descriptor handler. Its +return value is, as in most Ecore callbacks, ''ECORE_CALLBACK_RENEW'' or +''ECORE_CALLBACK_CANCEL''. It tells Ecore whether it wants to be called again +or whether its treatment is finished. + +== To listen to events == + +Use the ''ecore_main_fd_handler_add()'' function. + +== To wait for incoming data on the file descriptor == + +To wait for incoming data (that is, to read data) on the ''my_fd'' file +descriptor, passing ''my_data'': + + +Eina_Bool my_fd_cb(void *data, Ecore_Fd_Handler *handler) +{ + int fd; + fd = ecore_main_fd_handler_fd_get(handler); + count = read(fd, buf, sizeof(buf)); // This is guaranteed not to block + + return ECORE_CALLBACK_RENEW; +} +ecore_main_fd_handler_add(my_fd, ECORE_FD_READ, my_fd_cb, my_data, NULL, NULL); + + +== To delete a file descriptor handler == + +Use the ''ecore_main_fd_handler_del()'' function. This does not close the file +descriptor. Always delete the handlers before closing the actual file +descriptors. + +== To get the handler's file descriptor == + +Use the ''ecore_main_fd_handler_fd_get()'' function. + +== To select whether a flag is active on a handler == + +Use the +''ecore_main_fd_handler_active_get()'' function. For example, the handler is +set to monitor both ''ECORE_FD_READ'' and ''ECORE_FD_ERROR''. The following +example finds out whether the function was called because of an error: + + +Eina_Bool my_fd_cb(void *data, Ecore_Fd_Handler *handler) +{ + int fd; + fd = ecore_main_fd_handler_fd_get(handler); + if (ecore_main_fd_handler_active_get(handler, ECORE_FD_ERROR) == EINA_TRUE) + { + // We have an error! + + return ECORE_CALLBACK_CANCEL; + } + count = read(fd, buf, sizeof(buf)); // This is guaranteed not to block + + return ECORE_CALLBACK_RENEW; +} +ecore_main_fd_handler_add(my_fd, ECORE_FD_READ | ECORE_FD_ERROR, my_fd_cb, my_data, NULL, NULL); + + +== To change the flags the handler is monitoring == + +Use the ''ecore_main_fd_handler_active_set()'' function. + +------- +{{page>index}} diff --git a/pages/program_guide/main_loop/idlers.txt b/pages/program_guide/main_loop/idlers.txt new file mode 100644 index 000000000..cdebe2ba7 --- /dev/null +++ b/pages/program_guide/main_loop/idlers.txt @@ -0,0 +1,70 @@ +{{page>index}} +-------------- +===== Idlers ===== + +When the rendering is done and all work is finished, the main loop enters its idle state until the next loop. You can get the functions of your application called back before the main loop enters or exits the idle state, or when it is in the idle state. They are respectively called ''Ecore_Idle_Enterer'', ''Ecore_Idle_Exiter'', and ''Ecore_Idler''. + +{{ :mainloop_idlers.png }} + +The idle enterers, exiters, and idlers all have the same prototype, +''my_idler()'', which receives data and returns ''ECORE_CALLBACK_RENEW'' or +''ECORE_CALLBACK_CANCEL'' to tell Ecore whether it wants to be called again or +is finished. + +=== Table of Contents === + + * [[#To_manage_the_idlers|To manage the idlers]] + * [[#To_add_an_idler|To add an idler]] + * [[#To_delete_an_idler|To delete an idler]] + * [[#To_add_and_delete_idle_exiters|To add and delete idle exiters]] + * [[#To_add_and_delete_idle_enterers|To add and delete idle enterers]] + +=== Related Info === + + * [[https://build.enlightenment.org/job/nightly_efl_gcc_x86_64/lastSuccessfulBuild/artifact/doc/html/group__Ecore__Idle__Group.html|Ecore Idle functions API]] + * [[https://build.enlightenment.org/job/nightly_efl_gcc_x86_64/lastSuccessfulBuild/artifact/doc/html/ecore_idler_example_c.html|Ecore Idle Example]] + +=== To manage the idlers === + +== To add an idler == + +Use the ''ecore_idler_add()'' function. + +== To delete an idler == + +Use the ''ecore_idler_del()'' function. + +== To add and delete idle exiters == + +Use the ''ecore_idle_exiter_add()'' and ''ecore_idle_exiter_del()'' functions. + +== To add and delete idle enterers == + +Use the ''ecore_idle_enterer_add()'' and ''ecore_idle_enterer_del()'' +functions. The ''ecore_idle_enterer_before_add()'' function is also available, +if you want your function to be added at the top of the list so that it is +called before the others. + + +Eina_Bool my_idle_enterer_cb(void *data) +{ + return ECORE_CALLBACK_RENEW; +} + +Eina_Bool my_idle_exiter_cb(void *data) +{ + return ECORE_CALLBACK_CANCEL; +} + +Eina_Bool my_idler(void *data) +{ + return ECORE_CALLBACK_RENEW; +} + +ecore_idle_enterer_add(my_idle_enterer_cb, my_data); +ecore_idle_exiter_add(my_idle_exiter_cb, my_data); +ecore_idler_add(my_idler_cb, my_data); + + +------- +{{page>index}} diff --git a/pages/program_guide/main_loop/index.txt b/pages/program_guide/main_loop/index.txt new file mode 100644 index 000000000..f2f14f9a9 --- /dev/null +++ b/pages/program_guide/main_loop/index.txt @@ -0,0 +1,5 @@ +++++Main Loop Menu| +^ [[/program_guide/main_loop_pg|Main Loop Guide]] ^^^^^ +| [[/program_guide/main_loop/timers|Timers]] | [[/program_guide/main_loop/animators|Animators]] | [[/program_guide/main_loop/file_descriptors|File Descriptors]] | [[/program_guide/main_loop/threads|Threads]] | [[/program_guide/main_loop/idlers|Idlers]] | +++++ + diff --git a/pages/program_guide/main_loop/threads.txt b/pages/program_guide/main_loop/threads.txt new file mode 100644 index 000000000..879b76f62 --- /dev/null +++ b/pages/program_guide/main_loop/threads.txt @@ -0,0 +1,123 @@ +{{page>index}} +--------- +===== Threads ==== + +EFL is not entirely thread-safe. This means that if a task is running in +another thread and, for example, an Evas object shows the status progress of +this task, the object cannot be updated from within the thread. Updating can +only be done from the main thread that runs the main loop. + +Ecore provides a facility to perform tasks on separate worker threads. It is +not a simple wrapper around standard threads provided by the operating system. +With Ecore threads, it is easier to dispatch a worker function to perform some +heavy tasks and get the result once it completes. It does not block the +application UI. It is also easy to cancel and reschedule threads. Several +threads can be launched simultaneously, since Ecore schedules them according +to the number of processors the system has and the maximum amount of +concurrent threads set for the application. + +Ecore has 2 kinds of threads: + + * Short jobs do not give any kind of information on their status to the parent. They are best used for short computing-intensive snippets of code. + * Feedback jobs give information on their status to the parent. They are best used for longer snippets requiring a feedback loop, such as an ongoing file download. + +=== Table of Contents === + + * [[#To_manage_threads|To manage threads]] + * [[#To_cancel_a_thread|To cancel a thread]] + * [[#To_execute_a_thread_later|To execute a thread later]] + * [[#To_get_the_maximum_number_of_concurrent_threads|To get the maximum number of concurrent threads]] + * [[#To_query_the_number_of_active_threads|To query the number of active threads]] + +=== Related Info === + + * [[https://build.enlightenment.org/job/nightly_efl_gcc_x86_64/lastSuccessfulBuild/artifact/doc/html/group__Ecore__Thread__Group.html|Ecore Thread functions API]] + * [[https://build.enlightenment.org/job/nightly_efl_gcc_x86_64/lastSuccessfulBuild/artifact/doc/html/ecore_thread_example_c.html|Ecore Thread Example]] + +Ecore creates a pool of worker threads. The exact count is computed from the +number of CPUs or cores, or it can be specified by the application itself. + +When a worker thread is idle, it picks a job to execute from the waiting list +until there is none left. In the following example, there are 2 threads +defined by ''my_short_job()'' and ''my_feedback_job()''. Both threads take 2 +parameters: some data passed to them, and the actual thread running. Call a +callback when the jobs end, whether they are cancelled (''my_job_cancel()'') +or end normally (''my_job_end()''). + + +struct feedback_msg +{ + int pos; +}; + +void my_short_job(void *data, Ecore_Thread *thread) +{ + usleep(200000); +} + +void my_feedback_job(void *data, Ecore_Thread *thread) +{ + int i; + for (i = 0; i < 100; i++) + { + usleep(50000); // You can have some real computation done + struct feedback_msg *message = malloc(sizeof(struct feedback_msg)); + if (message) + { + message->pos = i; + ecore_thread_feedback(thread, message); + } + if (ecore_thread_check(thread)) + return; + } +} + +void my_feedback_job_notify(void *data, Ecore_Thread *thread, void *msg) +{ + struct feedback_msg *message = msg; + free(message); +} + +void my_job_end(void *data, Ecore_Thread *thread) +{ + printf("Thread has normally ended.\n"); +} + +void my_job_cancel(void *data, Ecore_Thread *thread) +{ + printf("Thread has been cancelled.\n"); +} + +ecore_thread_run(my_short_job, my_job_end, my_job_cancel, my_data); +ecore_thread_feedback_run(my_feedback_job, my_feedback_job_notify, my_job_end, my_job_cancel, my_data, EINA_FALSE); + + +==== To manage threads ==== + +== To cancel a thread == + +Use the ''ecore_thread_cancel()'' function. However, note that this is done +cooperatively: the thread continues to run until it exists. Call the +''ecore_thread_check()'' function regularly to check whether the thread has +been marked for cancellation and exit if ''true''. + +== To execute a thread later == + +Use the ''ecore_thread_reschedule()'' function. This function is added to the +end of the pending tasks. + +== To get the maximum number of concurrent threads == + +Use the ''ecore_thread_max_get()'' function. If needed, set it by using the +''ecore_thread_max_set()'' function, or reset the default value using the +''ecore_thread_max_reset()'' function. + +== To query the number of active threads == + +Use the ''ecore_thread_active_get()'' function. To query the number of +available worker threads, use the ''ecore_thread_available_get()'' function, +which is basically the same as the ''ecore_thread_max_get()'' - +''ecore_thread_active_get()''. + +--------- +{{page>index}} diff --git a/pages/program_guide/main_loop/timers.txt b/pages/program_guide/main_loop/timers.txt new file mode 100644 index 000000000..1662033ac --- /dev/null +++ b/pages/program_guide/main_loop/timers.txt @@ -0,0 +1,105 @@ +{{page>index}} +--------- +===== Timers ===== + +Ecore provides timers, which schedule events that are executed later at a +specific time. The event can occur once or several times at specific +intervals. + +=== Table of Contents === + + * [[#To_create_and_destroy_a_timer|To create and destroy a timer]] + * [[#To_create_a_timer|To create a timer]] + * [[#To_delete_the_timer|To delete the timer]] + * [[#To_manage_a_timer|To manage a timer]] + * [[#To_change_the_timer's_interval|To change the timer's interval]] + * [[#To_get_the_timer's_pending_time|To get the timer's pending time]] + * [[#To_delay_the_timer's_next_occurrence|To delay the timer's next occurrence]] + * [[#To_pause_the_currently_running_timer|To pause the currently running timer]] + * [[#To_query_the_current_value_of_the_defined_timer_infrastructure_precision|To query the current value of the defined timer infrastructure precision]] + +=== Related Info === + + * [[https://build.enlightenment.org/job/nightly_efl_gcc_x86_64/lastSuccessfulBuild/artifact/doc/html/group__Ecore__Timer__Group.html|Ecore Timer functions API]] + * [[https://build.enlightenment.org/job/nightly_efl_gcc_x86_64/lastSuccessfulBuild/artifact/doc/html/ecore_timer_example_c.html|Ecore Timers Example]] + +A timer callback prototype looks like the ''my_timed_cb()'' callback function. +This function receives data from the application, and returns a Boolean value +to specify whether it is called again or completed. The following macros are +also provided: + + * ''ECORE_CALLBACK_RENEW'': the function is called again after the timeout. + * ''ECORE_CALLBACK_CANCEL'': the function is not called again, Ecore destroys automatically everything associated with the timer. + +==== To create and destroy a timer ==== + +== To create a timer == + +Use the ''ecore_timer_add()'' function. The interval, specified +in seconds, indicates when the given function is called, and receives the +specified data as a parameter. It returns an ''Ecore_Timer'' object. + +In the following example, the ''my_timed_cb()'' function is run after 2 +seconds and it receives ''my_data''. It is renewed while its count variable +value is under 5, and stops after that. + + +Eina_Bool my_timed_cb(void *data) +{ + static int count = 0; + count++; + + if (count < 5) + return ECORE_CALLBACK_RENEW; + + return ECORE_CALLBACK_CANCEL; +} +ecore_timer_add(2.0, my_timed_cb, my_data); + + +== To delete the timer == + +Use the ''ecore_timer_del()'' function. The timer to delete must still be +running, that is, it has not returned a ''false'' value. If the timer is not +running, the function cannot be called. + +=== To manage a timer === + +== To change the timer's interval == + +Use the ''ecore_timer_interval_set()'' function. The interval is specified in +seconds. If set during a timer call, this affects the next interval. Use the +''ecore_timer_interval_get()'' function to get the timer's current interval. + +== To get the timer's pending time == + +Use the ''ecore_timer_pending_get()'' function. + +== To delay the timer's next occurrence == + +Use the ''ecore_timer_delay()'' function. The function adds the specified time +to the current interval. It does not change the future occurrences' interval. +You can also reset the current interval to its full value by using the +''ecore_timer_reset()'' function. + +== To pause the currently running timer == + +Use the ''ecore_timer_freeze()'' function. The remaining time is saved and +used again when the timer is resumed with the ''ecore_timer_thaw()'' function. + +== To query the current value of the defined timer infrastructure precision == + +Use the ''ecore_timer_precision_get()'' function. A higher delay means that +more timers can be run together. It diminishes the need to use system wake-ups +and thus lowers the power consumption. + +To set the precision, use the ''ecore_timer_precision_set()'' function. This sets +the precision for all timers. For example, there are 2 timers, one that +expires in 2.0 seconds and another that expires in 2.1 seconds. If the +precision is set to 0.1 seconds, Ecore requests the next expiration to happen +in 2.1 seconds and runs both callbacks at once, instead of one at 2.0 seconds +and the other one 0.1 seconds later. However, if there is no timer expiring in +2.1 seconds, the timeout is at the minimum interval, 2 seconds. + +-------- +{{page>index}} diff --git a/pages/program_guide/main_loop_pg.txt b/pages/program_guide/main_loop_pg.txt new file mode 100644 index 000000000..e09b876e4 --- /dev/null +++ b/pages/program_guide/main_loop_pg.txt @@ -0,0 +1,63 @@ +{{page>index}} +------- +===== Main Loop ===== + +The EFL is event-driven. This means that the application polls for data, and +listens for events to interact with it. + +The Ecore library provides the main loop abstraction. It gets data when data +is available and sends the events so that costly polling threads are not +needed. Ecore manages polling, timers, events, and file descriptors. When +there is no ongoing event, the main loop automatically enters an idle mode, +minimizing the power consumption. The loop wakes up when needed. + +=== Table of Contents === + + * [[/program_guide/main_loop/timers|Timers]] + * [[/program_guide/main_loop/timers#To_create_and_destroy_a_timer|To create and destroy a timer]] + * [[/program_guide/main_loop/timers#To_create_a_timer|To create a timer]] + * [[/program_guide/main_loop/timers#To_delete_the_timer|To delete the timer]] + * [[/program_guide/main_loop/timers#To_manage_a_timer|To manage a timer]] + * [[/program_guide/main_loop/timers#To_change_the_timer's_interval|To change the timer's interval]] + * [[/program_guide/main_loop/timers#To_get_the_timer's_pending_time|To get the timer's pending time]] + * [[/program_guide/main_loop/timers#To_delay_the_timer's_next_occurrence|To delay the timer's next occurrence]] + * [[/program_guide/main_loop/timers#To_pause_the_currently_running_timer|To pause the currently running timer]] + * [[/program_guide/main_loop/timers#To_query_the_current_value_of_the_defined_timer_infrastructure_precision|To query the current value of the defined timer infrastructure precision]] + * [[/program_guide/main_loop/animators|Animators]] + * [[/program_guide/main_loop/animators#Forever-running_Animator|Forever-running Animator]] + * [[/program_guide/main_loop/animators#Specific-duration_Animator|Specific-duration Animator]] + * [[/program_guide/main_loop/animators#To_create_and_destroy_the_animator|To create and destroy the animator]] + * [[/program_guide/main_loop/animators#To_create_the_animator|To create the animator]] + * [[/program_guide/main_loop/animators#To_destroy_the_animator|To destroy the animator]] + * [[/program_guide/main_loop/animators#To_manage_the_animator|To manage the animator]] + * [[/program_guide/main_loop/animators#To_pause_the_currently_running_animator|To pause the currently running animator]] + * [[/program_guide/main_loop/animators#To_query_Ecore_for_the_interval_between_2_animator_calls|To query Ecore for the interval between 2 animator calls]] + * [[/program_guide/main_loop/animators#To_change_the_interval|To change the interval]] + * [[/program_guide/main_loop/file_descriptors|File Descriptors]] + * [[/program_guide/main_loop/file_descriptors#To_manage_the_file_descriptors|To manage the file descriptors]] + * [[/program_guide/main_loop/file_descriptors#To_set_a_callback|To set a callback]] + * [[/program_guide/main_loop/file_descriptors#To_listen_to_events|To listen to events]] + * [[/program_guide/main_loop/file_descriptors#To_wait_for_incoming_data_on_the_file_descriptor|To wait for incoming data on the file descriptor]] + * [[/program_guide/main_loop/file_descriptors#To_delete_a_file_descriptor_handler|To delete a file descriptor handler]] + * [[/program_guide/main_loop/file_descriptors#To_get_the_handler's_file_descriptor|To get the handler's file descriptor]] + * [[/program_guide/main_loop/file_descriptors#To_select_whether_a_flag_is_active_on_a_handler|To select whether a flag is active on a handler]] + * [[/program_guide/main_loop/file_descriptors#To_change_the_flags_the_handler_is_monitoring|To change the flags the handler is monitoring]] + * [[/program_guide/main_loop/threads|Threads]] + * [[/program_guide/main_loop/threads#To_manage_threads|To manage threads]] + * [[/program_guide/main_loop/threads#To_cancel_a_thread|To cancel a thread]] + * [[/program_guide/main_loop/threads#To_execute_a_thread_later|To execute a thread later]] + * [[/program_guide/main_loop/threads#To_get_the_maximum_number_of_concurrent_threads|To get the maximum number of concurrent threads]] + * [[/program_guide/main_loop/threads#To_query_the_number_of_active_threads|To query the number of active threads]] + * [[/program_guide/main_loop/idlers|Idlers]] + * [[/program_guide/main_loop/idlers#To_manage_the_idlers|To manage the idlers]] + * [[/program_guide/main_loop/idlers#To_add_an_idler|To add an idler]] + * [[/program_guide/main_loop/idlers#To_delete_an_idler|To delete an idler]] + * [[/program_guide/main_loop/idlers#To_add_and_delete_idle_exiters|To add and delete idle exiters]] + * [[/program_guide/main_loop/idlers#To_add_and_delete_idle_enterers|To add and delete idle enterers]] + +=== Related Info === + + * [[https://build.enlightenment.org/job/nightly_efl_gcc_x86_64/lastSuccessfulBuild/artifact/doc/html/group__Ecore__Main__Loop__Group.html|Ecore Main Loop API]] + +----- +{{page>index}}