evtloop.h

Clase wxEventLoopBase

Clase base para todas las implementaciones de bucles de eventos.

Jerarquía:

Jerarquía de la clase wxEventLoopBase

Un bucle de eventos es una clase que consulta la cola de eventos nativos enviados a la aplicación wxWidgets y los envía a los wxEvtHandlers apropiados.

Un objeto de esta clase es creado por wxAppTraits::CreateEventLoop() y utilizado por wxApp para ejecutar el bucle de eventos principal de la aplicación. Los bucles de eventos temporales son normalmente creados por wxDialog::ShowModal().

Se puede crear un bucle de eventos propio si es necesario, siempre que se restaure el bucle de eventos principal una vez destruido (ver wxEventLoopActivator).

Hay que tener en cuenta que puede haber más de un bucle de eventos en un momento dado, por ejemplo, un manejador de eventos llamado desde el bucle principal puede mostrar un diálogo modal, que inicia su propio bucle resultando en dos bucles anidados, con el diálogo modal siendo el activo (su IsRunning() devuelve true). Y un manejador para un botón dentro del diálogo modal puede, por supuesto, crear otro diálogo modal con su propio bucle de eventos y así sucesivamente. Así que en general los bucles de eventos forman una pila y solo el bucle de eventos en la parte superior de la pila se considera activo. También es el único bucle al que se le puede pedir directamente que termine llamando a Exit() (lo que se hace mediante wxDialog::EndModal()), un bucle de eventos externo no se puede detener mientras uno interno sigue ejecutándose. Sin embargo, es posible pedir a un bucle de eventos externo que termine tan pronto como todos sus bucles anidados salgan y el control vuelva a él utilizando ScheduleExit().

Funciones miembro

Dispatch()

virtual bool wxEventLoopBase::Dispatch()

Envía el siguiente evento en la cola de eventos del sistema de ventanas.

Bloquea hasta que aparece un evento si no hay ninguno actualmente (utilizar Pending() si no se desea).

Esto puede usarse para programar bucles de eventos, por ejemplo

while (evtloop->Pending())
    evtloop->Dispatch();
Valor de retorno

false si el bucle de eventos debe detenerse y true en caso contrario.

DispatchTimeout()

virtual int wxEventLoopBase::DispatchTimeout(unsigned long timeout)

Envía un evento sin esperar más tiempo del especificado.

Si se recibe un evento antes de que expire el tiempo de espera especificado, se procesa y la función devuelve 1 normalmente o 0 si el bucle de eventos debe terminar. En caso contrario, es decir, si expira el tiempo de espera, la función devuelve -1 sin procesar ningún evento.

Parámetros
timeout
Tiempo máximo de espera de los eventos en milisegundos.
Valor de retorno

1 si se ha procesado un evento, 0 si el bucle de eventos debe salir o -1 si el tiempo de espera ha expirado.

Exit()

virtual void wxEventLoopBase::Exit(int rc = 0)

Sale del bucle que se está ejecutando con el código de salida dado.

El bucle saldrá, es decir, su método Run() volverá, durante la siguiente iteración del bucle de eventos.

Hay que tener en cuenta que este método solo se puede utilizar si este bucle de eventos es el que se está ejecutando actualmente, es decir, si su método IsRunning() devuelve verdadero. Si este no es el caso, se dispara un fallo de assert y no se hace nada, ya que no se puede salir inmediatamente de los bucles de eventos externos. Utilizar ScheduleExit() si se desea salir de este bucle aunque no se esté ejecutando.

GetActive()

static wxEventLoopBase* wxEventLoopBase::GetActive()

Devuelve el bucle de eventos actualmente activo (en ejecución).

Puede devolver NULL si no hay ningún bucle de eventos activo (por ejemplo, durante el inicio o el cierre de la aplicación).

IsEventAllowedInsideYield()

virtual bool wxEventLoopBase::IsEventAllowedInsideYield(wxEventCategory cat) const

Devuelve true si la categoría de evento dada está permitida dentro de una llamada a YieldFor() (es decir, compara la categoría dada con la última máscara pasada a YieldFor()).

IsMain()

bool wxEventLoopBase::IsMain() const

Devuelve true si este es el bucle principal ejecutado por wxApp::OnRun().

IsOk()

virtual bool wxEventLoopBase::IsOk() const

Utilízarlo para comprobar si el bucle de eventos se ha creado correctamente antes de usarlo.

IsRunning()

bool wxEventLoopBase::IsRunning() const

Devuelve true si este bucle de eventos se está ejecutando actualmente.

Hay que tener en cuenta que incluso si este bucle de eventos no ha terminado todavía, pero acaba de generar un bucle de eventos anidado (por ejemplo, modal), este método devolverá false.

IsYielding()

virtual bool wxEventLoopBase::IsYielding() const

Devuelve true si se llama desde dentro de Yield() o desde dentro de YieldFor().

OnExit()

virtual void wxEventLoopBase::OnExit()

Esta función es llamada antes de que el bucle de eventos termine, tanto si esto ocurre normalmente (debido a la llamada a Exit()) o anormalmente (debido a una excepción lanzada desde dentro del bucle).

La implementación por defecto llama a wxAppConsole::OnEventLoopExit.

Pending()

virtual bool wxEventLoopBase::Pending() const

Devuelve true si hay algún evento disponible.

Si este método devuelve true, la llamada a Dispatch() no se bloqueará.

ProcessIdle()

virtual bool wxEventLoopBase::ProcessIdle()

Esta función virtual es llamada cuando la aplicación se vuelve inactiva y normalmente sólo envía wxIdleEvent a todas las partes interesadas.

Debe devolver true si se necesitan más eventos de inactividad, false en caso contrario.

Run()

virtual int wxEventLoopBase::Run()

Inicia el bucle de eventos, devuelve el código de salida cuando finaliza.

Lógicamente, este método llama a Dispatch() en un bucle hasta que devuelve false y también se encarga de generar eventos inactivos durante cada iteración del bucle. Sin embargo, no todas las implementaciones de esta clase lo hacen realmente así (por ejemplo, wxGTK no lo hace) por lo que no se debería confiar en que Dispatch() sea llamado desde dentro de esta función.

Valor de retorno

El argumento pasado a Exit() que termina este bucle de eventos.

ScheduleExit()

virtual void wxEventLoopBase::ScheduleExit(int rc = 0)

Programa una salida del bucle con el código de salida dado.

Este método es similar a Exit() pero puede ser llamado incluso si este bucle de eventos no es el que se está ejecutando actualmente - y si es el bucle activo, entonces funciona exactamente de la misma manera que Exit().

El bucle saldrá tan pronto como el flujo de control vuelva a él, es decir, después de que cualquier bucle anidado termine.

SetActive()

static void wxEventLoopBase::SetActive(wxEventLoopBase * loop)

Establece el bucle de eventos actualmente activo (en ejecución).

Llamado por wxEventLoopActivator, utilizar una instancia de esta clase en lugar de llamar a este método directamente para asegurarse de que el bucle de eventos previamente activo se restaura.

Resulta en una llamada a wxAppConsole::OnEventLoopEnter.

WakeUp()

virtual void wxEventLoopBase::WakeUp()

Llamado por wxWidgets para despertar el bucle de eventos incluso si está actualmente bloqueado dentro de Dispatch().

WakeUpIdle()

void wxEventLoopBase::WakeUpIdle()

Asegura que los eventos inactivos se envíen de nuevo.

Yield()

bool wxEventLoopBase::Yield(bool onlyIfNeeded = false)

Cede el control a los mensajes pendientes en el sistema de ventanas.

Esto puede ser útil, por ejemplo, cuando un proceso que consume mucho tiempo escribe en una ventana de texto. Sin una cesión ocasional, la ventana de texto no se actualizará correctamente, y en sistemas con multitarea cooperativa, otros procesos no responderán.

Sin embargo, hay que tener cuidado, ya que ceder puede permitir al usuario realizar acciones que no son compatibles con la tarea actual. Deshabilitar elementos de menú o menús enteros durante el procesamiento puede evitar la reentrada no deseada de código: véase wxSafeYield para una función mejor.

Hay que tener en cuenta que Yield() no vaciará los registros de mensajes. Esto es intencionado ya que llamar a Yield() se hace normalmente para actualizar rápidamente la pantalla y hacer aparecer un cuadro de diálogo de mensajes puede ser indeseable. Si desea vaciar los mensajes de registro inmediatamente (de lo contrario se hará durante la siguiente iteración del bucle inactivo), llamar a wxLog::FlushActive.

Si el parámetro onlyIfNeeded es true y el control de flujo ya está dentro de Yield(), es decir, IsYielding() devuelve true, el método simplemente devuelve false y no hace nada.

YieldFor()

bool wxEventLoopBase::YieldFor(long eventsToProcess)

Funciona como Yield() con onlyIfNeeded == true, excepto que permite al llamador especificar una máscara de los valores wxEventCategory que indica qué eventos deben ser procesados y cuáles deben ser "retrasados" (es decir, procesados por el bucle principal más tarde).

Hay que tener en cuenta que esta es una alternativa más segura a Yield(), ya que garantiza que solo se procesarán los eventos que le interesen; es decir, este método ayuda a evitar reentradas no deseadas.

Hay que tener en cuenta que actualmente solo wxMSW y wxGTK soportan el rendimiento selectivo de eventos nativos procedentes del conjunto de herramientas GUI subyacente. Los eventos de wxWidgets enviados utilizando wxEvtHandler::AddPendingEvent o wxEvtHandler::QueueEvent son procesados selectivamente por todos los ports.