Discussão do artigo "Criando interfaces gráficas baseadas no .Net Framework e C# (Parte 2): elementos gráficos adicionais" - página 2

 
fxsaber:

Foi detectado um erro muito grave ao trabalhar com janelas C#. Se você mover a janela C# continuamente, o Terminal desaparecerá da tela após alguns segundos, e a carga do núcleo da CPU do terminal64.exe excederá 100%. Tenho 8 núcleos, portanto a carga total do núcleo no TaskManager na CPU é de 12-13%. Quando a janela C# está se movendo, ela é de 19%.

Ah, isso é legal. Experimentei - ela realmente desaparece. Ou melhor, ela não desaparece, mas é minimizada na bandeja, como se você tivesse pressionado o botão "minimizar".

Quanto ao carregamento de 100%, não estou vendo isso. Talvez seja porque você o tenha integrado e eu não.

 
fxsaber:

A remoção manual do GuiControllerElementsDemo pelo menu Terminal leva ao congelamento por alguns segundos.

Isso existe. Isso só acontece se o formulário não for fechado manualmente antes. Ainda não sei como contornar esse problema. Tentei fechar o formulário em Deinit() de várias maneiras, mas nenhuma delas funcionou. Se alguém souber como fazer isso, ficarei grato.

 
Vasiliy Sokolov:

Há isso. Isso só acontece se você não fechar o formulário manualmente antes. Ainda não sei como contornar isso. Tentei várias maneiras de apagar o formulário em Deinit(), mas nenhuma delas funcionou. Se alguém souber como fazer isso, ficarei grato.

Por que o manipulador padrão private void Form2_FormClosing(object sender, FormClosingEventArgs e)

não quer funcionar?

Quando eu estava experimentando a dll e o C#, por algum motivo tudo travava na saída porque eu não destruía os componentes criados fora do próprio formulário, era assim que acontecia:

public partial class Form2 : Form

    {

        static RichTextBox CopyToClipboard;

.....

private void Form2_FormClosing(object sender, FormClosingEventArgs e)

        {

 CopyToClipboard.Clear();

 CopyToClipboard = null;

Se eu não destruísse antes de fechar o formulário do MQL, ele ficava terrivelmente lento ou travava.

 
Vasiliy Sokolov:

Ah, legal. Experimentei e ele realmente desaparece. Ou melhor, ele não desaparece, mas é minimizado na bandeja, como se o botão "minimizar" tivesse sido pressionado.

Tentei mover a própria janela do Terminal (o C# não está em execução). Em cerca de 10 segundos, absolutamente todas as janelas (ME, navegadores, etc.) foram minimizadas, deixando a área de trabalho vazia.

Quanto ao carregamento de 100%, não estou vendo isso. Talvez seja porque você o tenha incorporado e eu não.


Ao mesmo tempo, monitorei a execução do Expert Advisor. Aqui está o resultado

2019.06.11 17:37:29
2019.06.11 17:37:30
2019.06.11 17:37:54
2019.06.11 17:38:06
2019.06.11 17:38:07
2019.06.11 17:38:08

Você pode ver claramente que o Expert Advisor interrompeu seu trabalho enquanto a janela do Terminal estava se movendo.

 
fxsaber:

Ao mesmo tempo, monitorei a execução do Expert Advisor. Aqui está o resultado

Você pode ver claramente que o Expert Advisor interrompeu seu trabalho enquanto a janela do Terminal estava em movimento.

Fiz uma verificação no cronômetro - não vejo nenhuma interrupção. Ele envia tudo para o registro muito rapidamente.

 
Igor Makanu:

e por que o manipulador padrão private void Form2_FormClosing(object sender, FormClosingEventArgs e)

não quer funcionar?

Quando eu estava experimentando com a dll e o C#, por algum motivo tudo travava na saída porque eu não destruía os componentes criados fora do próprio formulário, era assim que acontecia:

Se eu não destruísse antes de fechar o formulário do MQL, ele ficava terrivelmente lento ou travava.

Tentei fazer isso por meio do form.Dispose() padrão. Ou seja, quando GuiController::HideForm() é chamado, Dispose do formulário correspondente é chamado. Tudo funcionou bem no aplicativo de teste em C#. Mas não funciona no MT. Mas se fecharmos o formulário manualmente antes de excluir o Expert Advisor, tudo funcionará bem.

 
Vasiliy Sokolov:

Tentei fazer isso por meio do form.Dispose() padrão. Ou seja, quando GuiController::HideForm() é chamado, Dispose do formulário correspondente é chamado. Tudo funcionou bem no aplicativo de teste em C#. Mas não funciona no MT. Mas se fecharmos o formulário manualmente antes de excluir o Expert Advisor, tudo funcionará bem.

Aqui ele é descarregado instantaneamente.

 
fxsaber:

Ele descarrega instantaneamenteaqui.

Sim, eu vi seu painel. Que função você usa para descarregar?

 
Vasiliy Sokolov:

Tentei fazer isso por meio do form.Dispose() padrão. Ou seja, quando GuiController::HideForm() é chamado, o Dispose do formulário correspondente é chamado. Tudo funcionou bem no aplicativo de teste em C#. Mas não funciona no MT. Mas se fecharmos o formulário manualmente antes de excluir o Expert Advisor, tudo funcionará bem.

Definitivamente, você deve pesquisar no Google, pois há algum processo em andamento.

Como alternativa, você ainda precisa chamar Form.Close() no Windows para fechar o aplicativo.

https://stackoverflow.com/questions/3097364/c-sharp-form-close-vs-form-dispose

Não chamar Close provavelmente evita o envio de várias mensagens Win32 que, em minha opinião, são importantes, embora eu não saiba dizer especificamente por quê...

O Close tem a vantagem de gerar eventos (que podem ser cancelados), de modo que uma pessoa de fora (do formulário) poderia observar o FormClosing e o FormClosed para reagir de acordo.

Não tenho certeza se o FormClosing e/ou o FormClosed são gerados se você simplesmente descartar o formulário, mas deixarei isso para você experimentar.


Vasiliy Sokolov:

Sim, eu vi seu painel. Que função você usa para descarregar?

Quando chamo a .dll, crio dois threads e executo cada formulário neles por meio de ShowDialog(), elimino os formulários por meio de uma chamada trivial do método Close() e libero memória por precaução - não sei como o coletor de lixo funciona no .Net )))))
public static class FormsMT5
    {
        private static Form1 MainForm;
        private static Form2 OrderForm;
	 private static Thread ThreadMainform, ThreadOrderForm;
....................
 

public static void FormDeinit(int reason)
        {
            if (reason == 3 || reason == 5) return;
            if (MainForm != null)
            {
                MainForm.Close();
            }
            if (OrderForm != null)
            {
                OrderForm.Close();
            }
            if (ThreadMainform != null) ThreadMainform.Join();
            if (ThreadOrderForm != null) ThreadOrderForm.Join();
            MainForm = null;
            OrderForm = null;
            ThreadMainform = null;
            ThreadOrderForm = null;
        }
C# Form.Close vs Form.Dispose
C# Form.Close vs Form.Dispose
  • 2010.06.22
  • topgun_ivardtopgun_ivard 3,91683142
  • stackoverflow.com
I am new to C#, and I tried to look at the earlier posts but did not find a good answer. In a C# Windows Form Application with a single form, is using better or ? MSDN says that all resources within the object are closed and the form is disposed when...
 
Vasiliy Sokolov:

Sim, eu vi seu painel. Que função você usa para descarregar?

Esse é o painel do Igor. Acabei de publicá-lo.