Обсуждение статьи "Создание графических интерфейсов на базе .Net Framework и C# (Часть 2): Дополнительные графические элементы" - страница 2

 
fxsaber:

Обнаружилась очень серьезная ошибка работы с C#-окнами. Если непрерывно перемещать C#-окно, то через несколько секунд Терминал исчезает с экрана, при этом нагрузка на CPU-ядра у terminal64.exe превышает 100%. У меня 8 ядер, поэтому полная нагрузка ядра в TaskManager у CPU 12-13%. При движении C#-окна - 19%.

О, прикольно. Попробовал - действительно исчезает. Вернее не исчезает, а сворачивается в трей, так как будто нажали кнопку "свернуть".

Что касается 100% загрузки - у меня не наблюдается. Возможно действительно дело в том что у Вас она встроена, а у меня нет.

 
fxsaber:

Снятие GuiControllerElementsDemo руками через меню Терминала приводит к подвисанию на несколько секунд.

Есть такое. Наблюдается только в том случае, если перед этим вручную не закрыть форму. Пока не знаю как обойти. Пробовал программно в Deinit() гасить форму несколькими способами, однако не один из них не подошел. Если кто из знающих подскажет - буду благодарен.

 
Vasiliy Sokolov:

Есть такое. Наблюдается только в том случае, если перед этим вручную не закрыть форму. Пока не знаю как обойти. Пробовал программно в Deinit() гасить форму несколькими способами, однако не один из них не подошел. Если кто из знающих подскажет - буду благодарен.

а почему стандартный обработчик  private void Form2_FormClosing(object sender, FormClosingEventArgs e)

не хочет работать?

я когда с dll ан C#  эксперименты творил, почему то при выходе крешилось все из за того, что не уничтожал созданные компоненты вне самой формы, вот такое было:

public partial class Form2 : Form

    {

        static RichTextBox CopyToClipboard;

.....

private void Form2_FormClosing(object sender, FormClosingEventArgs e)

        {

 CopyToClipboard.Clear();

 CopyToClipboard = null;

если не уничтожал перед закрытием формы из MQL - то тормозило жутко или креш

 
Vasiliy Sokolov:

О, прикольно. Попробовал - действительно исчезает. Вернее не исчезает, а сворачивается в трей, так как будто нажали кнопку "свернуть".

Попробовал шевелить окно самого Терминала (C# не запущен). Секунд через 10 абсолютно все окна (ME, браузеры и т.д.) свернулись, оголив рабочий стол.

Что касается 100% загрузки - у меня не наблюдается. Возможно действительно дело в том что у Вас она встроена, а у меня нет.


При этом мониторил выполнение советника. Вот результат

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

Хорошо видно, что советник прекратил свою работу на время движения окна Терминала.

 
fxsaber:

При этом мониторил выполнение советника. Вот результат

Хорошо видно, что советник прекратил свою работу на время движения окна Терминала.

Сделал проверку через таймер - зависаний не вижу. Очень шустро в лог все отправляет.

 
Igor Makanu:

а почему стандартный обработчик  private void Form2_FormClosing(object sender, FormClosingEventArgs e)

не хочет работать?

я когда с dll ан C#  эксперименты творил, почему то при выходе крешилось все из за того, что не уничтожал созданные компоненты вне самой формы, вот такое было:

если не уничтожал перед закрытием формы из MQL - то тормозило жутко или креш

Я пробовал делать через стандартный form.Dispose(). Т.е. когда вызывается GuiController::HideForm() идет вызов Dispose соответствующей формы.  В тестовом приложении на C# прекрасно все работало. Но в MT это не катит. Зато если перед удалением эксперта ручками закрываем форму - все отлично работает.

 
Vasiliy Sokolov:

Я пробовал делать через стандартный form.Dispose(). Т.е. когда вызывается GuiController::HideForm() идет вызов Dispose соответствующей формы.  В тестовом приложении на C# прекрасно все работало. Но в MT это не катит. Зато если перед удалением эксперта ручками закрываем форму - все отлично работает.

Здесь выгружается мгновенно.

 
fxsaber:

Здесь выгружается мгновенно.

Да, видел Вашу панель. С помощью какой функции выгружаетесь?

 
Vasiliy Sokolov:

Я пробовал делать через стандартный form.Dispose(). Т.е. когда вызывается GuiController::HideForm() идет вызов Dispose соответствующей формы.  В тестовом приложении на C# прекрасно все работало. Но в MT это не катит. Зато если перед удалением эксперта ручками закрываем форму - все отлично работает.

однозначно гуглить нужно, какой то процесс висит

как вариант, все равно нужно Form.Close() вызывать, чтобы Виндовс приложение закрыла

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

Not calling Close probably bypasses sending a bunch of Win32 messages which one would think are somewhat important though I couldn't specifically tell you why...

Close has the benefit of raising events (that can be cancelled) such that an outsider (to the form) could watch for FormClosing and FormClosed in order to react accordingly.

I'm not clear whether FormClosing and/or FormClosed are raised if you simply dispose the form but I'll leave that to you to experiment with.


Vasiliy Sokolov:

Да, видел Вашу панель. С помощью какой функции выгружаетесь?

при вызове .dll создаю 2 потока и в них запускаю через ShowDialog() каждую форму, убиваю формы банальным вызовом метода Close() и освобождаю память на всякий случай - фиг его знает как там в .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:

Да, видел Вашу панель. С помощью какой функции выгружаетесь?

Это панель Игоря. Я только опубликовал.