Fred7555 Skrevet 9. april 2013 Del Skrevet 9. april 2013 (endret) 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 9. april 2013 av Fred7555 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå