Příkaz „zpoždění“ AppleScript nefunguje od přepnutí na Yosemite

Poznámka: Problém s delay byl opraven v OS X 10.11 El Capitan.

Od té doby, co jsem upgradoval na Yosemite, přestaly fungovat Applescripty, které používají zpoždění. . Jak to mohu opravit?

Zde je nejjednodušší Applescript na světě, pro snadný příklad:

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 

Dokončení by mělo trvat 30 sekund. Pokud ji spustím v editoru skriptů (dříve Applescript Editor), dokončení trvá 30 sekund. Pokud ale tento skript uložím jako aplikaci, při spuštění aplikace jsou zpoždění ignorována a dokončení aplikace trvá zlomek sekundy.

Jak mohu vynutit zpoždění aplikace Applescript o určitou částku času, než přejdete k dalšímu kroku? Je to yosemitská závada? Existuje spolehlivé řešení?

Komentáře

  • Na mém Macu (10.10.1) to funguje podle očekávání
  • Nějaký nápad co způsobuje, že nefunguje na mém? Upřesnění: funguje to v editoru skriptů, ale pokud uložím skript jako aplikaci a poté aplikaci spustím, zpoždění jsou ignorována. Je to ‚ nejpodivnější věc.
  • Mám stejný problém 10.10.3
  • Hlášeno společnosti Apple: openradar.me/21588747
  • Tento problém byl opraven v systému OS X 10.11 El Capitan.

Odpověď

Poznámka: Problém s byl opraven v OS X 10.11 El Capitan.

@ 2oh1, ve své odpovědi máte správný základní nápad, ale zde je úplná a správná odpověď:

Jediným rozumným způsobem, jak to obejít, je vyvolat „zpoždění“ ve smyčce, která zajistí, že před pokračováním uplyne požadovaná doba trvání. Nejlepší způsob, jak to udělat, je přepsat „zpoždění“ vlastním obslužným programem:

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 

To vám umožní ponechat zbytek skriptu beze změny a můžete použít „delay“ normálně, např.

delay 5 display alert "I like cake!" 

[POZNÁMKA: Za normálních okolností by vlastní obslužný program použil k vyvolání „pokračovat v prodlevě zpoždění“ vestavěné „zpoždění“, ale zjistil jsem, že i když to funguje v editoru skriptů, při použití v appletu vrátí chybu („Nelze pokračovat se zpožděním. (-1708) “). Tento problém jsem vyřešil tak, že jsem přímo řekl AppleScriptu, aby zpracoval příkaz delay místo použití příkazu „continue“.]

Problém je v tom, že delay zpracovává uživatele při pozastavení skriptu, takže stále můžete klikat na nabídky nebo okna zobrazená appletem, a je tu chyba (opravená v 10.11), kde vstup uživatele způsobí, že delay nebude čekat celé trvání před obnovením provádění skriptu. Pokud s appletem nereagujete, delay funguje správně.

Komentáře

  • Je vše této chyby, nebo existuje důvod, proč zpoždění funguje tímto způsobem s Yosemite?
  • Jedná se o chybu, která zpoždění není ‚ t zpoždění.
  • Je to ‚ tak divné. Dělal jsem si s jablkem, které používá zpoždění druhou noc, a najednou zpoždění opět fungovalo správně. Předpokládal jsem, že chyba byla opravena . O hodinu později, i když se nic nezměnilo, chyba byla zpět. Jsem ‚ opravdu zmatený. Nezáleží na tom ‚ . ‚ m používám proměnnou k nastavení času a zpoždění (například o pět minut později) a ‚ funguje perfektně . Takže … problém vyřešen, ale to ‚ nevysvětluje, proč problém existuje. Zajímavé, zajímavé, zajímavé.
  • Protože Apple falešný. Apple software je mnohem méně spolehlivý, protože každý rok začali vydávat OS X. Stýská se mi po menších verzích OS X (jako 10.6.8), kde byl OS pevný. Už prostě ‚ už tento druh zkušeností nezískáváte.
  • Pokud se ‚ vyskytne chyba (s čím souhlasím) with), why isn ‚ t this still not fixed, I wonder. Udělal tu někdo radarovou zprávu? Zašlete prosím jeho ID? (nebo také zveřejnit příspěvek na openradar.me)

Odpovědět

Při boji se stejným problémem jsem narazil tato odpověď na nepříbuznou otázku a rozhodl se to zkusit pracujte pro mě.

Nahraďte delay 5 řetězcem do shell script "/bin/sleep 5" a získejte stejný výsledek.

Komentáře

  • Děkujeme za sdílení! Jak jsem řekl výše, nemohu to ‚ otestovat, protože z důvodů, které mi nedávají smysl, zpoždění 5 právě teď funguje pro mě (právě jsem testoval před chvílí znovu). Netuším, proč to někdy funguje a někdy selže.Je to ‚ tak zvláštní. Nakonec jsem použil řešení, kde jsem získal aktuální čas a nastavil jej jako proměnnou a poté pozastavil skript, dokud není čas proměnný plus jedna minuta (samozřejmě pro 1 minutové zpoždění). ‚ s neohrabaný, ale ‚ fungoval bezchybně celé měsíce, zatímco jednoduché zpoždění bylo občasné. Uf.
  • Používám 10.10.5 a toto řešení nefunguje a také uzamkne skript na dobu spánku
  • @Greg: Pokud „uzamkne skript“ pro dobu spánku, poté ‚ funguje. /bin/sleep čeká na dobu spánku a nevrátí se, dokud nedokončí. Naproti tomu integrovaný příkaz AppleScript ‚ delay zpracovává události vstupu uživatele, zatímco je skript pozastaven. (V čem spočívá chyba: pokud existuje vstup z klávesnice uživatele, delay pokračuje ve spouštění skriptu před dokončením doby zpoždění.)

Odpověď

Neříkám, že je to nejlepší řešení, ale zdá se, že můj problém vyřešil. Místo použití jednoduchého zpoždění, které je ignorováno z důvodů, kterým nerozumím, jsem přepnul na získávání času a opakování, dokud není dosažen nový čas (stále používá zpoždění, ale na tom nezáleží, pokud ignoruje zpoždění, protože skript nepokračuje, dokud je dosaženo času).

# 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 

Stále umírám, abych věděl, proč je zpoždění ignorováno (nebo dramaticky zrychleno?! ??), ale toto se dostane práce je neohrabaná.

Komentáře

  • Zpoždění “ “ příkaz není ‚ “ zrychlen “ , ‚ je přerušeno. Při zpoždění sedí ve smyčce a kontroluje, zda existují nějaké události vstupu z klávesnice, aby mohl zkontrolovat období příkazů. Zjevně nesprávně opouští zpožďovací smyčku, když je detekován jakýkoli vstup uživatele.
  • Zajímavé! ‚ zjišťuji, že je ‚ ignorován (zrychlen? Přerušen?), I když můj Mac nečinně sedí, ale ne ‚ Nevím proč.
  • Jakmile je událost vstupu uživatele ve frontě událostí, bude delay pokračovat být přerušen, dokud něco nezpracovává události a neodstraní je z fronty.

Odpověď

Našel jsem práci – kolem v německém příspěvku na fóru . Přidejte tyto řádky do horní části skriptu:

use framework "Foundation" use scripting additions current application"s NSThread"s sleepForTimeInterval:1 

Komentáře

  • I ‚ mám potíže s testováním vaší odpovědi, protože z jakéhokoli důvodu zpoždění v současné době na mém Macu funguje podle očekávání. Netuším proč. ‚ m běží 10.10.3. Možná Apple opravil tuto chybu? Nebo možná ‚ je jen občasný problém, který v tuto chvíli nepůsobí na můj Mac. Fuj. Jak jsem však řekl výše, moje řešení spočívá v tom, že Applescript získá aktuální čas a poté zpoždění do aktuálního času plus x.
  • Používám také 10.10.3 a stále vidím problém. Protože ne každý vidí problém, je ‚ pravděpodobně přerušovaný nebo související se softwarem třetí strany nebo s určitým nastavením předvoleb. Kdo ví. BTW, vaše řešení má pravděpodobně tu nevýhodu, že aplikace během čekání stále používá 100% času CPU, zatímco správné chování při zpoždění spočívá v uspání aplikace na tuto dobu, čímž se spotřebuje méně energie.
  • Používám 10.10.5 a toto řešení nefunguje.
  • @ThomasTempelmann: K problému dochází, když existuje vstup uživatele. Pokud ‚ neklikáte ani nepíšete, když je spuštěný skript, chyba se ‚ nespustila.
  • Všimněte si, že toto řešení způsobí, že aplikace po dobu spánku skutečně zamrzne. delay zpracovává vstupy uživatelů, když je skript pozastaven, takže můžete například nadále pracovat s nabídkami a okny.

Odpovědět

carzyj měl to, co považuji za nejlepší odpověď, ale v kombinaci s metodou Chrisa Page dostanete:

on delay duration do shell script "/bin/sleep " & duration end delay 

Chcete-li se vrátit k původnímu zpoždění, můžete komentovat „on delay“ až „end delay“.

Komentáře

  • I také provedl podobnou úpravu kódu, než to viděl. Používám 10.10.5 a toto řešení nefunguje a také uzamkne skript na dobu spánku.

Odpověď

toto je modifikace řešení @ chris-page

Zdá se, že jde o rovnováhu mezi odezvou a přesným zachycením zpoždění.

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 

Ale místo toho, abychom říkali společnosti AppleScript, aby zpozdila celkovou dobu, řekneme jí, aby zpozdila o zlomkovou dobu trvání. pokud je doba menší než to, co dovoluje jablko (1/60 sekundy), pak ji „nastavme na tuto deltu. Že si můžeme zachovat určitou odezvu, přesto být přesná. existuje podezření, že někdy zpoždění není pracujte tak, aby smyčka opakování while udržovala vlákno zamčené, ale ve scénářích úspěchu chceme, aby delta zpoždění byla krátká, aby mohl být proces stále přerušen

Komentáře

  • Zkrácení požadovaného zpoždění je zbytečné a může pouze zpomalit běh skriptu a spotřebovat více CPU během čekání. Moje verze pouze volá zpoždění, dokud neuplynula celá požadovaná doba, což umožňuje delay odložit co nejvíce, než bude pokračovat v provádění.
  • Všimněte si, že od této odpovědi byl zveřejněn, aktualizoval jsem svůj kód tak, aby místo delay duration používal delay endTime - (current date), což zajišťuje, že pokud delay nepřerušuje ‚ t přeruší to ‚ t pozastavit skript déle, než byl původně požadovaný čas , což mohlo být to, co jste se touto odpovědí pokoušeli oslovit.

Odpověď

Takže vše dohromady, věřím, že Chris to myslí takto:

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 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *