Discusión sobre el artículo "Desarrollando las interfaces gráficas a base de .Net Framework e C# (Parte 2): Elementos gráficos adicionales" - página 2

 
fxsaber:

Se ha detectado un error muy grave de trabajo con C#-windows. Si mueves continuamente C#-window, Terminal desaparece de la pantalla después de unos segundos, y la carga de CPU-core de terminal64.ine excede el 100%. Tengo 8 núcleos, por lo que la carga completa del núcleo en TaskManager en la CPU es del 12-13%. Cuando la ventana de C# se está moviendo, es del 19%.

Qué bien. Lo he probado - realmente desaparece. O mejor dicho, no desaparece, sino que se minimiza a la bandeja, como si pulsaras el botón "minimizar".

En cuanto a la carga al 100%, yo no la veo. Quizás sea porque tú lo tienes incorporado y yo no.

 
fxsaber:

La eliminación manual de GuiControllerElementsDemo a través del menú Terminal provoca la congelación durante unos segundos.

Existe tal cosa. Ocurre sólo si el formulario no se cierra manualmente antes. Todavía no sé cómo evitarlo. He intentado cerrar el formulario en Deinit() de varias maneras, pero ninguna ha funcionado. Si alguien sabe cómo hacerlo, se lo agradeceré.

 
Vasiliy Sokolov:

Está esto. Sólo ocurre si no cierras el formulario manualmente antes. Aún no sé cómo evitarlo. He probado varias formas de apagar el formulario en Deinit(), pero ninguna ha funcionado. Si alguien sabe cómo hacerlo, se lo agradeceré.

¿por qué el manejador estándar private void Form2_FormClosing(object sender, FormClosingEventArgs e)

no quiere funcionar?

cuando estaba experimentando con dll en C#, por alguna razón todo se bloqueaba al salir porque no destruía los componentes creados fuera del propio formulario, así era:

public partial class Form2 : Form

    {

        static RichTextBox CopyToClipboard;

.....

private void Form2_FormClosing(object sender, FormClosingEventArgs e)

        {

 CopyToClipboard.Clear();

 CopyToClipboard = null;

si no destruia antes de cerrar el formulario desde MQL - se ralentizaba terriblemente o se estrellaba.

 
Vasiliy Sokolov:

Genial. Lo he probado y sí que desaparece. O mejor dicho, no desaparece, sino que se minimiza a la bandeja, como si se hubiera pulsado el botón "minimizar".

He probado a mover la propia ventana del Terminal (C# no se está ejecutando). En unos 10 segundos se minimizaron absolutamente todas las ventanas (ME, navegadores, etc.), dejando el escritorio desnudo.

En cuanto a la carga al 100%, yo no lo veo. Quizás sea realmente porque tú lo tienes incorporado y yo no.


Al mismo tiempo he monitorizado la ejecución del Asesor Experto. Aquí está el 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

Se puede ver claramente que el Asesor Experto detuvo su trabajo mientras la ventana del Terminal se movía.

 
fxsaber:

Al mismo tiempo supervisé la ejecución del Asesor Experto. He aquí el resultado

Se puede ver claramente que el Asesor Experto detuvo su trabajo, mientras que la ventana de Terminal se movía.

Hice una comprobación a través del temporizador - no veo ningún cuelgue. Envía todo al registro muy rápidamente.

 
Igor Makanu:

y por qué el manejador estándar private void Form2_FormClosing(object sender, FormClosingEventArgs e)

no quiere funcionar?

cuando estaba experimentando con dll an C#, por alguna razón todo se bloqueaba al salir porque no destruía los componentes creados fuera del propio formulario, así era:

Si no destruía antes de cerrar el formulario desde MQL, se ralentizaba terriblemente o se estrellaba.

Intenté hacerlo mediante el form.Dispose() estándar. Es decir, cuando se llama a GuiController::HideForm(), se llama a Dispose del formulario correspondiente. Todo funcionaba bien en la aplicación de prueba en C#. Pero no funciona en MT. Pero si cerramos el formulario manualmente antes de borrar el Asesor Experto, todo funciona bien.

 
Vasiliy Sokolov:

He intentado hacerlo a través del form.Dispose() estándar. Es decir, cuando se llama a GuiController::HideForm(), se llama a Dispose del formulario correspondiente. Todo funcionó bien en la aplicación de prueba en C#. Pero no funciona en MT. Pero si cerramos el formulario manualmente antes de borrar el Asesor Experto, todo funciona bien.

Aquí se descarga instantáneamente.

 
fxsaber:

Se descarga instantáneamenteaquí.

Sí, he visto tu panel. ¿Qué función utiliza para descargar?

 
Vasiliy Sokolov:

He intentado hacerlo a través del form.Dispose() estándar. Es decir, cuando se llama a GuiController::HideForm(), se llama a Dispose del formulario correspondiente. Todo funcionó bien en la aplicación de prueba en C#. Pero no funciona en MT. Pero si cerramos el formulario manualmente antes de borrar el Asesor Experto, todo funciona bien.

Definitivamente deberías buscarlo en Google, algún proceso está dando vueltas.

Alternativamente, usted todavía necesita llamar Form.Close() para Windows para cerrar la aplicación.

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

No llamar a Close probablemente evita enviar un montón de mensajes Win32 que uno pensaría que son algo importantes aunque no podría decirte específicamente por qué...

Close tiene la ventaja de lanzar eventos (que pueden ser cancelados) de tal forma que una persona ajena (al formulario) podría estar atenta a FormClosing y FormClosed para reaccionar en consecuencia.

No tengo claro si FormClosing y/o FormClosed se activan si simplemente eliminas el formulario, pero te dejo que experimentes con ello.


Vasiliy Sokolov:

Sí, he visto tu panel. ¿Qué función utilizas para descargar?

cuando llamo a .dll creo 2 hilos y ejecuto cada formulario en ellos mediante ShowDialog(), mato los formularios mediante una llamada trivial al método Close() y libero memoria por si acaso - no sé cómo funciona el recolector de basura en .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:

Sí, he visto tu panel. ¿Qué función usas para descargar?

Es el panel de Igor. Acabo de publicarlo.