c# -> move form while process is running
lima-city → Forum → Programmiersprachen → Programmieren mit .NET & Mono
ausgabe
bearbeiten
beispiel
button
code
form
funktion
http
nutz
programm
schleife
sender
start
string
system
text
url
weile
windows
zugreifen
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
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 -
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? -
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 -
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 :) -
Würde versuchen es im Async Modi zu starten, wenn der nicht vorhanden ist, habe ich keine Ahnung!
-
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. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage