| 

.NET C# Java Javascript Exception

Threads stoppen?

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


Threads stoppen?

mabu - 29.09.2010 09:17
Moin moin allerseits,

derzeit beschäftige ich mich mit Multithreading (naja fast) und bin dabei auf ein Problem gestoßen.
Der Anwendungsfall:
Ich habe eine kleine grafische Anwendung geschrieben, die einen Fortschrittsbalken enthält. Sobald
der "start"-Button gedrückt wird, legt die Anwendung los. Das erste Problem war, dass der Fortschrittsbalken
sich nicht aktualisiert hat (immer nur ganz am Ende), daher habe ich den Button angepasst. Jetzt wird mit
dem Button ein separater Thread gestartet. Dadurch kann sich die GUI aktualisieren und alles ist gut.... beinahe.

Mitunter kann der Prozess, der angestoßen wird sehr lange dauern (Berechnungen etc.), was einen "cancel"-Button rechtfertigt.

Das Problem:
Ich versuche mit dem Cancel-Button den laufenden Prozess zu unterbrechen/anzuhalten/was-auch-immer, aber
der läßt sich nicht beirren. stop/interrupt/suspend ... alles wird ignoriert.
Woran kann das liegen? Hat jmd. eine Alternative/Lösungsvorschlag?

Als Beispiel kann folgendes Programm dienen
Language: Groovy
import groovy.swing.SwingBuilder def T = new Thread() def swing = new SwingBuilder() def button = swing.button("start") def cancel = swing.button("cancel") def frame = swing.frame(title:"test"){ hbox{ widget(button) widget(cancel) } } def startFunktion = { 20.times{ println it; sleep(1000);} } button.actionPerformed = { println "start button pressed" T.start{ startFunktion() } } cancel.actionPerformed ={ println "cancel button pressed" T.interrupt() // geht ebenso wenig wie die anderen Funktionen } frame.pack() frame.show()

Viele Grüße


Threads stoppen?

mabu - 29.09.2010 09:17
Moin moin allerseits, <_42_52_ /> <_42_52_ /> derzeit beschäftige ich mich mit Multithreading (naja fast) und bin dabei auf ein Problem gestoßen. <_42_52_ /> Der Anwendungsfall: <_42_52_ /> Ich habe eine kleine grafische Anwendung geschrieben, die einen Fortschrittsbalken enthält. Sobald <_42_52_ /> der "start"-Button gedrückt wird, legt die Anwendung los. Das erste Problem war, dass der Fortschrittsbalken <_42_52_ /> sich nicht aktualisiert hat (immer nur ganz am Ende), daher habe ich den Button angepasst. Jetzt wird mit <_42_52_ /> dem Button ein separater Thread gestartet. Dadurch kann sich die GUI aktualisieren und alles ist gut.... beinahe. <_42_52_ /> <_42_52_ /> Mitunter kann der Prozess, der angestoßen wird sehr lange dauern (Berechnungen etc.), was einen "cancel"-Button rechtfertigt. <_42_52_ /> <_42_52_ /> Das Problem: <_42_52_ /> Ich versuche mit dem Cancel-Button den laufenden Prozess zu unterbrechen/anzuhalten/was-auch-immer, aber <_42_52_ /> der läßt sich nicht beirren. stop/interrupt/suspend ... alles wird ignoriert. <_42_52_ /> Woran kann das liegen? Hat jmd. eine Alternative/Lösungsvorschlag? <_42_52_ /> <_42_52_ /> Als Beispiel kann folgendes Programm dienen <_42_52_ /> <_50_52_45_ CLASS="groovy bbcode_geshi"><_44_49_56_ CLASS="head">Language: Groovy<_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20import"><_53_50_41_4e_ CLASS="kw2">import <_53_50_41_4e_ CLASS="co2">groovy.swing.SwingBuilder <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><_53_50_41_4e_ CLASS="kw2">def T <_53_50_41_4e_ CLASS="sy0">= <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><_53_50_41_4e_ CLASS="kw2">new <_41_ HREF="http://www.google.de/search?as_q=Thread&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1%2E5%2E0%2Fdocs%2Fapi%2F"><_53_50_41_4e_ CLASS="kw3">Thread<_53_50_41_4e_ CLASS="br0">(<_53_50_41_4e_ CLASS="br0">) <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><_53_50_41_4e_ CLASS="kw2">def swing <_53_50_41_4e_ CLASS="sy0">= <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><_53_50_41_4e_ CLASS="kw2">new SwingBuilder<_53_50_41_4e_ CLASS="br0">(<_53_50_41_4e_ CLASS="br0">) <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><_53_50_41_4e_ CLASS="kw2">def button <_53_50_41_4e_ CLASS="sy0">= swing.<_53_50_41_4e_ CLASS="me1">button<_53_50_41_4e_ CLASS="br0">(<_53_50_41_4e_ CLASS="st0">"start"<_53_50_41_4e_ CLASS="br0">) <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><_53_50_41_4e_ CLASS="kw2">def cancel <_53_50_41_4e_ CLASS="sy0">= swing.<_53_50_41_4e_ CLASS="me1">button<_53_50_41_4e_ CLASS="br0">(<_53_50_41_4e_ CLASS="st0">"cancel"<_53_50_41_4e_ CLASS="br0">) <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><_53_50_41_4e_ CLASS="kw2">def frame <_53_50_41_4e_ CLASS="sy0">= swing.<_53_50_41_4e_ CLASS="me1">frame<_53_50_41_4e_ CLASS="br0">(title:<_53_50_41_4e_ CLASS="st0">"test"<_53_50_41_4e_ CLASS="br0">)<_53_50_41_4e_ CLASS="br0">{ hbox<_53_50_41_4e_ CLASS="br0">{ widget<_53_50_41_4e_ CLASS="br0">(button<_53_50_41_4e_ CLASS="br0">) widget<_53_50_41_4e_ CLASS="br0">(cancel<_53_50_41_4e_ CLASS="br0">) <_53_50_41_4e_ CLASS="br0">} <_53_50_41_4e_ CLASS="br0">} <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><_53_50_41_4e_ CLASS="kw2">def startFunktion <_53_50_41_4e_ CLASS="sy0">= <_53_50_41_4e_ CLASS="br0">{ <_53_50_41_4e_ CLASS="nu0">20.<_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20times"><_53_50_41_4e_ CLASS="kw8">times<_53_50_41_4e_ CLASS="br0">{ <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20println"><_53_50_41_4e_ CLASS="kw8">println it<_53_50_41_4e_ CLASS="sy0">; sleep<_53_50_41_4e_ CLASS="br0">(<_53_50_41_4e_ CLASS="nu0">1000<_53_50_41_4e_ CLASS="br0">)<_53_50_41_4e_ CLASS="sy0">;<_53_50_41_4e_ CLASS="br0">} <_53_50_41_4e_ CLASS="br0">} button.<_53_50_41_4e_ CLASS="me1">actionPerformed <_53_50_41_4e_ CLASS="sy0">= <_53_50_41_4e_ CLASS="br0">{ <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20println"><_53_50_41_4e_ CLASS="kw8">println <_53_50_41_4e_ CLASS="st0">"start button pressed" T.<_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20start"><_53_50_41_4e_ CLASS="kw8">start<_53_50_41_4e_ CLASS="br0">{ startFunktion<_53_50_41_4e_ CLASS="br0">(<_53_50_41_4e_ CLASS="br0">) <_53_50_41_4e_ CLASS="br0">} <_53_50_41_4e_ CLASS="br0">} cancel.<_53_50_41_4e_ CLASS="me1">actionPerformed <_53_50_41_4e_ CLASS="sy0">=<_53_50_41_4e_ CLASS="br0">{ <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20println"><_53_50_41_4e_ CLASS="kw8">println <_53_50_41_4e_ CLASS="st0">"cancel button pressed" T.<_53_50_41_4e_ CLASS="me1">interrupt<_53_50_41_4e_ CLASS="br0">(<_53_50_41_4e_ CLASS="br0">) <_53_50_41_4e_ CLASS="co1">// geht ebenso wenig wie die anderen Funktionen <_53_50_41_4e_ CLASS="br0">} frame.<span class="me1">pack<_53_50_41_4e_ CLASS="br0">(<_53_50_41_4e_ CLASS="br0">) frame.<_53_50_41_4e_ CLASS="me1">show<_53_50_41_4e_ CLASS="br0">(<_53_50_41_4e_ CLASS="br0">) <_42_52_ /> Viele Grüße<_42_52_ /> <_42_52_ /> <_42_52_ /> <_42_52_ /> 1 mal bearbeitet. Zuletzt am 29.09.2010 09:23 von mabu.


Re: Threads stoppen?

saurier - 29.09.2010 13:06
Hier ist einfach mal eine Möglichkeit - ohne weiteren Kommentar:

import groovy.swing.SwingBuilder
def T = new Thread()
def swing = new SwingBuilder()
def button = swing.button("start")
def cancel = swing.button("cancel")
def frame = swing.frame(title:"test"){
    hbox{
     widget(button)
     widget(cancel)
   }
}
def running = false
def machdas = {
    20.times {
        if (running) {
            println(it)
            sleep(1000)
        }
    }
}

def startFunktion = { 
    20.times{ println it; sleep(1000);}
 }
button.actionPerformed = {
    println "start button pressed"
    //T.start{ startFunktion() }
    running = true
    Thread.start(machdas)
}
cancel.actionPerformed ={
    println "cancel button pressed"
    //T.interrupt() // geht ebenso wenig wie die anderen Funktionen
    running = false
}
frame.pack()
frame.show()

Gruß,
Christian


Re: Threads stoppen?

mabu - 29.09.2010 15:14
Hallo!
Danke für den Ansatz. Das wird wahrscheinlich die Aufgabenstellung erfüllen, aber ein wenig getrickst
ist das ja schon. Der Thread wird zwar nicht gestoppt, aber zum "Nichts-tun" gezwungen, bis die
Schleife fertig ist. Dann schließt sich der Thread ja von selbst.
Gibt es keine Möglichkeit den Thread tatsächlich anzuhalten?
Grüße


Re: Threads stoppen?

saurier - 29.09.2010 17:09
Natürlich ist das nicht ganz sauber, aber ich wollte auch nur die Idee klar machen. Selbst wenn es ginge, sollte
man einen Thread nicht von außen anhalten, sondern dem Thread ein Signal geben, dass er jetzt aufhören soll.
So beginnt oft der Einstieg in die nichtsequenzielle Programmierung - kein ganz triviales Thema :-)

Gruß,
Christian


Re: Threads stoppen?

Wicki - 29.09.2010 18:24
Hallo,

hier eine Variante, die den Thread und wahlweise das Skript tatsächlich beendet. Der Thread wird durch eine künstlich ausgelöste RuntimeException beendet
import groovy.swing.SwingBuilder
def T = new Thread()
interrupt=0
def swing = new SwingBuilder()
def button = swing.button("start")
def cancel = swing.button("cancel")
def frame = swing.frame(title:"test"){
    hbox{
     widget(button)
     widget(cancel)
   }
}
def startFunktion () {
  try {
    20.times{
      println it+","+interrupt
      if (interrupt > 0)
        throw new RuntimeException()
      sleep(1000);}
  } catch (RuntimeException re) {/*System.exit(1)*/}  //evtl. Skript beenden
 }
button.actionPerformed = {
    println "start button pressed"
    T.start this.&startFunktion  //Funktion zur Closure machen
}
cancel.actionPerformed ={
    println "cancel button pressed"
    interrupt=1
//    T.interruptrupt() // geht ebenso wenig wie die anderen Funktionen
}
frame.pack()
frame.show()

Gruß Wicki


Re: Threads stoppen?

mabu - 30.09.2010 12:48
Super,
danke für die Antworten! Jetzt hab ich ja ein bissl Auswahl. Mal sehen, was am Besten passt
Grüße


Re: Threads stoppen?

badbadverybad - 17.10.2010 15:28
mabu schrieb:
-------------------------------------------------------
> Der Thread wird zwar nicht
> gestoppt, aber zum "Nichts-tun" gezwungen, bis die
> Schleife fertig ist. Dann schließt sich der Thread
> ja von selbst.
> Gibt es keine Möglichkeit den Thread tatsächlich
> anzuhalten?

Na, die Schleife unterbrechen.
In einer for-Schleife würde man das mit return machen, aber in den each(Closure)-, times(Closure)- usw.-Methoden wirkt return wie continue in einer for-Schleife.

Also:
def startFunktion = { 
    for (i in 1..20) {
        if (threadCanceled) return
        println i
        sleep(1000)
    }
}


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "Threads stoppen?" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.