Pregunta

Cuando se utiliza simplista a las señales de despacho a través emit, son todos los "oyentes" / manipuladores de llamadas de back-to-back o es el control renunciado al bucle de eventos después de cada oyente / manejador?

¿Fue útil?

Solución

Las devoluciones de llamada están todos llama espalda con espalda sin abandonar el control al bucle principal.

En realidad, por lo que yo sé, g_signal_emit () no incluso de control de retorno hasta que todos los controladores son llamados, así que no hay oportunidad para que el bucle principal a saque de banda.

Así que para responder a la pregunta del título de este post:. No, señales simplistas no son asíncronas

Otros consejos

señales GLib puede ser manejado de forma sincrónica o asincrónica. GObject señales son siempre sincrónica, es decir, cuando usted emite una señal que no vuelve hasta que se maneja la señal. Para tener una señal asíncrona manejado con GLib, (estoy usando vala por razones de brevedad - utilizar el compilador de Vala para convertir el código en C plano) se debe definir una señal de fuente, o usar uno predefinido, como por ejemplo IdleSource o TimeoutSource (cuando E / S está fuera de cuestión). Por ejemplo se supone que tiene una función

void my_func() {
  stdout.puts("Hello world! (async)\n");
}

y al que desea llamar de forma asíncrona (desde el mismo hilo!) De

void caller() {
  // Here you want to insert the asynchronous call
  // that will be invoked AFTER caller has returned.
  // Body of caller follows:
  stdout.puts("Hello world!\n");
}

Aquí es cómo lo hace:

void caller() {
  // Code for the asynchronous call:
  var ev = new IdleSource();
  ev.set_callback(() => {
    my_func();
    return Source.REMOVE; // Source.REMOVE = false
  });
  ev.attach(MainContext.default());
  // Body of caller follows:
  stdout.puts("Hello world!\n");
}

Se obtendrá el siguiente resultado:

Hello world!
Hello world! (async)

La función mi_func () se ejecutará cuando MainLoop está inactivo (es decir, que no tiene otras señales de proceso). Para activarlo después de un intervalo de tiempo específico que haya transcurrido el uso de la fuente de señal TimeoutSource. Un MainLoop debe estar en ejecución, de lo contrario no funcionará.

Documentación:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top