BLOG

Acompanhe a Mobits pelo RSS

FILTROS

Caros, por conta de um projeto nosso em desenvolvimento para Windows Mobile, tivemos que aprender como fazer agendamento de um programa, em background, a ser executado em uma hora específica.

Esse agendamento pode ser extremamente útil para o caso de você estar implementando um despertador, ou algo que de tempos em tempos verifique um estado para saber se o usuário deve ser notificado ou não, ou até executar um outro programa paralelo ao seu, rodando em background, enquanto o seu roda em primeiro plano. Neste link há um vídeo explicando como fazer. Se você não está muito a fim de assistir o vídeo em inglês, pode acompanhar por aqui.

Primeiro, baixe este arquivo e adicione ele ao seu projeto. Veja o que ele tem:

public class Scheduler {
    [DllImport("CoreDLL.dll")]
    public static extern int CeRunAppAtTime(string application, SystemTime startTime);

    [DllImport("CoreDLL.dll")]
    public static extern int FileTimeToSystemTime(ref long lpFileTime, SystemTime lpSystemTime);

    [DllImport("CoreDLL.dll")]
    public static extern int FileTimeToLocalFileTime(ref long lpFileTime, ref long lpLocalFileTime);
}

Para você que não está habituado com código nativo importado através de DLL, temos três métodos nessa classe, sendo que o principal é o primeiro:

[DllImport("CoreDLL.dll")]
public static extern int CeRunAppAtTime(string application, SystemTime startTime);

Basta chamar esse método, passando para ele o endereço da aplicação e a data no formato SystemTime. Essa classe está declarada dentro do arquivo, dessa forma:

[StructLayout(LayoutKind.Sequential)]
public class SystemTime {
    public ushort wYear;
    public ushort wMonth;
    public ushort wDayOfWeek;
    public ushort wDay;
    public ushort wHour;
    public ushort wMinute;
    public ushort wSecond;
    public ushort wMilliseconds;
}

Isso explica os outros métodos auxiliares da classe Scheduler. Ambos são usados para traduzir a data de DateTime para SystemTime. Mas, se você estiver utilizando nosso código, vai ver que há mais um método:

public static void AgendarDownload(string aplicativo, DateTime quando) {
    long fileStartTime = quando.ToFileTime();
    //convertendo de DateTime para SystemTime
    long localFileStartTime = 0;
    Scheduler.FileTimeToLocalFileTime(ref fileStartTime, ref localFileStartTime);
    SystemTime systemStartTime = new SystemTime();
    Scheduler.FileTimeToSystemTime(ref localFileStartTime, systemStartTime);

    //chamando o método nativo
    Scheduler.CeRunAppAtTime(aplicativo, systemStartTime);
}

E pronto! Com esse método estático, você pode chamar o Scheduler. Veja o exemplo abaixo, onde eu chamo o IE para ser executado cinco minutos depois:

static void Main(string[] args) {
        DateTime dataAgendamento = DateTime.Now + new TimeSpan(0, 5, 0);
        Scheduler.AgendarDownload(@"\Windows\iexplore.exe", dataAgendamento);
}

Em nossos testes, o código funcionou perfeitamente, tanto no Windows Mobile Professional quanto no Standard (se você não sabe a diferença entre eles, veja neste link). Testamos agendar para um horário em que o aparelho estivesse desligado, e o programa rodou assim que o Windows foi iniciado. Lembre-se que o aplicativo não tem nenhuma ligação com o que o agendou inicialmente; isso significa que se este for fechado, não influenciará na execução daquele.

COMPARTILHE

DEIXE UM COMENTÁRIO

If you can read this, you don't use a typical webbrowser that plays nice with CSS.
Please do not fill in anything here!