Action mehrmals klicken

schuetzejanett

Erfahrenes Mitglied
Hallo,

habe in meiner Eclipse RCP mehrere ActnKlassen (erben von Jface.Action) .

In dieser gibt es immer eine run() methode, welche ausgeführt ird, wenn der Nutzer einen Button klickt.
Was mich interessiert ist, was passiert, wenn der Nutzer mehrmals hinter einander den Button klickt. Und die Aufgae aer noch ar nicht aggearbeietet ist? Werden die späteren Klicks ignoriert, werden sie danach ausgeführt oder werden sie parallel ausgeführt. Mir wäre es ja am liebsten, wenn alle weiteren Aktionen danach ausgeführt werden. Aber der Nutzer soll nicht das gefühl haben, das die GUI hängt?

Funktioniert das automatisch so oder wie ist das?
 
Hallo,

das kommt ganz drauf an wie du deine Action und das Aufrufen der dahinterliegenden Funktion implementiert hast... wenn du zur Ausführung der Aufgabe einen neuen Thread (Job) startest, kann es schon sein, dass bei nochmaligem klicken auf die Action diese ein zweites mal ausgeführt wird. Es sei denn du hast hier entsprechende Sperren / locks gesetzt die das verhindern. Führst du die Anwendungslogik jedoch im UI Thread aus so blockiert die UI ... dann kann auch keiner mehr auf die Action klicken wenn die schon läuft.

Ich würde dir empfehlen langlaufende Aktionen in einem Job auszuführen und dann entsprechendene Sperren zu setzen bis der Job erledigt ist. Während die Sperre gesetzt ist, kann der Menu Punkt beispielsweise ausgegraut sein, oder es kommt beim draufklicken eine entsprechende Meldung.

Gruß Tom
 
Hallo,

also ich starte es in einem Job, aber was meinst du mit Sperren gesetzt. Wie Setze ich diese?
Die betreffende Aktion wird einmal per doppelklick auf eine tabellenzeile und einmal über die menuleiste ausgewählt. Das heißt ich habe mehrere Instanzen der actionklasse. denn fürs menu erstelle ich einer im ActionbarAdvisor und dann noch eine in der viewklasse, beim doppelklickevent auf die zeile Kann ich trotzdem durch logging/sperren verhindern das die Aktion mehrfach ausgeführt wird?
 
Hallo, danke für ddie schnelle Antwort aber wie sieht jetzt die canPerform Methode aus?
Also wie frage ich ab, ob es eine Instanz dieser Klasse gibt, welche gerade diesen Job ausführt?
 
Hallo,

du könntest einfach schauen, ob der Job schon läuft...:
Java:
        if (Job.getJobManager().find("simpleJob-family").length == 0) {
            new SimpleJob("Calculating PI...").schedule();
        } else {
            System.out.println("Simple job is already running");
        }

Gruß Tom
 
hallo, sorry hatte in den letzten Tagen ein bischen Stress und komme erst jetzt wieder dazu mich damit zu beschäftigen.

Ich habe zu deinem Code noch eine frage,
Wie ordne ich einen JJob einer Familie zu. mit belongsTo() teste ich ja bloß ob er zu der Familie gehört, aber wie ordne ich ihn zu einer familie dazu.

Und dann noch was anderes , gibts bei Jobs eine warteschlange, also das ich sage, stell dich an und wenn der job abgearbeitet ist, wird der nächste abgearbeitet. oder so?
 
Hallo,

Ok habe nun gelesen, das man es die Methode join(), gibt welcher man Jobfamilie und progressmonitor gibt und welcher den Job ausführt nachdem alle anderen Jobs der jobfamilie ausgeführt sind.
Also eigentlich genau das was ich will. Nur leider funktioniert es nicht. Also der Job wird nie augeführt.

Hier ist mein Code sieht jemand den fehler?

Code:
@Override
	public void run()
	{
		try
		{
			Job JobPrint = new Job("Drucken")
			{
				@Override
				public boolean belongsTo(Object family)
				{
					System.out.println("abgefragt");
					return family.equals("blockJob");
				}

				@Override
				protected IStatus run(IProgressMonitor monitor)
				{
					//tue etwas
					return Status.OK_STATUS;
				}
			};
			//JobPrint.getJobManager().join("blockJob", null);   //geht auch nicht
			Job.getJobManager().join("blockJob", null);
		} catch (OperationCanceledException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Was fehlt oder warum gehts nicht?
 
Zurück