webForumDet fria alternativet

Förhindra att IE & FF avbryter javaskript

JavaScript

25 svar · 1 327 visningar · startad av coder

Medlem sedan mars 200741 inlägg
Frågan#1

Det finns en inbyggd begränsning på hur länge ett skript får köra i webbläsaren. Begränsningen verkar träda i kraft efter 5 miljoner körda satser (enl. microsofts hemsida). När detta inträffar får man upp en jobbig splash, typ:

"Du kör ett skript som tar lång tid - vill du avbryta detta skript?"

Finns det något sätt att komma runt detta? Jag vill inte få upp denna ruta. Jag vill att skriptet ska fortsätta köra färdigt.

Jag vet att det går att justera värdet för när denna splash dyker upp i windows registry men det är ju inte något man man kan kräva av användarna så den lösningen är utesluten.

Medlem sedan jan. 2005713 inlägg
#2

litet script du har isåfall.

en paus, timout, på några hundra delar kanske skulle lösa det.

Medlem sedan mars 200741 inlägg
#3

Ett schackprogram skrivet i javascript ...

Det finns inget enkelt sätt att "klyva" programmet eller designa om det till någon typ av händelsesystem.

Medlem sedan juni 20014 421 inlägg
#4

När inträffar timeouten? Är det så att du kör scriptet kontinuerligt eller triggar du scriptet på en flyttning av en pjäs?

Medlem sedan jan. 2005713 inlägg
#5

han hade ju ingen timeout.. tror jag

Medlem sedan aug. 20039 340 inlägg
#6

colione skrev:

När inträffar timeouten? Är det så att du kör scriptet kontinuerligt eller triggar du scriptet på en flyttning av en pjäs?

Jag tror problemet ligger i att AI-koden tar mer CPU-kraft än vad som är kutym att använda i javascript.
Mitt tips är som stattin säger är att köra algoritmen några rundor, för att sedan köra setTimeout. Om du t ex har en for-loop så låter du den gå ett tag, sedan anropar funktionen sig själv mha setTimeout, i stil med setTimeout(loopfunktionen, 50);
Då måste du så klart anpassa variablerna så att de kan kommas åt från den funktionen och inte skrivs över. (Dela upp funktionen i initiering, loop och terminering)

Medlem sedan mars 200741 inlägg
#7

Algoritmen som räknar ut datorns motdrag startar först när en pjäs flyttas. På denna nivå är alltså programmet händelsestyrt.

I 95% av kalkylerna så beräknas draget relativt omgående (några sekunder). Men för vissa drag behöver den ytterligare lite tid och då dyker denna trista ruta upp.

Det går ganska snabbt att komma upp i 5 miljoner satser. Det tar bara några sekunder.

Sökfunktionen som beräknar draget är ju en ganska komplicerad rekursiv djupet-först-algoritm så ... jag har inte riktigt kommit på hur jag skulle exprimentera med att göra en timeout mitt i alla beräkningar ...

Medlem sedan aug. 20039 340 inlägg
#8

Ligger det en beta-version av det faktiska spelet uppe någonstans? Jag skulle ju kunna kolla på algoritmen och se om jag kan hjälpa till. Skicka ett PM till mig med någon form av IM-adress om du har lust (MSN, ICQ, AIM, Gtalk eller YIM)

Medlem sedan jan. 2005713 inlägg
#9

Och säg till när det är klart, skulle vara kul att testa sen.

Medlem sedan mars 200741 inlägg
#10

OBS att även om det går att spela mot programmet så är det inte på något sätt färdigt.

http://www.javascriptchess.com/?visa=playchess

Men om ni kör ett tag så dyker antagligen den där omnämda splashen upp och då ska man alltså klicka fortsätt vilket är lite trist.

Medlem sedan jan. 2005713 inlägg
#11

Shackmatt utan kungar.. :bire

Jag tror nog det går slänga in en timeout någonstans så scriptet hinner andas lite och det borde inte vara allt för svårt heller men jag har lite svårt att sätta mig in i en sånt stort script, jag brukar knappt förstå mina egna ibland. Men jag är imponerad (y)

nitro?

Medlem sedan mars 200741 inlägg
#12

Det går att göra illegala drag och spela bortanför schackmatt. Det är medvetet för att kunna testa och hitta fel. Har båda kungar utplånats från bordet, vilket är fullt möjligt tack vare detta, så fungerar i sin tur inte vissa kontrollvariabler så då lär inte texten ovanför spelet längre visa något meningsfullt heller.

Att fixa detta är ju ganska oviktigt eftersom programmet senare bara kommer tillåta legala drag. Funktionen isChecked t.ex. behöver inte kunna hantera situationen när det inte finns någon kung eftersom det alltid finns en kung. Annars är spelet slut.

Medlem sedan aug. 20039 340 inlägg
#13

Hmm, buggigt värre. Ett par drag in i matchen så kyckas motorn på något sätt få för sig att min bonde är en svart dam på något sätt. (Hände när jag markerade hästen på g1) Sedan gjorde denna nya dam ett drag till, att ta tornet.
Kan tillägga att jag använder Opera, men jag ser inte hur det skulle kunna påverka.

jschessbug.GIF
Medlem sedan mars 200741 inlägg
#14

Jag postar på allmän begäran en länk till ett ofärdigt skript. Jag får flera inlägg med bildbevis på att programmet är ofärdigt ...

? He, He.

Jag ska iofs medge att jag inte riktigt begrep på vilket sätt det skulle underlätta förståelsen för problemet att posta en länk till ett ofärdigt program men jag ville vara tillmötesgående.

Jag har designat programmet top-down och då blir det alltid så här. Det är oftast ganska enkla buggar som sen får katastrofala konsekvenser. Det är helt normalt i avlusningsprocessen i sådana här projekt.

Om dessa problem återstår om ett halvår kan man ju ta det då. Just nu är jag mest nyfiken på den fråga jag ställde.

Medlem sedan aug. 20039 340 inlägg
#15

Förlåt, jag ville bara hjälpa till genom att rapportera en bugg.
Vad gäller frågan du ställde ska jag kolla på det.

Medlem sedan mars 200741 inlägg
#16

nitro2k01 skrev:

Förlåt, jag ville bara hjälpa till genom att rapportera en bugg.

Fast i detta fall var det ju inte ens en bugg. Bara gnäll. ;)

Du flyttar e4 - datorn svarar e5 (helt okej)
Du flyttar d3 - datorn svarar d5 (också helt okej)

Sen flyttar du din bonde från d3 till g1 !?

Vem har lärt dig att man får göra så?

Det går att göra helknäppa drag (som jag skrev tidigare) men då är det inte säkert programmet kan hantera det eftersom vissa delar är en s.k. tillståndsmaskin som i vissa avseenden förutsätter en ordnad följd av legala drag.

Låt oss släppa snacket om själva programmet nu !

Medlem sedan aug. 20039 340 inlägg
#17

coder skrev:

Sen flyttar du din bonde från d3 till g1 !?

Vem har lärt dig att man får göra så?

Det var ett misstag... Jag upplevde att jag markerade hästen. Men då faller alla pusselbitar på plats ang. vad som hände.

Nör jag kollar på koden får jag två intryck:

  1. Koden är en konvertering av C-kod, alt. skrivet av en person med C som första språk. (Pga av kodens utseende, ofta ett ganska kompakt skrivsätt och korta variabelnamn)
  2. All kod är inte skriven av samma person. (Pga olika indentering på olika ställen)

Jag tycker att koden är relativt svår att följa, så jag kommer nog inte att kunna ge dig en praktiskt lösning, åtminstone inte ikväll/natt. En principiell lösning har du redan fått i mitt första inlägg i den här tråden.

Medlem sedan mars 200741 inlägg
#18

nitro2k01 skrev:

  1. Koden är en konvertering av C-kod, alt. skrivet av en person med C som första språk.

Det är väl traditionell C som präglat mig mest, svar ja. När jag skriver C -program så känns det som att skriva en bok.

nitro2k01 skrev:

All kod är inte skriven av samma person. (Pga olika indentering på olika ställen)

Här spekulerar vi. Vilka delar menar du inte är skrivna av mig?

Koden är skriven i anteckningar och wordpad. Det är fullt möjligt att den ena inte indenterar på samma sätt som den andra. Det har jag inte riktigt tänkt på.

Medlem sedan juni 20014 421 inlägg
#19

nitro2k01 skrev:

Jag tror problemet ligger i att AI-koden tar mer CPU-kraft än vad som är kutym att använda i javascript.

Det tror jag också, jag ville bara täcka alla mina basar. ;)

Angående ditt problem coder så ska jag försöka gräva mig djupare in i koden och se om jag kan bidra med något.

Medlem sedan mars 200741 inlägg
#20

Fast jag tror inte du eller någon annan hittar lösningen i min kod. Problemet är inte av algoritmisk natur. Det är inte minskad beräkningskomplexitet jag är ute efter. I det avseendet ligger nog mitt program ganska bra till.

Frågan är generell.

Om man tar t.ex. den här loopen.

y=dummy=1;
for(x=0;x<5000000;x++)
{
y=y+dummy;
}
alert(y);

Kan man få denna loop att köra utan att webbläsaren vill avbryta så kanske man kan ta resonemangen därifrån. Eventuellt är problemet isåfall löst.

269 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
143 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)