2010-07-09 3 views
2

Я использую комплект для обработки звука Snack вместе с TCL. Я хочу отрезать часть звука и дать этому разделу другой поток для работы.Передать по ссылке TCL - резьба?

Мой вопрос в том, как передать что-то по ссылке, между потоками в TCL.

proc a {} { 
    snack::sound snd 
    thread::send -async $Thread [list B snd] 
} 

set Thread [thead::create { 
    proc B{snd} { 
    ... do something with snd 
    } 
} 

ответ

4

Это не сработает. Потоки Tcl спроектированы так, чтобы быть сильно изолированными друг от друга, поскольку он значительно уменьшает количество блокировки, необходимое для нормальной обработки. Нижняя сторона этого заключается в том, что передача вещей между потоками является нетривиальной (кроме коротких сообщений, содержащих команды, какие аудиоданные нет!) Но есть способ продвижения вперед ...

Если вы можете отправить данные как кусок байтов (на уровне скрипта), я рекомендую переносить его между потоками, используя tsv package, который разделяется пакетом потоков, поэтому вы уже имеете его. Это позволит вам переносить данные между потоками относительно просто. Имейте в виду, что пакет snack не поддерживает потоковую информацию в своем интерфейсе на уровне скрипта, поэтому передача данных по-прежнему будет включать в себя копирование, а Tk (например, большое количество инструментов GUI, FWIW) не поддерживает многопоточное использование (хорошо , не без методов в другое время), поэтому, если вы делаете визуализацию сигналов, у вас впереди какая-то работа. (OTOH, современные процессоры также имеют слишком много времени.)

Смежные вопросы