Na een x-aantal keer een applescript programma-tje te hebben gebruikt (code aanpassen en een 'Voer uit' doen) hangt de editor.
Alleen met een force-quit kan ik de boel afbreken.
Wie iemand wat er aan de hand kan zijn?
Bedoel je dat het script niet meer ophoudt of bedoel je dat Script Editor crashet? Kun je het script hier posten?
Mark
Bert
@bert:Ja er zit een loop in (repeat n times)
Het gekke is dat indien ik het applescript programma na een force quit opnieuw executeer (mbv de scripteditor) er geen problemen zijn.
Het probeer-sel-tje gaat over file io. Er wordt ' iets' naar een file gescreven en daarna weer gelezen en gedeeltelijk verwerkt. Als je het script gaat copieeren let dan even op dat het schrijven al fout zal gaan om dat de directory (hoogstwaarschijnlijk) niet klopt op de machine!
Mocht iemand de fout in het script vinden wat het ' hangen van de scripteditor' gaat verklaren dan.....
on processLine(str) set skateRecord to {nameSkater:"", fivehunderdmTime:"", fifthtenhunderdmTime:"", fivethousendmTime:"", tenthousendmTime:"", points:integer} set nameProcessing to true set m500timeProcessing to false set m1500timeProcessing to false set m5000timeProcessing to false set m10000timeProcessing to false set nameString to "" set m500Time to "" set m1500Time to "" set m5000Time to "" set m10000Time to "" set resString to "" set cText to characters of str set n to count cText set i to 1 repeat n times set c to get item i of cText if c is equal to "\t" or i is equal to n then if m10000timeProcessing is true then set tenthousendmTime of skateRecord to resString set m10000timeProcessing to false end if if m5000timeProcessing is true then set fivethousendmTime of skateRecord to resString set m5000timeProcessing to false set m10000timeProcessing to true end if if m1500timeProcessing is true then set fifthtenhunderdmTime of skateRecord to resString set m1500timeProcessing to false set m5000timeProcessing to true end if if m500timeProcessing is true then set fivehunderdmTime of skateRecord to resString set m500timeProcessing to false set m1500timeProcessing to true end if if nameProcessing is true then set nameSkater of skateRecord to resString set nameProcessing to false set m500timeProcessing to true end if display dialog resString set resString to "" else set resString to resString & c end if set i to i + 1 end repeat return skateRecord end processLineset fp to open for access file "Macintosh HD:Users:beert:Desktop:NewFile" with write permissionwrite "Sven Kramer\t37.73\t1:46.78\t6:16.78\t13:04.39\n" to fpwrite "\n" to fpwrite "Ok a little bit more..." to fpwrite "\n" to fpclose access fpset fp to open for access file "Macintosh HD:Users:beert:Desktop:NewFile"-- set myText to read fp until "."set myText to read fp -- until "\n"close access fpdisplay dialog myTextset pText to paragraphs of myTextset n to count pTextset i to 1repeat n times set pLine to get item i of pText set pLine to pLine & "\t" processLine(pLine) set i to i + 1end repeat
set fp to open for access file "Macintosh HD:Users:beert:Desktop:NewFile" with write permissionwrite "Sven Kramer\t37.73\t1:46.78\t6:16.78\t13:04.39\n" to fpwrite "\n" to fpwrite "Ok a little bit more..." to fpwrite "\n" to fpclose access fp
set fp to open for access file "Macintosh HD:Users:beert:Desktop:NewFile"-- set myText to read fp until "."set myText to read fp -- until "\n"close access fpdisplay dialog myText
set pText to paragraphs of myTextset n to count pTextset i to 1repeat n times set pLine to get item i of pText set pLine to pLine & "\t" processLine(pLine) set i to i + 1end repeat
write "Sven Kramer 37.73 1:46.78 6:16.78 13:04.39" & return to fpwrite return to fpwrite "Ok a little bit more..." to fpwrite return to fpclose access fp
my processLine(pLine)
SuccesAndré
Overigens zie ik verder geen morele of andere bezwaren en bij mij loopt ie en blijft ie ook lopen.Onderbreek je het script wel eens? Als het script loopt, loopt ie dan altijd helemaal door? m.a.w. Het is alles of niets? Voor de zekerheid zou je als allerlaatste uit te voeren regel nog een beep en/of display dialog kunnen laten uitvoeren.
Al eerder geschreven dat het mij meer een scripteditor probleem lijkt dan applescript. Misschien is het een combinatie, applescript loopt niet goed (af) omdat bijvoorbeeld file io niet goed afgesloten wordt. Het debuggen is ook lastig.
Blijkbaar ben ik op dit moment de enige dit probleem heeft.
Het script werkt hier prima, voor zover ik kan zien. Hoeveel data heb je (in KB)? Kun je een voorbeeldje van de data posten?
Het script doet het bij mij ook. Ik heb alleen het idee dat de ScriptEditor zich wel eens verslikt (ik weet alleen waarom niet).
Wat betreft de data. In het programma wordt de data geschreven. Enige tientallen bytes zou ik zeggen. Meer is er niet.
het is maar een ideetje, maar misschien raakt NewFile verminkt. hetzelfde filetje wordt geopend en overheengeschreven. als de vorige versie langer was dan blijft de rest staan en wordt ook gelezen. als je NewFile open hebt in een ander programma zou dat ook rare effecten kunnen geven.
ander idee: met het AppleScript-commando log kan je tussenresultaten loggen. er wordt gelogd in het onderste deel van het script-venster als je het op "Events" zet en in het Eventgeschiedenis-venster.
het kan ook best een bug in AppleScript zijn, sinds 10.5 is AppleScript helemaal UniCode en heeft kuren. zie ook http://www.macfreak.nl/cgi-bin/forums/topic.cgi?forum=19&topic=385
btw ken je deze:
set text item delimiters to "\t"set myText to "Sven Kramer\t37.73\t1:46.78\t6:16.78\t13:04.39"get text items of myText
resultaat: {"Sven Kramer", "37.73", "1:46.78", "6:16.78", "13:04.39"}
Bedankt voor de feedback. Ik had al naar zo'n optie gekeken. Ik wil echter de data in een record data type zetten.En ik doe dat mbv een eigen geschreven functie
Verder is het als in elke taal: werk je met constanten, geef ze dan een naam.1. Je ziet beter wat er gebeurt.2. Het is zuiniger en sneller3. Maak je een typefout dan krijg je een foutmelding. Maak je een typefout in je "\t" dan kraait geen haan ernaar, maar je script werkt niet meer.
(Bewerkt door hitchhiker om 23:24, 7-01-2009)
met de text-item-delimiters-suggestie bedoelde ik iets als:
on processLine(str) set textItems to text items of str repeat while number of items of textItems < 5 set textItems to textItems & "" end repeat set skateRecord to {nameSkater:item 1 of textItems, fivehunderdmTime:item 2 of textItems, fifthtenhunderdmTime:item 3 of textItems, fivethousendmTime:item 4 of textItems, tenthousendmTime:item 5 of textItems, points:integer} return skateRecordend processLine
leek me korter en sneller (bij grote hoeveelheden data).als het hang-probleem door de zeer-langzaam-aan-bug van AppleScript komt dan kan je het hiermee omzeilen.
@ hitchhiker
ook ik gebruik gewoonlijk constantes, uit principe, ze zijn er niet voor niets, het leest inderdaad makkelijker, je kan er naar zoeken en als je de waarde van een constante wijzigt dan is hij overal waar hij gebruikt wordt gewijzigd. jammer dat je geen eigen constantes kan definiëren in AppleScript. dit stukje script was even snel in elkaar geflanst en ik werd slordig, sorry.
wat bedoel je eigenlijk met zuiniger en sneller?
Willemien om 20:22, 8-01-2009jammer dat je geen eigen constantes kan definiëren in AppleScript.
constantA word with a predefined value.
Constants are generally used for enumerated types. You cannot define constants in scripts; constants can be defined only by applications and by AppleScript.
als ik een property in een script gebruik en het script bewaar als programma dan kan het script de property wijzigen en bewaren. als het script de volgende keer wordt gestart dan heeft de property de waarde van de vorige keer, niet steeds de originele startwaarde. dit vind ik iets anders dan een constante. tab is ook geen constante maar een property en kan worden gewijzigd. tijdens het runnen is het gebruik van tab iets langzamer dan "\t", ik kon het niet laten en heb het uitgeprobeerd.ook in een taal die wordt gecompileerd, bv c(++), is het gebruik van constanten eerder langzamer dan sneller. zuiniger en sneller kan, maar niet zuiniger en langzamer kan ook.
Ik vind de code suggestie van Willemien wel interressant.