kostenloser Webspace werbefrei: lima-city


c# -> move form while process is running

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    tft-development

    Kostenloser Webspace von tft-development

    tft-development hat kostenlosen Webspace.

    hi,
    in meinem C# Forms Application Programm
    lasse ich mit Hilfe eines buttons einen Prozess aufrufen, welcher mehrere Minuten dauern kann...
    währenddessen wird die Form unbewegbar/verschiebbar... (sie wird nicht disabled, das hab ich schon probiert)

    Wie kann ich meine Form bewegen/bewegbar machen während der Prozess läuft?

    zu diesem Thema habe ich nur das gefunden:

    private void Form1_Load(object sender, EventArgs e)
    {
    // With ThreadPool
    ThreadPool.QueueUserWorkItem(SubmitButton_Click);
    }

    (funktioniert nicht)

    im msdn dazu (http://msdn.microsoft.com/de-de/library/kbf0f1ct%28v=vs.110%29.aspx)
    kann ich nicht viel darüber erfahren
    (ich finde, msdn ist immer sehr knapp und unerklärend gehalten)

    Du weißt wie es geht oder hast eine bessere Lösung? Dann her damit ;)

    grüße
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    Der Prozess arbeitet vermutlich in einer Schleife, und ackert dort auf der CPU (dem Kern zumindest) mit 100% Auslastung, sodass die Abarbeitung anderer Messages im Prozess verhindert wird. Ich denke, dass das in C# die Methode DoEvents erledigen sollte, wenn du deren Aufruf in die Schleife aufnimmst. Dann sollte das Fenster auch verschiebbar sein, wenn z.B. die Redraw-Message etc. abgearbeitet werden:
    http://msdn.microsoft.com/de-de/library/system.windows.forms.application.doevents.aspx
  4. Hallo
    versuchs mal mit Threading

    private void button1_Click(object sender, EventArgs e)
            {
                button1.Enabled = false;
                Thread t = new Thread(DoWork);
                t.Start();
    
            }
    
            private void DoWork()
            {
                // do it...
    
                Thread.Sleep(2500); // Beispiel
    
                EndWork();
            }
    
            private void EndWork()
            {
                button1.Invoke(new Action(() => button1.Enabled = true));
            }


    Nachdem der Benutzer den Button geklickt hat, wird er deaktiviert, damit der User nicht auf die Idee kommt noch mal zu klicken, danach wird der Thread begonnen.
    In der Funktion EndWork muss man den Button wieder aktivieren.

    All dies hätte man auch in dem Klick-Event per Delegate machen können, aber so ist es erst mal einfacher zu verstehen.

    EDIT:
    Hier noch mal eben das oben genannte Beispiel im Klick-Event:
    private void button1_Click(object sender, EventArgs e)
            {
                button1.Enabled = false;
    
                Thread t = new Thread(delegate()
                {
                    Thread.Sleep(2500); // Beispiel
    
                    button1.Invoke(new Action(() => button1.Enabled = true));
    
                });
    
                t.Start();
    
            }




    Gruß
    Trancedrome

    Beitrag zuletzt geändert: 26.11.2013 14:20:52 von trancedrome
  5. Autor dieses Themas

    tft-development

    Kostenloser Webspace von tft-development

    tft-development hat kostenlosen Webspace.

    Innerhalb des Threads kann ich nicht auf meine Textboxen usw. zugreifen

    (Codeschnipsel)
    private void SubmitButton_Click(object sender, EventArgs e)
            {
                if (CheckBox1.Checked == true)
                {
    
                    Thread t = new Thread(delegate()
                    {
                        SubmitButton.Enabled = false;
    
                        /*Ausgabe*/ProgrammHistory.Text += "Programm gestartet\r\n";
    ...


    Gibt es da eine Möglichkeit sie einzubinden oder ähnliches?
    Oder muss ich alles was damit zu tun hat um den Thread herum bauen?
  6. Hallo,

    in jedem fall, wenn man aus einem Thread auf den Hauptthread und dessen Controlls, wie die Textbox, zugreifen will, muss man ein Invoke machen! Das Beispiel dafür ist hier bereits vorhanden ;-)

    Sonst musst du einmal ein bisschen mehr Code posten, damit man es einmal selber debuggen kann ;-)

    Gruß
    Trancedrome
  7. Autor dieses Themas

    tft-development

    Kostenloser Webspace von tft-development

    tft-development hat kostenlosen Webspace.

    public void AppendTextBox(string value)
            {
                if (InvokeRequired)
                {
                    this.Invoke(new Action<string>(AppendTextBox), new object[] { value });
                    return;
                }
                textBox3.Text += value;
            }
    //_________________________________________________________________________________________________
            private void SubmitButton_Click(object sender, EventArgs e)
            {
    
                SubmitButton.Enabled = false;
                Thread t = new Thread(delegate()
                {
                    if (CheckBox1.Checked == true)
                    {
    
                        /*Ausgabe*/AppendTextBox("Programm gestartet\r\n");
    
                        ...
    
                        /*Ausgabe*/AppendTextBox("\r\nProgramm erfolgreich beendet\r\n");
                    }
                    SubmitButton.Invoke(new Action(() => SubmitButton.Enabled = true));
    
                });
    
                t.Start();
                
            }


    Ich hab eine Weile gebraucht, aber habe es dann doch hin bekommen, ich kann im Thread auf meine Elemente zugreifen(Textboxen usw.) kann sie aber nicht bearbeiten/verändern,
    da ich nur meine Programmausgabe nicht innerhalb einer Klasse sondern direkt in der "Main" bearbeite, hab ich eine funktion gemacht, mit der ich die Textbox von außerhalb des Threads bearbeiten kann.

    @trancedrome: Danke, dein Codeschnipsel hat mir sehr geholfen :)
  8. Würde versuchen es im Async Modi zu starten, wenn der nicht vorhanden ist, habe ich keine Ahnung!
  9. Bedenke, dass Threading immer ein ziemlich heikles Thema ist.
    Die Thread Klasse ist meistens, grad unter Windows Forms etwas umständlich und ich nutze sie für solche Hintergrundarbeiten eher selten.

    Du kannst auch den System.ComponentModel.BackgroundWorker nehmen, der ist für viele Sache wesentlich angenehmer in der Handhabung.
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!