Episódio 24 — Persistência de Estado: Continuar de onde parou (mesmo depois do reboot)
Imagine um cenário real:
- Seu aplicativo inicia uma sequência de tarefas
- O usuário fecha o app ou o sistema reinicia por atualização
- Ao abrir de novo, ele precisa recomeçar tudo?
A resposta mais comum: sim.
Mas e se não precisasse?
✅ Salvando o contexto da execução
Graças à estrutura do TTaskChain e do TSafeThread, é possível serializar parte do contexto de execução em tempo real:
- Nome da tarefa atual
- Parâmetros recebidos
- Resultados parciais (se aplicável)
- Status: "em execução", "concluída", "erro", "cancelada"
Armazenando essas informações em um arquivo local, banco de dados ou mesmo cache, você pode:
- Retomar a execução no mesmo ponto
- Ignorar tarefas já finalizadas com sucesso
- Reprocessar tarefas com erro ou canceladas
⚠️ O que não salvar:
- Ponteiros ou objetos não serializáveis
- Referências diretas a elementos visuais (Image, Label, Memo, etc.)
- Funções anônimas (closures)
⚖️ Como projetar para isso
- Crie uma estrutura simples (record ou class) que represente o estado da execução
- Serialize em JSON, INI ou outro formato de sua preferência
- No início da execução, verifique se há estado anterior salvo
- Decida o ponto de retomada
- Continue a partir dali
Exemplo de estrutura de estado:
type
TTaskChainState = record
CurrentIndex: Integer;
TaskStatus: TArray<string>; // 'Pending', 'Success', 'Error', 'Canceled'
Parameters: TArray<string>;
end;
Integração com o TTaskChain
Adicione checkpoints entre as tarefas:
SaveStateToFile(TaskIndex, Status);
E no início:
if FileExists(StateFile) then
begin
LoadState;
SkipCompletedTasks;
end;
Conclusão
Persistir o estado é uma extensão natural de um modelo de execução assíncrona elegante.
Com isso, seu sistema não só ganha robustez, como também mostra respeito ao tempo e contexto do usuário.
No próximo episódio, vamos mostrar como lidar com retentativas automáticas, incluindo backoff exponencial, detecção de falhas permanentes e tratamento de instabilidade de rede.