Может ли Applescript быть многопоточным?

Я пишу Applescript для Spotify, который должен делать две вещи:

  1. Запишите каждую новую песню.
  2. Каждые N секунд проверяют, какое звуковое устройство используется.

Я делаю (1) простым циклом, который проверяет, какая часть трека остается, а затем использует это значение в инструкции задержки в цикле (ненужной для запуска цикла на полной скорости). Однако N обычно намного меньше, чем оставшееся время текущего трека. Следовательно, я хотел бы выполнить задачу (2) в отдельном цикле с N-0,5 в качестве значения задержки. В основном я хочу, чтобы циклы выполнялись одновременно из одного и того же сценария. Возможно ли это?

(Конечно, я мог бы использовать два отдельных сценария, но мне нужно распространить это решение, когда это будет сделано, поэтому меньше визуальной сложности - то есть, два сценария, выполняющие одновременно занятие места в Доке, нужно запускать и т. д. - лучше. )

6 голосов | спросил d-b 3 +03002017-10-03T14:55:21+03:00312017bEurope/MoscowTue, 03 Oct 2017 14:55:21 +0300 2017, 14:55:21

3 ответа


2

Не легко. Концепция процессов и потоков не содержится в AppleScript.

Вам понадобится другой инструмент для этой работы. Swift может быть хорошим, если вы не ищете питон или что-то еще более определенное.

ответил bmike 3 +03002017-10-03T15:01:01+03:00312017bEurope/MoscowTue, 03 Oct 2017 15:01:01 +0300 2017, 15:01:01
1

AppleScript now поддерживает многопоточность (macOS 10.10 или новее). И первоначально он имеет функцию прерывания таймера с 1993 года (on idle обработчик событий таймера работает одновременно в одном AppleScript).

Я написал некоторые AppleScripts с iTunes , как вы писали. AppleScript может создавать делегаты и получать событие другого приложения.

Этот пример AppleScript может получить изменение состояния игры iTunes. Однажды скрипт запускается в редакторе сценариев, он получает событие изменения воспроизведения iTunes и отображает имя трека с помощью диалогового окна уведомлений macOS.

-- Created 2017-10-13 by Takaaki Naganoya
-- 2017 Piyomaru Software

use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

property NSDistributedNotificationCenter : a reference to current application's NSDistributedNotificationCenter

on run
    NSDistributedNotificationCenter's defaultCenter()'s addObserver:me selector:"statusChanged:" |name|:"com.apple.iTunes.playerInfo" object:(missing value)

end run

on statusChanged:sender
    tell application id "com.apple.iTunes"
        try
            tell current track
                set anAlbum to album
                set aName to name
                set anArtist to album artist
                set aRating to rating
            end tell
        on error
            return
        end try
    end tell
    display notification aName
end statusChanged:

Итак, дело в том, что приложение Spotify может предоставить такую ​​функцию, как iTunes, или нет.

ответил Piyomaru 13 +03002017-10-13T09:45:08+03:00312017bEurope/MoscowFri, 13 Oct 2017 09:45:08 +0300 2017, 09:45:08
0

Я бы предложил написать это в JavaScript, а не в AppleScript. JavaScript - это поддерживаемый язык для сценариев событий Apple. JavaScript однопоточный, но гораздо проще написать неблокирующий асинхронный код.

setInterval(function() {
    console.log('Do something in the closure function here');
}, 3000);
ответил David Fekke 3 +03002017-10-03T19:28:04+03:00312017bEurope/MoscowTue, 03 Oct 2017 19:28:04 +0300 2017, 19:28:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132