Autor Tema: Salir de una función que se este ejecutando en "segundo plano".  (Leído 3318 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado hortoedro

  • PIC10
  • *
  • Mensajes: 19
Hola compañeros, muy buenas a ver si alguien puede ayudarme. En mi código tengo una función que enciende o apaga una luz dependiendo de los ciclos que le de, que pueden ser de hasta 10 días. Mi idea es salir de esa función una vez empiecen los ciclos a contar, para no encontrarme recorriendo esa función durante 10 días y no poder hacer nada más ¿Alguien sabe como salir de esa función mientras se esta ejecutando?, es decir, poder salir por ejemplo al bucle while(1) una vez entramos en la función mientras se está ejecutando en un "segundo plano".

Un saludo y muchas gracias


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #1 en: 17 de Abril de 2015, 04:19:33 »
menos mal que le pusiste las comillas a "segundo plano" por que no hay segundo plano con un solo nucleo.

No se como es exactamente tu funcion asi que no puedo especificar mucho, pero:

Si hay formas de romper ese flujo de programa.

una interrupcion, o con una condicion o si estas en un loop con un
break;
« Última modificación: 17 de Abril de 2015, 04:30:10 por KILLERJC »

Desconectado hortoedro

  • PIC10
  • *
  • Mensajes: 19
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #2 en: 17 de Abril de 2015, 04:27:58 »
menos mal que le pusiste las comillas a "segundo plano" por que no hay segundo plano con un solo nucleo. Y si hay formas de romper el loop.

con un

break;

Hola KILLERJC, si por eso mismo puse las comillas no quería confundir a nadie. En cuanto al break, si lo pongo antes de la función no me entra y si lo pongo después de la función estamos en las mismas ya que solo saldría cuando acabara. ¿En que lugar debería de poner el break? ¿Una vez llamada a la función en teoría, no?¿Pero una vez entramos dentro de la función ya hasta que no terminara no saldrá no?

Un saludo y gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #3 en: 17 de Abril de 2015, 04:40:18 »
Podrias poner el codigo o aunque sea un ejemplo de como es?

Desconectado hortoedro

  • PIC10
  • *
  • Mensajes: 19
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #4 en: 17 de Abril de 2015, 04:42:53 »
Podrias poner el codigo o aunque sea un ejemplo de como es?

Hola KILLERJC, si aquí te lo posteo. Gracias por la velocidad de contestación.

Este es el código de la función que apaga y enciende la luz.

Código: [Seleccionar]
void arranque(void){

       if(ok==0){
       ok=1;
       flag_ciclo_duracion=1;
       do{
             flag_ciclo_marcha=1;
             do{
                output_high(LUZ);
               }
               while(flag_timer_seg_fin_marcha==0);
                
                 flag_timer_seg_fin_marcha=0;
                 logtimer_seg_marcha=0;
                 flag_ciclo_paro=1;
                  do{
                  output_low(LUZ);
                  }
                  while(flag_timer_seg_fin_paro==0);
                  
                  flag_timer_seg_fin_paro=0;
                  logtimer_seg_paro=0;
                  flag_ciclo_marcha=1;
          }
       while(flag_timer_seg_fin_duracion==0);
          
          flag_timer_seg_fin_duracion=0;
          logtimer_seg_duracion=0;
          flag_ciclo_duracion=0;
                }
          }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #5 en: 17 de Abril de 2015, 04:50:09 »
Me queda unas cosas que preguntarte, donde es que se queda el programa y que condiciones lo van a sacar de su ritmo ?

Esa funcion las llamas desde tu main() ? si la llamas desde tu main, podrias poner un if con la condicion y un return; asi salir de esa funcion

if (xxx > 0 ) return;

No me queda muy claro lo que hace el programa, si lo queres sacar de su ritmo es por que hiciste algo, tocaste algo o alo por el estilo, por lo cual podrias hacerlo y activar un flag para que termine esa ejecucion.
No llego a entender por que tantas banderas xD
« Última modificación: 17 de Abril de 2015, 04:56:42 por KILLERJC »

Desconectado hortoedro

  • PIC10
  • *
  • Mensajes: 19
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #6 en: 17 de Abril de 2015, 04:54:07 »
Me queda unas cosas que preguntarte, donde es que se queda el programa y que condiciones lo van a sacar de su ritmo ?

Esa funcion las llamas desde tu main() ? si la llamas desde tu main, podrias poner un if con la condicion y un return; asi salir de esa funcion

La luz se apaga y se enciende durante ciertas horas. Entonces va alternandose, se apaga y se enciende, se apaga y se enciende así hasta que se acaba el tiempo de duración de esos ciclos. Ahí es cuando sale de la función y acaba. ¿Te refieres a esas condiciones?

La función la llamo desde una opción de un menú. Dentro de un case/break;

Las banderas están para cuando tenga que encenderse la luz, se baje la bandera de apagado y se suba la bandera de encendido (así sucesivamente) , todo eso mientas la bandera de duración este subida jeje.

El problema es que una vez entras en la función, no sé como salir de la función sin dejar que se termine su ejecución  :( :(

U saludo y gracias
« Última modificación: 17 de Abril de 2015, 04:58:50 por hortoedro »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #7 en: 17 de Abril de 2015, 05:02:14 »
La función la llamo desde una opción de un menú. Dentro de un case/break;

Entonces podes usar el if ( condicion ) return;, eso te va a llevar nuevamente al switch case, y va a continuar con el break; de ese switch case, y su funcionamiento fuera de esa funcion

A las condiciones me refiero a que:
Estando tu programa funcionando, (si no tocas nada no se sale, sigue funcionando normalmente), pero si quisieras pararlo deberias poder tocar algo, como un boton y asi sacarlo. Debe existir una condicion que pueda sacarlo de ese lugar.

Desconectado hortoedro

  • PIC10
  • *
  • Mensajes: 19
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #8 en: 17 de Abril de 2015, 05:16:26 »
La función la llamo desde una opción de un menú. Dentro de un case/break;

Entonces podes usar el if ( condicion ) return;, eso te va a llevar nuevamente al switch case, y va a continuar con el break; de ese switch case, y su funcionamiento fuera de esa funcion

A las condiciones me refiero a que:
Estando tu programa funcionando, (si no tocas nada no se sale, sigue funcionando normalmente), pero si quisieras pararlo deberias poder tocar algo, como un boton y asi sacarlo. Debe existir una condicion que pueda sacarlo de ese lugar.

Aquí es donde llamo a la función, pero no me queda claro lo del if, porque la condición es para que entre en la función, ¿no? La idea es que entre si o si, pero una vez dentro salir y que se siga ejecutando  :? :?

Código: [Seleccionar]

case A:   //Arranque
      flag_escape_pulsado=0;
      do
      {
      ok=0;
      arranque();
      }
      while(!Escape);
      break;


Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #9 en: 17 de Abril de 2015, 05:26:25 »
mejor me explico con un ejemplo:

Código: C
  1. case 1:  
  2.        funcion_siempre_on();
  3.        break;
  4.  
  5.  
  6. .
  7. .
  8. .
  9. .
  10.  
  11. void funcion_siempre_on()
  12. {
  13.    do {
  14.           instruccion1;
  15.           instruccion2;
  16.           if (salir==1) return;
  17.    } while ( condicion que lo mantenga dentro );
  18. }

Cuando salir se ponga en 1, se ejecuta el return; y vuelve al programa donde tenia el witch case.
Creo que lo que vos queres hacer es eso pero con lo que llamas Escape.
Ahora entendes a lo que me refiero que tenes que tener una condicion que al cumplirse haga que se salga?

Y la otra es ... por que tantos do .. while :/ me parecen demasiado

Desconectado hortoedro

  • PIC10
  • *
  • Mensajes: 19
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #10 en: 17 de Abril de 2015, 05:39:38 »
mejor me explico con un ejemplo:

Código: C
  1. case 1:  
  2.        funcion_siempre_on();
  3.        break;
  4.  
  5.  
  6. .
  7. .
  8. .
  9. .
  10.  
  11. void funcion_siempre_on()
  12. {
  13.    do {
  14.           instruccion1;
  15.           instruccion2;
  16.           if (salir==1) return;
  17.    } while ( condicion que lo mantenga dentro );
  18. }

Cuando salir se ponga en 1, se ejecuta el return; y vuelve al programa donde tenia el witch case.
Creo que lo que vos queres hacer es eso pero con lo que llamas Escape.
Ahora entendes a lo que me refiero que tenes que tener una condicion que al cumplirse haga que se salga?

Y la otra es ... por que tantos do .. while :/ me parecen demasiado


Si KILLERJC, yo hago do{ } while(); para que ejecute el do{} mientras no pulse Escape, que es un botón del menú para salir a la opción anterior. Por eso los do{ } while(); . Nose, aprendí a hacerlo así jeje :? :?

En cuanto a lo otro, de salir de la función mientras se esta ejecutando, no sé muy bien como conseguirlo  :( :( . Un saludo y gracias

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #11 en: 17 de Abril de 2015, 05:40:04 »
Como bien te dice KILLER tu error esta el usar tantos while, usa las condiciones en if o switch case.

En un programa ideal basado en un solo nucleo, solo debería exitir 1 while, el while(1) principal del sistema, y todo lo demás si toca hacerlo se hace, si no, a otra cosa.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #12 en: 17 de Abril de 2015, 05:41:10 »
if (Escape) return; dentro de todos los do.. while que tengas en la funcion arranque

Desconectado hortoedro

  • PIC10
  • *
  • Mensajes: 19
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #13 en: 17 de Abril de 2015, 06:58:22 »
Ok, gracias compañeros. ¿ Entonces al utilizar tantos while() ,me es imposible salir de una función sin dejar de ejecutarla no?

KILLERJC he probado lo que me comentas de los if() en los do{} while() pero no me funciona.

Gracias, seguire probando. Un saludo

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: Salir de una función que se este ejecutando en "segundo plano".
« Respuesta #14 en: 17 de Abril de 2015, 07:18:01 »
No es que no te funcione, es que por ejemplo mientras tu micro esta en un bucle while, no esta haciendo otra cosa.

un ejemplo: Si creas una temporización en tu sistema, solo una, por ejemplo un timer que de una interrupcion cada 1 ms, y en ese timer vas incrementando flag., y en tu bucle while:

while1(1)

{
     if(flag1=="tiempo que quieres que se ejecute la funcion1")
     {
            funcion1();
     }
     if(flag2=="tiempo que quieres que se ejecute la funcion2")
     {
            funcion2();
     }
}

De esta manera solo ejecutara las funciones si tienen que ejecutarse, si no, pasara a la siguiente.

por ejemplo si la funcion1 incrementa segundos entrara 1 vez cada 1000 veces del timer.

si la funcion2 incrementa minutos entrara 1 vez cada 60000 veces del timer.

así tu micro estará "ejecutando varias tareas" al mismo tiempo y nunca se quedara parado en una función, no tendrás que salir de una función a mano, para ejecutar otra, cada una se ejecuta cuando le toca.
pero no pongas while dentro de las funciones por que si no estarías en las mismas. y no te preocupes por el tiempo el micro es muy muy rápido
« Última modificación: 17 de Abril de 2015, 07:21:32 por juaperser1 »
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw


 

anything