CAPÍTULO 4
Programação visual com Software Livre
EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo.  Prólogo de Benoit Minisini




Evento Kill() e a propriedade Value


Além do método Kill(), a classe Process emite um evento Kill() quando um processo é finalizado, de forma normal ou por um erro. A sintaxe desse evento é:


PUBLIC SUB Kill()

. . . . . . . . . . . .

END


Até agora, em nosso gerenciador de  downloads  temos  esperado  em  um  loop até  que o processo acabe, mas podemos criar uma estrutura mais elegante, mais adaptada a programação orientada a objetos, valendo-nos desse evento: em lugar de esperar em um loop, aguardamos tranquilamente sem fazer absolutamente nada em nosso programa principal até receber o evento Kill(), seja porque o download finalizou bem ou porque o usuário decidiu cancelar o processo:


PRIVATE hCancelar AS Boolean

PRIVATE hProc AS Process

PUBLIC SUB BtnCancelar_Click()

hCancelar = TRUE

hProc.Kill()

END

PUBLIC SUB Process_Error(Err AS String)

DIM sCad AS String[ ]

Err = Trim(Err)

sCad = Split(Err, " ")

LblInfo.Text = sCad[sCad.Count - 1]

END

PUBLIC SUB Process_Kill()

IF hCancelar = TRUE THEN

Message.Warning("Processo Cancelado")

ELSE

Message.Info("Download concluido")

END IF

LblInfo.Text = "Inativo"

BtnCancelar.Enabled = FALSE

END

PUBLIC SUB BtnDownloads_Click()

DIM sCad AS String

TextLicenca.Text = ""

hCancelar = FALSE

BtnCancelar.Enabled = TRUE

hProc = EXEC ["curl", "http://www.gnu.org/licenses/gpl.txt", "-#"] FOR READ

END

PUBLIC SUB Process_Read()

DIM sCad AS String

LINE INPUT #LAST, sCad

TextLicenca.Text = TextLicenca.Text & sCad & "\n"

END


Trocamos  a declaração  de  hProc  da  função BtnDownload_Click() ao inicio  de  nosso formulário,  para que seja acessível também do evento BtnCancelar_Click(). Agora lançamos um processo e já não esperamos em um loop. Se o usuário decidir cancelar o download, matamos o processo no mesmo evento BtnCancelar_Click().

Tanto faz o programa terminar normalmente como devido a um cancelamento, aproveitamos o evento Process_Kill() para informar ao usuário é devolver a interface a seu estado inicial(com o botão BtnCancelar desabilitado, e o Label marcando Inativo).

O resultado final: menos gastos de recursos (o programa principal não tem que executar o loop constantemente), menos linhas de código e melhor estruturação de todo o processo.


Por outro lado, a maior parte de programas de console (e gráficos) devolvem ao sistema um código de erro quando finalizam. O costume é que se devolve um zero se todo acorrer bem e outro valor quando algo falhou.
 

A partir do console podemos fazer um teste executando em uma janela de terminal estes dois comandos consecutivos:


$   Ls -l /dev

$    echo $?


Ao executarmos echo $? obteremos um zero. O shell do sistema armazenou o ultimo código de erro disponível na varável $? e, em seguida  o mostramos na tela: tudo ocorreu bem. Agora executamos o seguinte comando:


$   Ls -l /arquivo/que/não/existe

$    echo $?


Nesta ocasião obteremos um seis, um código de erro que no caso do comando ls implica que o caminho não existia (sempre e quando não haja, por uma estranha razão que desconhecemos, um arquivo em nosso sistema cujo caminho seja /arquivo/que/não/existe).

Se curl não poder acessar a URL, por qualquer circunstância, retorna um valor diferente de 0. Nós podemos ler em nosso código esse valor, mediante a propriedade Value, e informar ao usuário o erro. A seguir modificamos o código do programa anterior de forma que o evento Kill fique assim:
 

PUBLIC SUB
Process_Kill()

IF LAST.value <> 0 THEN

Message.Error("Erro no Download")

ELSE

IF hCancelar = TRUE THEN

Message.Warning("Processo cancelado")

ELSE


Message.Info("Download completo")

END IF

END IF

LblInfo.Text = "Inativo"

BtnCancelar.Enabled = FALSE

END

Testamos  o  programa  desconectando  o  modem da internet  desencaixando o cabo  da  rede  ou desabilitando a rede de nosso sistema. Observamos agora que podemos determinar com exito a falha do download, alem de seu cancelamento.







HOME


Cópia literal

Extraído do livro “GAMBAS, programação visual com software Livre”, da editora EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo. Prólogo de Benoit Minisini

LICENSA DESTE DOCUMENTO


É permitido a cópia e distribuição da totalidade ou parte desta obra sem fins lucrativo. Toda cópia total ou parcial devera expressar o nome do autor e da editora e incluir esta mesma licença, adicionando se é uma cópia literal “Cópia literal”. Se é autorizada a modificação e tradução da obra  sem fins lucrativo sempre se deve constar na obra resultante  a modificação o nome da obra original o autor da obra original e o nome da editora e a obra resultante também deverá ser livremente reproduzida, distribuída, ao publico e transformada em termos similares ao exposto nesta licença.

Tradução

Cientista
 (Antonio Sousa)