Gå til innhold

Problemer med doInBackground() i SwingWorker


Anbefalte innlegg

Hei, har støtt på et problem jeg ikke helt skjønner.

 

Jeg holder på å løse sudoku via brute-force, som skjer i klassen Square (hver rute har en neste-peker).

Når en løsning lagres, så lagrer brettet det i en SudokuContainer (brett har et to-dimensjonalt array av ruter, og en peker til beholderen).

Den metoden blir kalt i klassen rute.

 

Slik ser metoden ut i Square:

 

 

public void fillInnRemainingOfBoard() {
 if (this instanceof PrefilledSquare) {
  if (next == null)
board.saveSolution();
  else
next.fillInnRemainingOfBoard();
 }

 else {
  for (int value = 1; value <= board.getLength(); value++) {
if (legalValue(value)) {
 this.value = value;
 if (next == null)
  board.saveSolution();
 else
  next.fillInnRemainingOfBoard();
}
  }
  this.value = 0;
 }
}

 

 

 

Slik lagres løsningen:

 

 

 public void saveSolution() {
 solutions.insert(squares);
 sc.updateSolutions();
}

 

 

 

Slik blir det lagret i SudokuContainer:

 

public boolean insert(Square[][] solution) {
 String[][] temp = new String[solution.length][solution[0].length];
 for (int i = 0; i < temp.length; i++) {
  for (int j = 0; j < temp[i].length; j++) {
temp[i][j] = solution[i][j].getStringValue();
  }
 }
 return solutions.add(temp);
}

 

 

Selve metoden som begynner, ser slik ut:

 

 

 public void solveBoard() {
 squares[0][0].fillInnRemainingOfBoard();
}

 

 

 

Metoden over blir kalt i doInBackground() i SwingWorker, som ser slik ut:

 

 

@Override
protected Void doInBackground() {
 System.out.println("began");
 mf.updateStatus("Working...");
 board.solveBoard();
 return null;
}

@Override
public void done() {
 System.out.println("finished");
 mf.doneSolving();
 board.getSolutions().print();
}

 

 

 

Ideén er at SwingWorker skal starte en ny thread med løsningen, så skal GUI vises, så skal løsninger oppdateres på GUI imens de blir funnet, og til slutt blir done() i SwingWorker kalt som oppdaterer status på GUI til ferdig.

Det funker på store brett som tar tid.

 

Problemet er at om sudokuen er veldig liten/går fort å løse, så ser det ikke ut som at alle løsningene blir lagret.

F.eks. en 6x6 som skal ha 28 løsninger, skifter mellom 1 og 28 løsninger hver gang.

Og f.eks. en tom 4x4 som skal ha 288 løsninger, for én løsning.

 

Om jeg gjør noe som tar litt tid i fillInnRemainingOfBoard() i Square (regner ut noe, skriver ut noe via System.out.println() eller lignende), så klarer den å regne det ut.

 

Slik jeg ser det, så klarer den å regne ut alt, men løsningene får ikke tid til å bli lagret i beholderen.

Så vidt jeg vet, så skjer alt det på samme tråden (worker thread), så selve utførelsen av utregningen skulle skje sekvensielt, så alt skulle bli lagret.

Men det skjer altså ikke.

 

Noen som ser noen feil eller har forslag til løsning?

 

Takk :)

Endret av Fred7555
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...