Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

PedroPinto

Tempo a carregar os objectos em runtime no Windows Form

Recommended Posts

PedroPinto

Boas pessoal, é o meu primeiro Tópico por isso desculpem se não fizer como deveria ser feito .

Então é o seguinte:

Estou a fazer um aplicação para desktop, inicialmente tinha feito em design time mas quando abria o formulário demorava muito a carregar os objetos. Tentei fazer em runtime, porem, ainda assim continua lento.

 

Alguma sugestão?

 

[Codigo Abaixo]

private void metroLink()
        {

            if (MpnlBar.InvokeRequired)
            {
                MpnlBar.BeginInvoke((MethodInvoker)delegate
                {
                    for (int i = 0; i < l.Length; i++)
                    {
                        l = new MetroLink
                        {
                            Size = new Size(75, 64),
                            Location = new Point(i * 62 + 1114, 3),
                            Image = Resources.Invalid,
                            NoFocusImage = Resources.Invalid,
                            ImageSize = 40,
                            Anchor = ((AnchorStyles.Top) | AnchorStyles.Right),
                            UseCustomBackColor = true,
                            BackColor = Color.Transparent,
                            Cursor = Cursors.Hand,
                            Name = "ml" + i.ToString(),
                            Visible = false,
                        };
                        l.Click += new EventHandler(Estados_Click);
                        MpnlBar.Controls.Add(l);
                    }
                    /*MetroLink*/
                    //Butão minimizar
                    l[0].Image = Resources.Minimizar_Ativo;
                    l[0].NoFocusImage = Resources.Minimizar_Passivo;
                    //Butão maximizar
                    l[1].Image = Resources.Maximizar_Ativo;
                    l[1].NoFocusImage = Resources.Maximizar_Passivo;
                    //Butão Restaurar
                    l[3].Image = Resources.Restaurar_Ativo;
                    l[3].NoFocusImage = Resources.Restaurar_Passivo;
                    l[3].Location = new Point(1 * 62 + 1114, 3);
                    l[3].Visible = true;
                    //Butão Fechar
                    l[2].Image = Resources.Desligar_Ativo;
                    l[2].NoFocusImage = Resources.Desligar_Passivo;
                });
            }
        } 

 

[{Também estou a carregar uma imagem num painel que tem propriedade dock.fill (para simular uma imagem em background)

  Ao todo tenho 3 painel, um para fazer de Header, outra que cobre o formulário todo e por fim um para carregar um userControl(mas esse fica invisivel até o utilizador clicar no button)}]

 

Obrigado,

Edited by M6
Formatação de código.

Share this post


Link to post
Share on other sites
M6

O carregamento é sempre feito em runtime. Não há carregamento em em design time. O design time server apenas para desenhares os ecrãs com o rato uma vez que é significativamente mais simples e simpático do fazê-lo programáticamente. O que desenhas é depois carregado para memória em runtime.

A performance implica um misto de variáveis, desde a quantidade de objetos envolvidos até à performance do teu computador, passando pelo "peso" que cada objeto tem no que toca a informação (de entre outras coisas).

Se queres saber de onde vem o teu problema de performance, usa um profiler para compreenderes onde está a lentidão e foca-te em melhorar esse aspeto.
No entanto, a minha experiência diz-me que se um ecrã é lento a carregar muito provavelmente não será pela quantidade de objetos visuais que o mesmo tem de mostrar mas sim pela informação que têm de obter e disponibilizar ao utilizador.

  • Vote 1

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
PedroPinto
2 horas atrás, M6 disse:

O carregamento é sempre feito em runtime. Não há carregamento em em design time. O design time server apenas para desenhares os ecrãs com o rato uma vez que é significativamente mais simples e simpático do fazê-lo programáticamente. O que desenhas é depois carregado para memória em runtime.

A performance implica um misto de variáveis, desde a quantidade de objetos envolvidos até à performance do teu computador, passando pelo "peso" que cada objeto tem no que toca a informação (de entre outras coisas).

Se queres saber de onde vem o teu problema de performance, usa um profiler para compreenderes onde está a lentidão e foca-te em melhorar esse aspeto.
No entanto, a minha experiência diz-me que se um ecrã é lento a carregar muito provavelmente não será pela quantidade de objetos visuais que o mesmo tem de mostrar mas sim pela informação que têm de obter e disponibilizar ao utilizador.

Obrigado pela a resposta,

Realmente eu só carrego 3 paineis , 4 link e 2 tile, mas penso que o que está a por o sistema lento é as imagens que esses objetos têm. Será que por estar a carregar muitas imagens png e ico ao mesmo tempo, origina a lentidão?

Existe alguma forma de por os objetos a seres criados/mostrados em simultaneo?SXS75Ub.png

 

Edited by PedroPinto

Share this post


Link to post
Share on other sites
M6

Sim, as imagens podem ter peso, quanto maiores/melhores mais lento será. Usa imagens com um tamanho/qualidade significativamente menor e testa se a lentidão vem daí.

Não percebo bem o que queres dizer por criar/mostrar os objetos em simultâneo. Se a tua ideia é fazer isso em paralelo não creio que resulte, uma vez que a lentidão não vem da sequência mas sim da leitura dos ficheiros e do renderização das imagens.

Não sei que máquina tens, mas a lentidão até pode ser apenas uma questão apenas no teu computador.

  • Vote 1

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
PedroPinto
5 horas atrás, M6 disse:

Sim, as imagens podem ter peso, quanto maiores/melhores mais lento será. Usa imagens com um tamanho/qualidade significativamente menor e testa se a lentidão vem daí.

Não percebo bem o que queres dizer por criar/mostrar os objetos em simultâneo. Se a tua ideia é fazer isso em paralelo não creio que resulte, uma vez que a lentidão não vem da sequência mas sim da leitura dos ficheiros e do renderização das imagens.

Não sei que máquina tens, mas a lentidão até pode ser apenas uma questão apenas no teu computador.

Inicialmente pensava utilizar tasks para fazer o tempo diminuir (adicionando tbm um SplashScreen enquanto estava a carregar etc..). Em relação a maquina, na empresa onde estou as maquina são boas o suficiente para este tipo de desenvolvimento (ao contrário da minha  . . . ). 

Vou testar renderizar a imagem de fundo e ver se fica mais rápido. 

Update: Tinha um imagem de 3 megas(não admira que desse lag), reduzi para 200kb ficou muito mais fluido.

Por exemplo eu tenho o main form da minha (Prototipo) e carrega todo de uma vez(fluido)kAuWvmv.png

Só quando faço o evento de expansão da tela (maximizar) e quando restauro a tela para o formato original é que os objetos demoram uma eternidade a mover de posição (atravéz do anchor), é normal ou posso fazer de outra forma (estava a pensar em criar um método onde mete-se as coordenadas de cada objeto para quando a tela fica cheia, porem não é eficaz porque depende da resolução do monitor. Tens alguma sugestão?

 

Obrigado,

Edited by PedroPinto
Update: Solução encontrada

Share this post


Link to post
Share on other sites
M6

Eu deixava no modo automático. Não me parece que consigas fazer os cálculos e o posicionamento dos objetos de forma mais rápida do que a plataforma o faz.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
PedroPinto
1 hora atrás, M6 disse:

Eu deixava no modo automático. Não me parece que consigas fazer os cálculos e o posicionamento dos objetos de forma mais rápida do que a plataforma o faz.

Eu até deixava só utilizando o anchor dava para o que queria. 

Mas o problema está durante a deslocação / quando expando o form e os objetos reactualizam as suas coordenadas.

Em alguma app que desenvolves-te encontras-te algum problemas semelhante?

 

Share this post


Link to post
Share on other sites
M6

Não me recordo de ter problemas de performance desse tipo.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
PedroPinto
2 minutos atrás, M6 disse:

Não me recordo de ter problemas de performance desse tipo.

Em alternativa, estou a pensar por uma espécie de loading screen, enquanto muda a propriedade visível = true para falso e quando terminarem metia a trus novamente. 

Porque já que não consigo diminuir o tempo, pelo menos se já não mostrar ao utilizador os objetos a desaparecerem já ficaria mais agradável para o utilizador. 

Sendo a minha primeira app não sei ao certo como devo fazer a otimização. 

 

Obrigado pelas resposta, em curto prazo :). 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.