Ir para o conteúdo

Rankings


Conteúdo Popular

A mostrar o conteúdo com mais reputação desde 08-07-2018 em todas as áreas

  1. 2 pontos
    O Application.ProcessMessages é largamente usado para 'desenrascar' esse problema, mas o seu uso não é sem custos... Este método serve para 'avisar' o programa para processar as mensagens (duh! ) que estão na queue do Windows, independentemente de quais são e do risco associado à execução de mensagens fora de ordem. Antes de mais, uma explicação simplista do que são 'mensagens': O GUI do Windows funciona porque os seus elementos enviam mensagens uns aos outros com indicação do que querem fazer. Por exemplo, quando clicas num botão, é enviada uma mensagem para o componente encarregue de alterar o aspecto visual do botão (que o faz parecer 'pressionado' visualmente) que por sua vez manda uma mensagem à form para se redesenhar para que o novo aspecto seja mostrado, há uma mensagem a dar iniciação do trabalho do botão, etc. Ao fazer ProcessMessages, estás a forçar a main thread do programa a executar tudo o que estiver na fila, e isto tem, de entre outras, as seguintes consequências: Estás a parar temporariamente a execução da tarefa principal, obrigando-a a demorar mais tempo Estás a mandar executar mensagens a meio da tarefa, sem saber quais as mensagens que lá estão nem os problemas que a sua execução forçada pode causar. No caso, a tua ideia faz com que ele pare a leitura dos dados, actualize o UI ao processar as mensagens de actualização que estão pendentes, e volta a ler, e voltar a parar, e por aí fora até completar a leitura. Como à primeira vista, isto funciona, muita gente o faz. O que muitos desconhecem é que, ao fazer isto, podem estar com uma simples linha a introduzir bugs no programa, bugs esses que são de detecção extremamente difícil pois existem pela execução de mensagens fora da ordem correcta. O caso é tal que podes correr um programa e dar tudo bem, voltas a correr sem alterar nada e os bugs manifestam-se, voltas a correr e está tudo bem, voltas a correr e aparecem bugs completamente diferentes dos primeiros. Ou seja, o pesadelo de qualquer programador. Por outro lado, dependendo das mensagens pendentes, o resultado pode nem ser o esperado, e não resolve sequer o problema inicial. Podes agora 'resolver' assim, e noutro programa em que te depares com um problema semelhante, resolves usar o mesmo, mas nesse outro programa não funcionar, por um qualquer motivo. Isto retira-te a previsibilidade das soluções, o que te obrigará a perder tempo à procura da solução de cada vez que te surgir o problema. E se o utilizador for dado a clicar à toa enquanto espera, como há tantos por aí, o resultado é muitas vezes o crash do programa, porque independentemente de lhe mandarmos processar as mensagens, a thread continua a ser só uma, e nem sempre com capacidade de fazer tudo o que lhe pedem. Nota: Não estou com isto a dizer que nunca se deve usar o ProcessMessages, ou que no teu caso não resolva o problema sem introduzir outros. Tudo depende do código circundante ao ProcessMessages. E mesmo quando os bugs aparecem, podem ser coisas tão banais quanto uma barra de progresso que anda para a frente e depois volta atrás, para depois voltar pra frente, não afectando nada de especial senão o aspecto visual. Mas há casos bem mais graves, o que me leva a recomendar que quem não saiba exactamente o que está a acontecer, ignore o 'remendo' que é o ProcessMessages, em favor de uma solução mais previsível, como o uso de multi-threading. Nota 2: Multi-threading não é, no entanto, um mar de rosas. É preciso perder algum tempo para sequer começar a ter ideia do ninho de ratos que aquilo é. No entanto, a partir do momento que saibas usar e implementares com as devidas protecções, é mais previsível e consistente do que correr mensagens desconhecidas a meio de uma tarefa.
  2. 1 ponto
    Se sabes que tens uma ou várias linhas com filmes de 1890 ainda assim pode não existir nenhuma chave para esse ano no HashMap: - Se a formatação das linhas no ficheiro estiver mal e o número de campos por linha não fôr 7 as linhas serão ignoradas; basta um ponto em vez duma vírgula, pois estás a separar os campos com vírgulas. String dados[] = linha.split(","); if (dados.length == 7){ - Se tiveres linhas com o mesmo primeiro campo todas as subsequentes à primeira serão ignoradas, independentemente dos restantes campos. if(filmesRepetidos.get(id)==null){ filmesRepetidos.put(id,filme); O melhor a fazeres é meteres um 'breakpoint' na linha que estoura e verificar quais as chaves contidas no HashMap. O teu IDE deverá permitir fazer isso sem esforço.
  3. 1 ponto
    Falou-se nisso aqui: https://www.portugal-a-programar.pt/forums/topic/61541-at-questões-legais/?do=findComment&comment=579005
  4. 1 ponto
    Estás a usar o método 'get' para procurar os filmes de 1890; se nenhum existir (estás a procurar nos primórdios do cinema) no HashMap irás obter um ponteiro nulo, como explicitado aqui. Deves usar o método containsKey para proteger contra isso.
  5. 1 ponto
    IBAN não é obrigatório. O resto é, mas tanto quanto sei, só no caso de empresas. (you know what I mean )
  6. 1 ponto
    Não use mais as extensões mysql_* veja: http://php.net/manual/en/function.mysql-query.php Warning This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include: mysqli_query() use apenas mysqli ou pdo
  7. 1 ponto
    @passarito, estamos em 2018, não em 1978 😂 A função upcase pode ser usada com caracteres e strings. readln(linha); linha := UpCase(linha); if linha = 'SIM' then begin // doçura de código end;
×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.