Catatan: Masalah dengan delay
telah diperbaiki di OS X 10.11 El Capitan.
Sejak saya memutakhirkan ke Yosemite, Applescripts yang menggunakan penundaan telah berhenti berfungsi. Bagaimana saya bisa memperbaikinya?
Inilah Applescript paling sederhana di dunia, untuk contoh yang mudah:
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
Itu harus memakan waktu 30 detik untuk selesai. Jika saya menjalankannya di Script Editor (sebelumnya Applescript Editor) dibutuhkan 30 detik untuk menyelesaikannya. Tetapi jika saya menyimpan skrip ini sebagai aplikasi, ketika saya meluncurkan aplikasi, penundaan diabaikan dan aplikasi membutuhkan waktu sepersekian detik untuk menyelesaikannya.
Bagaimana saya bisa memaksa Applescript untuk menunda waktu tertentu sebelum melanjutkan ke langkah berikutnya? Apakah ini kesalahan Yosemite? Apakah ada solusi yang dapat diandalkan?
sumber
Jawaban:
Catatan: Masalah dengan
delay
telah diperbaiki di OS X 10.11 El Capitan.@ 2oh1, Anda memiliki ide dasar yang tepat dalam jawaban Anda, tetapi inilah jawaban yang lengkap dan benar:
Satu-satunya cara yang masuk akal untuk mengatasi ini adalah dengan memanggil "penundaan" dalam satu lingkaran yang memastikan durasi yang diinginkan berlalu sebelum melanjutkan. Cara terbaik untuk melakukannya adalah mengganti "tunda" dengan penangan khusus:
Ini memungkinkan Anda untuk membiarkan sisa skrip Anda tidak berubah dan Anda dapat menggunakan "penundaan" secara normal, misalnya,
[CATATAN: Biasanya, penangan kustom akan menggunakan "lanjutkan durasi penundaan" untuk memanggil "penundaan" bawaan, tetapi saya menemukan bahwa, meskipun ini berfungsi di dalam Script Editor, ia mengembalikan kesalahan ketika digunakan dalam applet ("Can ' t lanjutkan penundaan. (-1708) ”). Saya mengatasi masalah itu dengan secara langsung memberitahu AppleScript untuk menangani perintah penundaan alih-alih menggunakan "lanjutkan" untuk sampai ke sana.]
Masalahnya adalah bahwa
delay
proses input pengguna saat menjeda skrip, sehingga Anda masih dapat mengklik menu atau jendela yang ditampilkan oleh applet, dan ada bug (diperbaiki pada 10.11) di mana input pengguna menyebabkandelay
tidak menunggu durasi penuh sebelum melanjutkan eksekusi skrip . Jika Anda tidak berinteraksi dengan applet,delay
berfungsi dengan benar.sumber
Sambil berjuang menghadapi masalah yang sama ini, saya menemukan jawaban untuk pertanyaan yang tidak begitu terkait ini dan memutuskan untuk mencobanya dan tampaknya berhasil bagi saya.
Cukup ganti
delay 5
dengando shell script "/bin/sleep 5"
dan dapatkan hasil yang sama.sumber
/bin/sleep
menunggu durasi tidur dan tidak kembali sampai selesai. Sebaliknya,delay
perintah bawaan AppleScript menangani peristiwa input pengguna saat skrip dijeda. (Di situlah letak bug: jika ada input keyboard pengguna,delay
lanjutkan eksekusi skrip sebelum durasi penundaan selesai.)Saya tidak mengatakan ini adalah solusi terbaik, tetapi tampaknya telah menyelesaikan masalah saya. Alih-alih menggunakan penundaan sederhana, yang diabaikan karena alasan yang saya tidak mengerti, saya telah beralih untuk mendapatkan waktu dan perulangan sampai waktu baru tercapai (masih menggunakan penundaan, tetapi tidak masalah jika diabaikan penundaan karena skrip tidak berlanjut sampai waktu tercapai).
Saya masih ingin tahu mengapa penundaan diabaikan (atau dipercepat secara dramatis?! ??), tetapi ini menyelesaikan pekerjaan, kikuk seperti itu.
sumber
delay
akan terus terputus hingga ada yang menangani acara dan menghapusnya dari antrian.Saya menemukan solusi di pos forum Jerman . Tambahkan baris ini ke bagian atas skrip Anda:
sumber
delay
memproses input pengguna saat skrip dijeda, jadi Anda masih dapat berinteraksi dengan menu dan jendela, misalnya.carzyj memiliki apa yang saya anggap sebagai jawaban terbaik, tetapi ketika dikombinasikan dengan metode Chris Page, Anda mendapatkan:
Anda dapat mengomentari "penundaan" melalui "tunda akhir" untuk kembali ke penundaan awal.
sumber
ini adalah modifikasi dari solusi @ chris-page
Tampaknya menjadi keseimbangan antara responsif dan secara akurat menangkap penundaan.
Tetapi alih-alih mengatakan pada Applescript untuk menunda durasi keseluruhan, kami hanya mengatakannya untuk menunda untuk periode fraksional durasi. jika periode kurang dari yang diizinkan apel (1/60 detik), maka mari kita atur ke delta itu. Bahwa kita dapat menjaga respons, namun tetap akurat. kecurigaannya adalah bahwa kadang-kadang keterlambatan tidak bekerja sehingga pengulangan sementara loop akan membuat utas tetap terkunci, tetapi dalam skenario sukses, kami ingin penundaan delta menjadi singkat sehingga proses masih dapat terganggu
sumber
delay
untuk menunda sebanyak mungkin sebelum melanjutkan eksekusi.delay endTime - (current date)
sebagai gantinyadelay duration
, yang memastikan bahwa jikadelay
tidak terganggu tidak akan menghentikan skrip lebih lama dari waktu yang diminta semula, yang mungkin merupakan apa yang Anda coba alamat dengan jawaban ini.Jadi, untuk menyatukan semuanya, saya percaya Chris berarti ini:
sumber