Huomaa: delay
-ongelma korjattiin OS X 10.11 El Capitan -käyttöjärjestelmässä.
Siitä lähtien kun päivitin Yosemite-versioon, viivästyksiä käyttävät Applescripts-sovellukset ovat lakanneet toimimasta. . Kuinka voin korjata tämän?
Tässä on maailman yksinkertaisin omena-esimerkki helpon esimerkin vuoksi:
set volume output volume 0 delay 5 set volume output volume 20 delay 5 set volume output volume 0 delay 5 set volume output volume 20 delay 5 set volume output volume 0 delay 5 set volume output volume 20 delay 5 set volume output volume 0
Sen pitäisi kestää 30 sekuntia. Jos suoritan sen Script Editorissa (aiemmin Applescript Editor), se kestää 30 sekuntia. Mutta jos tallennan tämän komentosarjan sovellukseksi, käynnistäessäni sovelluksen viivästykset ohitetaan ja sovelluksen suorittaminen kestää murto-osan sekunnista.
Kuinka voin pakottaa Applescriptin viivyttämään tietyn summan ennen kuin siirryt seuraavaan vaiheeseen? Onko tämä Yosemiten häiriö? Onko olemassa luotettavaa kiertotapaa?
Kommentit
- Tämä toimii odotetusti Mac-tietokoneellani (10.10.1)
- Mikä tahansa idea mikä saa sen toimimaan minulla? Selvennykseksi: se toimii Script Editorissa, mutta jos tallennan komentosarjan sovelluksena ja käynnistän sovelluksen, viivästykset jätetään huomioimatta. Se on ’ s kummallisin asia.
- Minulla on sama ongelma 10.10.3: ssa
- Ilmoitettu Applelle: openradar.me/21588747
- Tämä ongelma on korjattu OS X 10.11 El Capitan -käyttöjärjestelmässä.
Vastaa
Huomaa: Ongelma delay
korjattiin OS X 10.11 El Capitanissa.
@ 2oh1, vastauksessasi on oikea perusidea, mutta tässä on täydellinen ja oikea vastaus:
Ainoa järkevä tapa kiertää tämä on kutsua ”viive” silmukassa, joka varmistaa, että haluttu kesto kuluu ennen jatkamista. Paras tapa tehdä tämä on ohittaa ”viive” mukautetulla käsittelijällä:
on delay duration set endTime to (current date) + duration repeat while (current date) is less than endTime tell AppleScript to delay endTime - (current date) end repeat end delay
Tämän avulla voit jättää muun komentosarjan muuttumattomaksi ja voit käyttää viivettä normaalisti, esim.
delay 5 display alert "I like cake!"
[HUOMAUTUS: Normaalisti mukautettu käsittelijä käytti kutsua ”jatka viiveen kestoa” sisäänrakennettu ”delay”, mutta huomasin, että vaikka tämä toimii Script Editorissa, se palauttaa virheen, kun sitä käytetään sovelmassa (”Viivettä ei voi jatkaa. (-1708) ”). Olen kiertänyt tämän ongelman käskemällä AppleScriptiä käsittelemään viivekomennon sen sijaan, että käytän ”jatka” -toimintoa päästäksesi sinne.]
Ongelma on, että delay
käsittelee käyttäjää Syötä samalla kun keskeytät komentosarjan, joten voit silti napsauttaa sovelman näyttämiä valikoita tai ikkunoita, ja siellä on vika (korjattu 10.11: ssä), jossa käyttäjän syöttö saa delay
odottamaan täysi kesto ennen komentojen suorittamisen jatkamista. Jos et ole vuorovaikutuksessa sovelman kanssa, delay
toimii oikein.
Kommentit
- Onko kaikki vai onko syystä viive toiminut tällä tavalla Yosemiten kanssa?
- Viive ei ole ’ viivästynyt.
- Se ’ on niin outoa. Olin oikaisemassa omena-skriptiä, joka käyttää viivästystä toisena iltana, ja yhtäkkiä viive toimi jälleen oikein. Oletin, että vika oli korjattu . Tunnin kuluttua, vaikka mikään ei ollut muuttunut, vika oli palannut. Olen ämmentynyt. Sillä ei ole väliä vaikka ’
’ m muuttujan avulla asettamaan aika ja viive, kunnes viiden minuutin kuluttua (esimerkiksi), ja se ’ toimii täydellisesti . Joten … ongelma ratkaistu, mutta se ei ’ ei selitä miksi ongelma on olemassa. Mielenkiintoista, mielenkiintoista, mielenkiintoista. - Koska Apple meni hukkaan. Apple ohjelmisto on paljon vähemmän luotettava, koska he alkoivat julkaista OS X: tä vuosittain. Kaipaan korkeampia OS X -aliversioita (kuten 10.6.8), joissa käyttöjärjestelmä oli kovaa. Et vain saa ’ enää sellaista kokemusta.
- Jos se ’ on vika (olen samaa mieltä kanssa), miksi sitä ei ole ’ t ole vielä korjattu, ihmettelen. Onko kukaan täällä tehnyt tutkaraportin? Lähetätkö sitten sen henkilötodistuksen? (tai / myös postita osoitteeseen openradar.me)
Vastaa
Taistellessani saman ongelman kanssa törmäsin tämä vastaus ei-niin-liittyvään kysymykseen ja päätti kokeilla sitä ja näyttää siltä toimi minulle.
Korvaa delay 5
sanalla do shell script "/bin/sleep 5"
ja saat saman tuloksen.
Kommentit
- Kiitos jakamisesta! Kuten aiemmin sanoin, ’ en pysty testaamaan tätä, koska viivästys 5 toimii minulle juuri nyt syistä, jotka eivät ole minulle järkeviä (testasin juuri uudelleen hetki sitten). Minulla ei ole aavistustakaan, miksi tämä joskus toimii ja joskus epäonnistuu.’ on niin outoa. Päätin käyttää kiertotapaa, jossa saan nykyisen ajan ja asetan sen muuttujaksi, ja sitten keskeytin komentosarjan, kunnes aika on muuttuva plus yksi minuutti (ilmeisesti 1 minuutin viiveellä). Se ’ on hankala, mutta se ’ toimi moitteettomasti kuukausia, kun taas yksinkertainen viive on ollut ajoittaista. Selvä.
- Olen käynnissä 10.10.5 -käyttöjärjestelmää, eikä tämä ratkaisu toimi, ja lukitsee komentosarjan myös unen ajaksi
- @Greg: Jos se ”lukitsee komentosarjan” lepotilan kesto, se ’ toimii.
/bin/sleep
odottaa unen kestoa eikä palaa ennen kuin se on valmis. Sen sijaan AppleScript ’: n sisäänrakennettu komentodelay
käsittelee käyttäjän syöttötapahtumia, kun komentosarja on keskeytetty. (Missä vika on: jos käyttäjän näppäimistö syötetään,delay
jatkaa komentosarjan suorittamista ennen kuin viiveaika on päättynyt.)
Vastaa
En sano, että tämä on paras ratkaisu, mutta se näyttää ratkaisevan ongelmani. Sen sijaan, että käyttäisit yksinkertaista viivettä, jota ei oteta huomioon syistä, joita en ymmärrä, olen siirtynyt saamaan aikaa ja silmukkaamaan, kunnes uusi aika on saavutettu (se käyttää silti viivettä, mutta sillä ei ole väliä, jos se ohittaa viiveen, koska komentosarja ei jatka vasta aika on saavutettu).
# Pause for five minutes set GetTheTime to current date set NewTime to GetTheTime + (5 * minutes) repeat while (current date) is less than NewTime delay 60 end repeat
Olen yhä kuolemassa tietääkseen, miksi viivästystä ei huomioida (tai nopeutetaan dramaattisesti?! ??), mutta tämä saa aikaan työ tehty, kömpelö kuin se onkin.
Kommentit
- ” -viive ” -komento ei ole ’ t ” nopeutettu ” , se ’ keskeytetään. Viivästyessään se istuu silmukassa ja tarkistaa, onko näppäimistön syöttötapahtumia, jotta se voi tarkistaa komentojakson. Ilmeisesti se poistuu virheellisesti viivekierrosta, kun havaitaan käyttäjän syöttö.
- Mielenkiintoista! ’ m huomaan, että se ’ jätetään huomiotta (vauhditetaan? Keskeytetään?) Silloinkin, kun Mac istuu lepotilassa, mutta en ’ ei tiedä miksi.
- Kun käyttäjän syötetapahtuma on tapahtumajonossa,
delay
jatkaa keskeytetään, kunnes jokin käsittelee tapahtumia ja poistaa ne jonosta.
Vastaa
Löysin työn- noin saksalaisessa foorumiviestissä . Lisää nämä rivit skriptisi yläosaan:
use framework "Foundation" use scripting additions current application"s NSThread"s sleepForTimeInterval:1
Kommentit
- I ’ minulla on vaikeuksia testata vastaustasi, koska viive toimii jostain syystä Macissa odotetusti. Minulla ei ole aavistustakaan miksi. I ’ m käynnissä 10.10.3. Ehkä Apple korjasi tämän virheen? Tai ehkä ’ on vain ajoittainen ongelma, joka ei ’ vaikuta Maciin tällä hetkellä. Uh. Kuten sanoin edellä, kiertotapani on saada Applescript saamaan nykyinen aika ja viivästymään nykyiseen aikaan plus x.
- Olen käynnissä myös 10.10.3 ja näen edelleen ongelman. Koska kaikki eivät näe ongelmaa, se ’ todennäköisesti keskeytyy tai liittyy kolmannen osapuolen ohjelmistoihin tai tiettyihin asetusten asetuksiin. Kuka tietää. BTW, kiertotavallasi on todennäköisesti haitta, että sovellus käyttää 100% suorittimen aikaa odottaessaan, kun taas oikea viivästyskäyttäytyminen on laittaa sovellus nukkumaan kyseiseksi ajaksi, mikä kuluttaa vähemmän virtaa. Käytän 10.10.5-versiota, eikä tämä ratkaisu toimi.
- @ThomasTempelmann: Ongelma ilmenee, kun käyttäjä on antanut syötteen. Jos et ’ t napsauta tai kirjoita komentosarjan ollessa käynnissä, vika ei ole ’ t käynnistetty.
- Huomaa, että tämä ratkaisu saa sovelluksen todella jäätymään unen ajaksi.
delay
käsittelee käyttäjän syötteitä, kun komentosarja on keskeytetty, joten voit silti olla vuorovaikutuksessa esimerkiksi valikoiden ja ikkunoiden kanssa.
Vastaa
carzyjilla oli mielestäni paras vastaus, mutta yhdistettynä Chris Page: n menetelmään saat:
on delay duration do shell script "/bin/sleep " & duration end delay
Voit palata alkuperäiseen viiveeseen kommentoimalla ”viive” – ”lopetusviive” -kohdan.
Kommentit
- I teki myös samanlaisen koodimuutoksen, ennen kuin näen tämän. Olen käynnissä 10.10.5, eikä tämä ratkaisu toimi, ja lukitsee myös komentosarjan unen ajaksi.
Vastaus
tämä on muunnos @ chris-page-ratkaisuun.
Näyttää olevan tasapaino reagoivuuden ja viiveen tarkan sieppaamisen välillä.
on delay duration set endTime to (current date) + duration repeat while (current date) is less than endTime set delta to duration / 100 if duration < 0.2 then set delta to 0.2 end if tell AppleScript to delay delta end repeat end delay
Mutta sen sijaan, että käskettäisimme Applescriptiä viivyttelemästä kokonaiskestoa, käskemme vain viivästymään murto-osalla kestoa. jos jakso on pienempi kuin mitä omena sallii (1/60 sekunnista), niin asetetaan vain se delta. Että voimme säilyttää jonkin verran reagointikykyä, mutta silti olla tarkkoja. epäillään, että joskus viive ei ”t” toimi niin, että toista silmukka -toiminto pitää langan lukittuna, mutta onnistumisskenaarioissa haluamme viive-delta olevan lyhyt, jotta prosessi voidaan silti keskeyttää.
Kommentit
- Pyydetyn viiveen lyhentäminen on tarpeetonta, ja se voi vain tehdä komentosarjalta hitaamman ja kuluttaa enemmän suoritinta odottaessaan. Versioni vain kutsuu viivettä, kunnes koko haluttu kesto on kulunut, jolloin
delay
voi viivästyttää niin paljon kuin pystyy, ennen kuin se jatkaa suoritusta. - Huomaa, että koska tämä vastaus lähetettiin, päivitin koodini käyttämään
delay endTime - (current date)
-tunnustadelay duration
-tilan sijasta, mikä varmistaa, että jos div> ei ’ t keskeyty se voitti ’ t keskeyttää komentosarjan kauemmin kuin alun perin pyydetty aika , jota ehkä yritit käsitellä tällä vastauksella.
Vastaa
Joten sanottuna kaikki yhdessä, uskon, että Chris tarkoittaa tätä:
on delay duration set endTime to (current date) + duration repeat while (current date) is less than endTime tell AppleScript to delay endTime - (current date) end repeat end delay