×

Discussion Board

Page 1 of 3 123 LastLast
Results 1 to 15 of 31
  1. #1
    Regular Contributor
    Join Date
    May 2007
    Posts
    77

    Problemas con RTimer

    Hola, escribia porque estoy desarrollando una aplicación que muestra un mensaje cuando salta un determinado evento.

    El evento que estoy tratando es que llegue determinada hora, es decir, decirle por ejemplo que muestre la ventana a las 16.00. Para hacer esto utilizo RTimer y su metodo At, peor me da error al ejecutar, el codigo que utilizo es el siguiente:

    void CReloj::AsignarEvento(){
    TTime hora;
    hora.HomeTime();
    //Suma 30 segundos a la hora actual
    TTimeIntervalSeconds timeIntervalSeconds(30);
    hora += timeIntervalSeconds;
    iTimer.At(iStatus,hora);
    SetActive();
    }

    El error me da en la llamada iTimer.At(iStatus,hora), donde iTimer es un objeto de la clase RTimer que tiene como atributo privado la clase.

    La creación del RTimer la hago asi:

    User::LeaveIfError(iTimer.CreateLocal());

    y esta llamada no falla, por lo que el RTimer se crea bien.

    ¿A alguien se le ocurre donde puede estar el error?

    Por si sirve de ayuda utilizo el Carbide C++ para crear el codigo y el SDK3 FP1.

    La aplicación solo esta probada en el emulador porque todavia no tengo disponible el terminal.

  2. #2
    Registered User
    Join Date
    Apr 2005
    Location
    Barcelona
    Posts
    1,678

    Re: Problemas con RTimer

    La llamada asíncrona no devuelve error, por lo que supongo que te refieres a que el error lo recibes en el RunL (iStatus). Si así fuera, de qué error se trata?

  3. #3
    Regular Contributor
    Join Date
    May 2007
    Posts
    77

    Re: Problemas con RTimer

    El error me da al hacer la hacer la llamada asincrona, no llegan a pasar los 30 segundos desde que le doy al boton hasta que da el error (de hecho da enseguida) por lo que no creo que el error este en el RunL.

    De hecho en el RunL solo muestro una ventana y este codigo lo tengo copiado de otra aplicacion en el que me funciona sin problemas.

    El error que me da es "KERN-EXEC 3" que mirando la información de los errores de la pagina de Symbian no da mucha información , puesto que dice que se debe a errores sin capturar...

  4. #4
    Registered User
    Join Date
    Apr 2005
    Location
    Barcelona
    Posts
    1,678

    Re: Problemas con RTimer

    Mirandolo mejor, ya me doy cuenta del problema (el panic también ayudó): el problema es que defines una variable automática (hora) y la usas en una llamada asíncrona. Luego del SetActive(), esta variable es destruída (al salir del scope), produciendo luego el panic. Hazla miembro de la clase, y al menos el panic no aparecerá más. Esto lo debieras hacer siempre que uses llamadas asíncronas.

  5. #5
    Regular Contributor
    Join Date
    May 2007
    Posts
    77

    Re: Problemas con RTimer

    Hola, he probado a definir el objeto TTime como propio de la clase pero sigue sin ir, de hecho ahora me da el mismo panic pero al asignar el valor al TTime (he ido comentandos líneas para ver en cual daba y he visto que es en esa). El codigo es:

    void CReloj::AsignarEvento(){
    iHora.HomeTime();
    //Suma 30 segundos a la hora actual
    TTimeIntervalSeconds timeIntervalSeconds(30);
    iHora += timeIntervalSeconds;
    iTimer.At(iStatus,iHora);
    SetActive();
    }

    iHora y iTimer los defino asi (solo pongo la cabecera de la clase y la porción de código de los atributos):

    class CReloj: public CActive
    {
    private:
    RTimer iTimer;
    TTime iHora;

    };

    Por si acaso pudiera ser la fuente de error (aunque sería en el caso anterior con hora como global), la inicialización del iTimer es como sigue:

    void CReloj::ConstructL(){
    User::LeaveIfError(iTimer.CreateLocal());
    CActiveScheduler::Add(this);
    }

    Supongo que el motivo de que el error de al llamar a un atributo sera algun fallo de concepto mio, pero no entiendo porque da ese error (tengo otra aplicación que falla también al dar valor a un TReal que tengo por atributo).

  6. #6
    Registered User
    Join Date
    Mar 2003
    Posts
    33

    Re: Problemas con RTimer

    Hola, no sé si te servirá de ayuda o no ya que el RTimer nunca lo usé de manera asíncrona, suelo usar el CPeriodic. Pero tengo este método funcionando de manera síncrona.

    void PauseL(const TInt aTime)
    {
    RTimer timer;
    TRequestStatus timerStatus;
    timer.CreateLocal();
    TTime time;
    time.HomeTime();
    TTimeIntervalSeconds timeIntervalSeconds(aTime);
    time += timeIntervalSeconds;
    timer.At(timerStatus,time);
    User::WaitForRequest(timerStatus);
    }


    Por si te da alguna pista.
    Saludos,
    Francisco de Borja González
    Foro Nokia en Español

  7. #7
    Regular Contributor
    Join Date
    May 2007
    Posts
    77

    Re: Problemas con RTimer

    Viendo tu codigo y el mio solo veo la diferencia de la espera activa en lugar del active object y que tu usas un TRequestStatus creado por ti y yo uso el que se heredada de CActive.

    Cuando creo el TTime como atributo privado de la clase me da el error al usarlos, ¿Porque puede ser?, tengo otras dos aplicacioens qeu no m funcionan por lo mismo, dan un panic, el USER-EXEC 3, cuando accedo a uno de los atributos de la clase. ¿Sabeis porque puede ser o si hay alguna manera de ver los fallos como se hacia en java con las excepciones?

    Muchas gracias de antemano y gracias saryon por la ayuda.

  8. #8
    Registered User
    Join Date
    Apr 2005
    Location
    Barcelona
    Posts
    1,678

    Re: Problemas con RTimer

    El panic es un KERN-EXEC o USER-EXEC?
    Ayudaría que pusieras un trozo mínimo de código que reproduzca el error.

    Cuando creo el TTime como atributo privado de la clase me da el error al usarlos, ¿Porque puede ser?
    Qué tipo de error?

    Saludos

  9. #9
    Regular Contributor
    Join Date
    May 2007
    Posts
    77

    Re: Problemas con RTimer

    Es un KERN-EXEC 3 ,perdon por la confusión de antes.

    Respecto al trozo de codigo ya los puse en un post anterior, lo vuelvo a poner:

    void CReloj::AsignarEvento(){
    iHora.HomeTime();
    //Suma 30 segundos a la hora actual
    TTimeIntervalSeconds timeIntervalSeconds(30);
    iHora += timeIntervalSeconds;
    iTimer.At(iStatus,iHora);
    SetActive();
    }

    iHora y iTimer los defino asi (solo pongo la cabecera de la clase y la porción de código de los atributos):

    class CReloj: public CActive
    {
    private:
    RTimer iTimer;
    TTime iHora;

    };

    Por si acaso pudiera ser la fuente de error (aunque sería en el caso anterior con hora como local, ya que con ella como atritubo da el error al inicializarla a ella), la inicialización del iTimer es como sigue:

    void CReloj::ConstructL(){
    User::LeaveIfError(iTimer.CreateLocal());
    CActiveScheduler::Add(this);
    }

  10. #10
    Registered User
    Join Date
    Apr 2005
    Location
    Barcelona
    Posts
    1,678

    Re: Problemas con RTimer

    Por favor, pon la clase completa.

    Un kern-exec 3 también suele ser problema de stack, podrías intentar modificando el stack size en el mmp (y poner 0x4000 por ej)

  11. #11
    Regular Contributor
    Join Date
    May 2007
    Posts
    77

    Re: Problemas con RTimer

    Estos son tanto el .h como el .cpp, espero que sirva de ayuda, voy a probar lo del stack y os cuento.
    -------------------------------------------------------------------------
    #ifndef CRELOJ_H_
    #define CRELOJ_H_

    #include <e32base.h>
    #include <aknappui.h>
    #include <aknnotewrappers.h>

    class CRelojublic CActive
    {

    public:
    static CReloj* NewL();

    ~CReloj();

    void AsignarEvento();

    protected:
    void RunL();
    void DoCancel();

    private:

    CReloj();

    void ConstructL();

    private:
    RTimer iTimer;
    TTime iHora;

    };

    #endif /*CRELOJ_H_*/
    --------------------------------------------------------------------------
    #include "CReloj.h"

    CReloj::CReloj(): CActive(EPriorityStandard){
    }

    CReloj* CReloj::NewL(){
    CReloj* reloj = new (ELeave) CReloj;
    CleanupStack::PushL(reloj);
    reloj->ConstructL();
    CleanupStack::Pop(reloj);
    return reloj;
    }

    CReloj::~CReloj(){
    Cancel();
    iTimer.Close();
    CActiveScheduler::Stop();
    }

    void CReloj::RunL(){
    if(iStatus ==KErrNone){
    _LIT(KMensaje,"Salto el evento");
    HBufC* textResource = HBufC::NewL(KMensaje().Length());
    CleanupStack::PushL(textResource);
    *textResource=KMensaje;
    CAknInformationNote* informationNote;

    informationNote = new ( ELeave ) CAknInformationNote;

    informationNote->ExecuteLD( *textResource);

    CleanupStack::PopAndDestroy( textResource );
    }
    }

    void CReloj::AsignarEvento(){
    iHora.HomeTime();
    //Suma 30 segundos a la hora actual
    TTimeIntervalSeconds timeIntervalSeconds(30);
    iHora += timeIntervalSeconds;
    iTimer.At(iStatus,iHora);
    SetActive();
    }

    void CReloj:oCancel(){
    iTimer.Cancel();
    }

    void CReloj::ConstructL(){
    User::LeaveIfError(iTimer.CreateLocal());
    CActiveScheduler::Add(this);
    }

  12. #12
    Registered User
    Join Date
    Apr 2005
    Location
    Barcelona
    Posts
    1,678

    Re: Problemas con RTimer

    No parece haber nada extraño. Lo único que me genera duda es por qué detienes el active scheduler en el destructor. Acaso estás usando un .exe? Si así fuera, no podrás usar CAknXXXNote. Debieras usar global notes.
    Si fuera una gui app, entonces debieras sacar el AS::Stop()

    Por cierto, el CActiveScheduler::Add(this); lo puedes poner en el c++ ctor, ya que no produce ningún leave..

  13. #13
    Regular Contributor
    Join Date
    May 2007
    Posts
    77

    Re: Problemas con RTimer

    Sigo liao con el problema y no soy capaz de solucionarlo.

    Podriais decirme motivos por los que se puedan dar KERN-EXEC 3, es que la información de la pagina de Symbian no me aclara nada.

    Gracias

  14. #14
    Registered User
    Join Date
    Apr 2005
    Location
    Barcelona
    Posts
    1,678

    Re: Problemas con RTimer

    La causa más común es una desreferencia de puntero nulo, pero como mencioné antes, también suele ocurrir cuando hay stack overflow (en el device)
    Se me hace que el problema está en otra parte de tu código. Lo que te recomiendo es que tomes un ejemplo simple (del sdk, por ej. los ejemplos que hay de consola) que sepas que funcione, y le agregues tu código.. algo así como un unit test..

  15. #15
    Regular Contributor
    Join Date
    May 2007
    Posts
    77

    Re: Problemas con RTimer

    Algo parecido hago ya porque mi clase esta incluida en las aplicaciones que crea por defecto carbide para mostrar el hola mundo, de hecho el CAknInformationNote que utilizo es lo que utiliza por defecto para mostrar el hola mundo, en esa parte solo cambio el texto a mostrar y eso se q funciona porque en otra aplicación que me va sin problemas tambén hago lo mismo).

    ¿Hay alguna forma de hacer un debug de la aplicación y ver que llamadas se han efectuado antes del error o incluso ver el valor de las variables antes del error? La única opción parecida que he encontrado hasta ahora es una opción que viene en el emulador (en la pantalla que se abre al pulsar Ctrl+P) y que lo que hace cuando sale el error es preguntarte si quieres ver el debug pero al darle que si lo que te muestre es el codewarrior y solo salen instrucciones en ensamblador y unos "system messages" de los cuales pongo aqui los últimos que muestra por si pudiera hacer ver la solución a alguien:
    ...
    Loading CTFramework.dll @0x1F4B0000
    Loading devinfosupportclient.dll @0x19010000
    Loading devinfosupportcommon.dll @0x1F4D0000
    Loading ocspsupportclient.dll @0x1F4E0000
    Loading ocsp.dll @0x1F500000
    Loading pkixcertbase.dll @0x1F530000
    Loading swicertstore.dll @0x1F560000
    Loading uissclient.dll @0x1F580000
    Loading sisregistryclient.dll @0x1F5B0000
    Loading plan.dll @0x1F5E0000
    Loading sisxfile.dll @0x1F600000
    Loading DbRecovery.exe @0x1F720000
    New Thread 0x00000C5C (3164)
    Thread 0x00000C5C (3164) has exited - code 0x00000000

Similar Threads

  1. Using CON API and PC Suite for Bluetooth communication
    By vishweshji in forum Symbian Networking & Messaging (Closed)
    Replies: 0
    Last Post: 2005-12-07, 03:30
  2. Problemas Con Builderx
    By caballeroantonio in forum Symbian
    Replies: 0
    Last Post: 2005-06-18, 01:46
  3. RTimer wondering
    By Blkangel in forum Symbian
    Replies: 0
    Last Post: 2003-08-26, 13:39
  4. Replies: 0
    Last Post: 2003-06-26, 12:20
  5. Nokia 22 PBC Con. Terminal
    By jamiegordon in forum Nokia M2M
    Replies: 1
    Last Post: 2002-12-03, 04:51

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
×