~~Title: Efl.Appthread~~ ====== Efl.Appthread (class) ====== ===== Description ===== %%This class houses the application's thread and main loop. It works similarly to %%[[:develop:api:efl:app|Efl.App]]%% but allows communicating with it from a different thread through the %%[[:develop:api:efl:threadio|Efl.ThreadIO]]%%, %%[[:develop:api:efl:io:reader|Efl.Io.Reader]]%% and %%[[:develop:api:efl:io:writer|Efl.Io.Writer]]%% interfaces. Methods can be scheduled to be executed in this thread using %%[[:develop:api:efl:threadio:method:call|Efl.ThreadIO.call]]%% and %%[[:develop:api:efl:threadio:method:call_sync|Efl.ThreadIO.call_sync]]%%.%% {{page>:develop:api-include:efl:appthread:description&nouser&nolink&nodate}} ===== Inheritance ===== => [[:develop:api:efl:loop|Efl.Loop]] //(class)// => [[:develop:api:efl:task|Efl.Task]] //(class)// => [[:develop:api:efl:loop_consumer|Efl.Loop_Consumer]] //(class)// => [[:develop:api:efl:object|Efl.Object]] //(class)// ++++ Full hierarchy | * [[:develop:api:efl:loop|Efl.Loop]] //(class)// * [[:develop:api:efl:task|Efl.Task]] //(class)// * [[:develop:api:efl:loop_consumer|Efl.Loop_Consumer]] //(class)// * [[:develop:api:efl:object|Efl.Object]] //(class)// * [[:develop:api:efl:threadio|Efl.ThreadIO]] //(mixin)// * [[:develop:api:efl:io:reader|Efl.Io.Reader]] //(interface)// * [[:develop:api:efl:io:writer|Efl.Io.Writer]] //(interface)// * [[:develop:api:efl:io:closer|Efl.Io.Closer]] //(interface)// * [[:develop:api:efl:core:command_line|Efl.Core.Command_Line]] //(mixin)// ++++ ===== Members ===== **[[:develop:api:efl:appthread:method:call|call]]**// [Overridden from [[:develop:api:efl:threadio|Efl.ThreadIO]]]//\\ > %%Executes a method on a different thread, asynchronously.%% void efl_threadio_call(Eo *obj, EflThreadIOCall func); \\ **[[:develop:api:efl:appthread:method:call_sync|call_sync]]**// [Overridden from [[:develop:api:efl:threadio|Efl.ThreadIO]]]//\\ > %%Executes a method on a different thread, synchronously. This call will not return until the method finishes and its return value can be recovered.%% void *efl_threadio_call_sync(Eo *obj, EflThreadIOCallSync func); \\ **[[:develop:api:efl:appthread:property:can_read|can_read]]** //**(get, set)**// ''protected set''// [Overridden from [[:develop:api:efl:io:reader|Efl.Io.Reader]]]//\\ > %%If %%''true''%% will notify %%[[:develop:api:efl:io:reader:method:read|Efl.Io.Reader.read]]%% can be called without blocking or failing.%% Eina_Bool efl_io_reader_can_read_get(const Eo *obj); void efl_io_reader_can_read_set(Eo *obj, Eina_Bool can_read); \\ **[[:develop:api:efl:appthread:property:can_write|can_write]]** //**(get, set)**// ''protected set''// [Overridden from [[:develop:api:efl:io:writer|Efl.Io.Writer]]]//\\ > %%If %%''true''%% will notify %%[[:develop:api:efl:io:writer:method:write|Efl.Io.Writer.write]]%% can be called without blocking or failing.%% Eina_Bool efl_io_writer_can_write_get(const Eo *obj); void efl_io_writer_can_write_set(Eo *obj, Eina_Bool can_write); \\ **[[:develop:api:efl:appthread:method:close|close]]**// [Overridden from [[:develop:api:efl:io:closer|Efl.Io.Closer]]]//\\ > %%Closes the Input/Output object.%% Eina_Error efl_io_closer_close(Eo *obj); \\ **[[:develop:api:efl:appthread:property:closed|closed]]** //**(get)**//// [Overridden from [[:develop:api:efl:io:closer|Efl.Io.Closer]]]//\\ > Eina_Bool efl_io_closer_closed_get(const Eo *obj); \\ **[[:develop:api:efl:appthread:method:constructor|constructor]]**// [Overridden from [[:develop:api:efl:object|Efl.Object]]]//\\ > %%Implement this method to provide optional initialization code for your object.%% Efl_Object *efl_constructor(Eo *obj); \\ **[[:develop:api:efl:appthread:method:destructor|destructor]]**// [Overridden from [[:develop:api:efl:object|Efl.Object]]]//\\ > %%Implement this method to provide deinitialization code for your object if you need it.%% void efl_destructor(Eo *obj); \\ **[[:develop:api:efl:appthread:property:eos|eos]]** //**(get, set)**// ''protected set''// [Overridden from [[:develop:api:efl:io:reader|Efl.Io.Reader]]]//\\ > %%If %%''true''%% will notify end of stream.%% Eina_Bool efl_io_reader_eos_get(const Eo *obj); void efl_io_reader_eos_set(Eo *obj, Eina_Bool is_eos); \\ **[[:develop:api:efl:appthread:method:read|read]]**// [Overridden from [[:develop:api:efl:io:reader|Efl.Io.Reader]]]//\\ > %%Reads data into a pre-allocated buffer.%% Eina_Error efl_io_reader_read(Eo *obj, Eina_Rw_Slice rw_slice); \\ **[[:develop:api:efl:appthread:method:write|write]]**// [Overridden from [[:develop:api:efl:io:writer|Efl.Io.Writer]]]//\\ > %%Writes data from a pre-populated buffer.%% Eina_Error efl_io_writer_write(Eo *obj, Eina_Slice slice, Eina_Slice *remaining); \\ ==== Inherited ==== ^ [[:develop:api:efl:core:command_line|Efl.Core.Command_Line]] ^^^ | | **[[:develop:api:efl:core:command_line:property:command|command]]** //**(get)**// | | | | **[[:develop:api:efl:core:command_line:method:command_access|command_access]]** | %%Get the accessor which enables access to each argument that got passed to this object.%% | | | **[[:develop:api:efl:core:command_line:property:command_array|command_array]]** //**(set)**// | | | | **[[:develop:api:efl:core:command_line:property:command_string|command_string]]** //**(set)**// | | ^ [[:develop:api:efl:io:closer|Efl.Io.Closer]] ^^^ | | **[[:develop:api:efl:io:closer:property:close_on_exec|close_on_exec]]** //**(get, set)**// | %%If true will automatically close resources on exec() calls.%% | | | **[[:develop:api:efl:io:closer:property:close_on_invalidate|close_on_invalidate]]** //**(get, set)**// | %%If true will automatically close() on object invalidate.%% | ^ [[:develop:api:efl:loop|Efl.Loop]] ^^^ | | **[[:develop:api:efl:loop:method:begin|begin]]** | %%Runs the application main loop.%% | | | **[[:develop:api:efl:loop:method:end|end]]** | %%Request the task end (may send a signal or interrupt signal resulting in a terminate event being triggered in the target task loop).%% | | | **[[:develop:api:efl:loop:method:idle|idle]]** | %%A future promise that will be resolved from a clean main loop context as soon as the main loop is idle.%% | | | **[[:develop:api:efl:loop:method:invalidate|invalidate]]** | %%Implement this method to perform special actions when your object loses its parent, if you need to.%% | | | **[[:develop:api:efl:loop:method:iterate|iterate]]** | %%Runs a single iteration of the main loop to process everything on the queue.%% | | | **[[:develop:api:efl:loop:method:iterate_may_block|iterate_may_block]]** | %%Runs a single iteration of the main loop to process everything on the queue with block/non-blocking status.%% | | | **[[:develop:api:efl:loop:method:job|job]]** | %%A future promise that will be resolved from a clean main loop context as soon as possible.%% | | | **[[:develop:api:efl:loop:method:quit|quit]]** | %%Quits the main loop once all the events currently on the queue have been processed.%% | | | **[[:develop:api:efl:loop:method:run|run]]** | %%Actually run the task.%% | | | **[[:develop:api:efl:loop:property:throttle|throttle]]** //**(get, set)**// | %%Slow down the loop execution by forcing sleep for a small period of time every time the loop iterates/loops.%% | | ''protected set'' | **[[:develop:api:efl:loop:property:time|time]]** //**(get, set)**// | %%Retrieves the time at which the last loop stopped waiting for timeouts or events.%% | | | **[[:develop:api:efl:loop:method:timeout|timeout]]** | %%A future promise that will be resolved from a clean main loop context after %%''time''%% seconds.%% | ^ [[:develop:api:efl:loop_consumer|Efl.Loop_Consumer]] ^^^ | | **[[:develop:api:efl:loop_consumer:method:future_rejected|future_rejected]]** | %%Creates a new future that is already rejected to a specified error using the %%[[:develop:api:efl:loop_consumer:property:loop|Efl.Loop_Consumer.loop.get]]%%.%% | | | **[[:develop:api:efl:loop_consumer:method:future_resolved|future_resolved]]** | %%Creates a new future that is already resolved to a value.%% | | | **[[:develop:api:efl:loop_consumer:property:loop|loop]]** //**(get)**// | | | | **[[:develop:api:efl:loop_consumer:method:promise_new|promise_new]]** | %%Create a new promise with the scheduler coming from the loop provided by this object.%% | ^ [[:develop:api:efl:object|Efl.Object]] ^^^ | | **[[:develop:api:efl:object:property:allow_parent_unref|allow_parent_unref]]** //**(get, set)**// | %%Allow an object to be deleted by unref even if it has a parent.%% | | | **[[:develop:api:efl:object:method:children_iterator_new|children_iterator_new]]** | %%Get an iterator on all children.%% | | | **[[:develop:api:efl:object:property:comment|comment]]** //**(get, set)**// | %%A human readable comment for the object.%% | | | **[[:develop:api:efl:object:method:composite_attach|composite_attach]]** | %%Make an object a composite object of another.%% | | | **[[:develop:api:efl:object:method:composite_detach|composite_detach]]** | %%Detach a composite object from another object.%% | | | **[[:develop:api:efl:object:method:composite_part_is|composite_part_is]]** | %%Check if an object is part of a composite object.%% | | | **[[:develop:api:efl:object:method:debug_name_override|debug_name_override]]** | %%Build a read-only name for this object used for debugging.%% | | | **[[:develop:api:efl:object:method:event_callback_forwarder_del|event_callback_forwarder_del]]** | %%Remove an event callback forwarder for a specified event and object.%% | | | **[[:develop:api:efl:object:method:event_callback_forwarder_priority_add|event_callback_forwarder_priority_add]]** | %%Add an event callback forwarder that will make this object emit an event whenever another object (%%''source''%%) emits it. The event is said to be forwarded from %%''source''%% to this object.%% | | | **[[:develop:api:efl:object:method:event_callback_stop|event_callback_stop]]** | %%Stop the current callback call.%% | | | **[[:develop:api:efl:object:method:event_freeze|event_freeze]]** | %%Freeze events of this object.%% | | | **[[:develop:api:efl:object:property:event_freeze_count|event_freeze_count]]** //**(get)**// | | | ''static'' | **[[:develop:api:efl:object:method:event_global_freeze|event_global_freeze]]** | %%Globally freeze events for ALL EFL OBJECTS.%% | | ''static'' | **[[:develop:api:efl:object:property:event_global_freeze_count|event_global_freeze_count]]** //**(get)**// | | | ''static'' | **[[:develop:api:efl:object:method:event_global_thaw|event_global_thaw]]** | %%Globally thaw events for ALL EFL OBJECTS.%% | | | **[[:develop:api:efl:object:method:event_thaw|event_thaw]]** | %%Thaw events of object.%% | | | **[[:develop:api:efl:object:method:finalize|finalize]]** | %%Implement this method to finish the initialization of your object after all (if any) user-provided configuration methods have been executed.%% | | | **[[:develop:api:efl:object:property:finalized|finalized]]** //**(get)**// | | | | **[[:develop:api:efl:object:property:invalidated|invalidated]]** //**(get)**// | | | | **[[:develop:api:efl:object:property:invalidating|invalidating]]** //**(get)**// | | | | **[[:develop:api:efl:object:property:name|name]]** //**(get, set)**// | %%The name of the object.%% | | | **[[:develop:api:efl:object:method:name_find|name_find]]** | %%Find a child object with the given name and return it.%% | | | **[[:develop:api:efl:object:method:provider_find|provider_find]]** | %%Searches upwards in the object tree for a provider which knows the given class/interface.%% | | | **[[:develop:api:efl:object:method:provider_register|provider_register]]** | %%Will register a manager of a specific class to be answered by %%[[:develop:api:efl:object:method:provider_find|Efl.Object.provider_find]]%%.%% | | | **[[:develop:api:efl:object:method:provider_unregister|provider_unregister]]** | %%Will unregister a manager of a specific class that was previously registered and answered by %%[[:develop:api:efl:object:method:provider_find|Efl.Object.provider_find]]%%.%% | ^ [[:develop:api:efl:task|Efl.Task]] ^^^ | | **[[:develop:api:efl:task:property:exit_code|exit_code]]** //**(get)**// | | | | **[[:develop:api:efl:task:property:flags|flags]]** //**(get, set)**// | %%Flags to further customize task's behavior.%% | | | **[[:develop:api:efl:task:property:parent|parent]]** //**(get, set)**// | %%The parent of an object.%% | | | **[[:develop:api:efl:task:property:priority|priority]]** //**(get, set)**// | %%The priority of this task.%% | ^ [[:develop:api:efl:threadio|Efl.ThreadIO]] ^^^ | | **[[:develop:api:efl:threadio:property:indata|indata]]** //**(get, set)**// | %%Input data pointer for the thread.%% | | | **[[:develop:api:efl:threadio:property:outdata|outdata]]** //**(get, set)**// | %%Output data pointer for the thread.%% | ===== Events ===== ==== Inherited ==== ^ [[:develop:api:efl:io:closer|Efl.Io.Closer]] ^^^ | | **[[:develop:api:efl:io:closer:event:closed|closed]]** | %%Notifies closed, when property is marked as true%% | ^ [[:develop:api:efl:io:reader|Efl.Io.Reader]] ^^^ | | **[[:develop:api:efl:io:reader:event:can_read_changed|can_read,changed]]** | %%Notifies can_read property changed.%% | | | **[[:develop:api:efl:io:reader:event:eos|eos]]** | %%Notifies end of stream, when property is marked as true.%% | ^ [[:develop:api:efl:io:writer|Efl.Io.Writer]] ^^^ | | **[[:develop:api:efl:io:writer:event:can_write_changed|can_write,changed]]** | %%Notifies can_write property changed.%% | ^ [[:develop:api:efl:loop|Efl.Loop]] ^^^ | | **[[:develop:api:efl:loop:event:arguments|arguments]]** | %%Event happens when args are provided to the loop by args_add().%% | | | **[[:develop:api:efl:loop:event:idle|idle]]** | %%Event occurs once the main loop is idle. If you keep listening on this event it may increase the burden on your CPU.%% | | | **[[:develop:api:efl:loop:event:idle_enter|idle,enter]]** | %%Event occurs once the main loop enters the idle state.%% | | | **[[:develop:api:efl:loop:event:idle_exit|idle,exit]]** | %%Event occurs once the main loop exits the idle state.%% | | | **[[:develop:api:efl:loop:event:poll_high|poll,high]]** | %%Event occurs multiple times per second. The exact tick is undefined and can be adjusted system-wide.%% | | | **[[:develop:api:efl:loop:event:poll_low|poll,low]]** | %%Event occurs multiple times every 15 minutes. The exact tick is undefined and can be adjusted system-wide.%% | | | **[[:develop:api:efl:loop:event:poll_medium|poll,medium]]** | %%Event occurs multiple times per minute. The exact tick is undefined and can be adjusted system-wide.%% | | | **[[:develop:api:efl:loop:event:quit|quit]]** | %%Event occurs when the loop was requested to quit externally e.g. by a ctrl+c signal or a request from a parent loop/thread to have the child exit.%% | ^ [[:develop:api:efl:object|Efl.Object]] ^^^ | | **[[:develop:api:efl:object:event:del|del]]** | %%Object is being deleted. See %%[[:develop:api:efl:object:method:destructor|Efl.Object.destructor]]%%.%% | | | **[[:develop:api:efl:object:event:destruct|destruct]]** | %%Object has been fully destroyed. It can not be used beyond this point. This event should only serve to clean up any reference you keep to the object.%% | | | **[[:develop:api:efl:object:event:invalidate|invalidate]]** | %%Object is being invalidated and losing its parent. See %%[[:develop:api:efl:object:method:invalidate|Efl.Object.invalidate]]%%.%% | | | **[[:develop:api:efl:object:event:noref|noref]]** | %%Object has lost its last reference, only parent relationship is keeping it alive. Advanced usage.%% | | | **[[:develop:api:efl:object:event:ownership_shared|ownership,shared]]** | %%Object has acquired a second reference. It has multiple owners now. Triggered whenever increasing the refcount from one to two, it will not trigger by further increasing the refcount beyond two.%% | | | **[[:develop:api:efl:object:event:ownership_unique|ownership,unique]]** | %%Object has lost a reference and only one is left. It has just one owner now. Triggered whenever the refcount goes from two to one.%% | ^ [[:develop:api:efl:task|Efl.Task]] ^^^ | | **[[:develop:api:efl:task:event:exit|exit]]** | %%Called when the task exits. You can pick up any information you need at this point such as exit_code etc.%% |