Diskussion zum Artikel "Die Entwicklung von grafischen Oberflächen auf Basis von .Net Framework und C# (Teil 2): Weitere grafische Elemente" - Seite 2

 
fxsaber:

Es wurde ein sehr schwerwiegender Fehler bei der Arbeit mit C#-Fenstern entdeckt. Wenn Sie C#-Fenster kontinuierlich bewegen, verschwindet Terminal vom Bildschirm nach ein paar Sekunden, und die CPU-Kernlast von terminal64.exe übersteigt 100%. Ich habe 8 Kerne, so dass die volle Kernlast im TaskManager bei CPU 12-13% beträgt. Wenn sich das C#-Fenster bewegt, sind es 19%.

Oh, das ist cool. Ich habe es ausprobiert - es verschwindet wirklich. Oder besser gesagt, es verschwindet nicht, sondern minimiert sich in die Taskleiste, als ob Sie die Schaltfläche "Minimieren" gedrückt hätten.

Was das 100%ige Laden angeht - ich sehe es nicht. Vielleicht liegt es daran, dass Sie es eingebaut haben und ich nicht.

 
fxsaber:

Das manuelle Entfernen von GuiControllerElementsDemo über das Terminal-Menü führt zum Einfrieren für ein paar Sekunden.

So etwas gibt es. Es passiert nur, wenn das Formular nicht vorher manuell geschlossen wird. Ich weiß noch nicht, wie ich das Problem umgehen kann. Ich habe versucht, das Formular in Deinit() auf verschiedene Arten zu schließen, aber keine davon hat funktioniert. Wenn jemand weiß, wie man es macht, wäre ich dankbar.

 
Vasiliy Sokolov:

Das ist es. Es passiert nur, wenn Sie das Formular nicht vorher manuell schließen. Ich weiß noch nicht, wie man es umgehen kann. Ich habe mehrere Möglichkeiten ausprobiert, das Formular in Deinit() zu löschen, aber keine davon hat funktioniert. Wenn jemand weiß, wie man es macht, wäre ich dankbar.

warum der Standard-Handler private void Form2_FormClosing(object sender, FormClosingEventArgs e)

nicht funktionieren will?

als ich mit dll und C# experimentierte, stürzte aus irgendeinem Grund alles beim Beenden ab, weil ich die erstellten Komponenten außerhalb des Formulars nicht zerstörte, so war es:

public partial class Form2 : Form

    {

        static RichTextBox CopyToClipboard;

.....

private void Form2_FormClosing(object sender, FormClosingEventArgs e)

        {

 CopyToClipboard.Clear();

 CopyToClipboard = null;

wenn ich nicht vor dem Schließen des Formulars von MQL zerstören - es verlangsamt schrecklich oder abgestürzt.

 
Vasiliy Sokolov:

Oh, cool. Ich habe es ausprobiert und es verschwindet tatsächlich. Oder besser gesagt, es verschwindet nicht, sondern wird in die Taskleiste minimiert, als ob die Schaltfläche "Minimieren" gedrückt wurde.

Ich habe versucht, das Terminalfenster selbst zu verschieben (C# läuft nicht). Innerhalb von etwa 10 Sekunden wurden alle Fenster (ME, Browser usw.) minimiert, so dass der Desktop leer war.

Wie für 100% Laden - ich sehe es nicht. Vielleicht liegt es wirklich daran, dass Sie es eingebaut haben und ich nicht.


Gleichzeitig habe ich die Ausführung des Expert Advisors überwacht. Hier ist das Ergebnis

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

Sie können deutlich sehen, dass der Expert Advisor seine Arbeit eingestellt hat, während sich das Terminal-Fenster bewegt hat.

 
fxsaber:

Gleichzeitig habe ich die Ausführung des Expert Advisors überwacht. Hier ist das Ergebnis

Sie können deutlich sehen, dass der Expert Advisor seine Arbeit eingestellt hat, während sich das Terminal-Fenster bewegt hat.

Ich habe eine Überprüfung durch den Timer gemacht - ich sehe keine Hänger. Er sendet alles sehr schnell an das Protokoll.

 
Igor Makanu:

und warum der Standard-Handler private void Form2_FormClosing(object sender, FormClosingEventArgs e)

nicht funktionieren will?

als ich mit dll und C# experimentierte, stürzte aus irgendeinem Grund alles beim Beenden ab, weil ich die erstellten Komponenten außerhalb des Formulars selbst nicht zerstörte, so war es:

Wenn ich nicht vor dem Schließen des Formulars von MQL zerstören, es verlangsamt schrecklich oder abgestürzt.

Ich habe versucht, durch die standard form.Dispose() zu tun. Das heißt, wenn GuiController::HideForm() aufgerufen wird, wird Dispose des entsprechenden Formulars aufgerufen. In der Testanwendung in C# funktionierte alles gut. Aber in MT funktioniert es nicht. Aber wenn wir das Formular manuell schließen, bevor wir den Expert Advisor löschen, funktioniert alles einwandfrei.

 
Vasiliy Sokolov:

Ich habe versucht, es über die Standardform.Dispose() zu tun. Das heißt, wenn GuiController::HideForm() aufgerufen wird, wird das Dispose des entsprechenden Formulars aufgerufen. In der Testanwendung in C# hat alles gut funktioniert. Aber in MT funktioniert es nicht. Aber wenn wir das Formular manuell schließen, bevor wir den Expert Advisor löschen, funktioniert alles einwandfrei.

Hier wird er sofort entladen.

 
fxsaber:

Es entlädt sichhier sofort.

Ja, ich habe Ihr Panel gesehen. Welche Funktion verwenden Sie zum Entladen?

 
Vasiliy Sokolov:

Ich habe versucht, es über die Standardform.Dispose() zu tun. Das heißt, wenn GuiController::HideForm() aufgerufen wird, wird das Dispose des entsprechenden Formulars aufgerufen. In der Testanwendung in C# hat alles gut funktioniert. Aber in MT funktioniert es nicht. Aber wenn wir das Formular manuell schließen, bevor wir den Expert Advisor löschen, funktioniert alles einwandfrei.

Sie sollten auf jeden Fall googeln, es gibt einen Prozess, der hier herumhängt.

Alternativ dazu müssen Sie noch Form.Close() für Windows aufrufen, um die Anwendung zu schließen.

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

Wenn man Close nicht aufruft, umgeht man wahrscheinlich das Senden einer Reihe von Win32-Nachrichten, von denen man annehmen könnte, dass sie irgendwie wichtig sind, obwohl ich nicht genau sagen könnte, warum...

Close hat den Vorteil, dass es Ereignisse auslöst (die abgebrochen werden können), so dass ein Außenstehender (des Formulars) auf FormClosing und FormClosed achten könnte, um entsprechend zu reagieren.

Mir ist nicht klar, ob FormClosing und/oder FormClosed ausgelöst werden, wenn Sie das Formular einfach entsorgen, aber ich überlasse es Ihnen, damit zu experimentieren.


Vasiliy Sokolov:

Ja, ich habe Ihr Panel gesehen. Welche Funktion verwenden Sie zum Entladen?

Wenn ich die .dll aufrufe, erstelle ich 2 Threads und führe jedes Formular in ihnen über ShowDialog() aus, beende die Formulare durch einen trivialen Aufruf der Close()-Methode und gebe vorsichtshalber Speicher frei - ich weiß nicht, wie der Müllsammler in .Net funktioniert )))))
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:

Ja, ich habe Ihr Panel gesehen. Welche Funktion verwenden Sie zum Entladen?

Das ist das Panel von Igor. Ich habe es gerade veröffentlicht.