LINUX.ORG.RU

События в Tcl


0

1

Помогите нубу.
Скрипт должен запрашивать определённые данные через меняющиеся промежутки времени. Данные ему отдаёт бинарник, но это не суть важно - про события в Tcl так мало инфы, что не понял как это реализовать грамотно.

Пока так:
set ct 0
after $timer {set ct [getdata]}
while «$ct<100» {
   
   vwait ct
   lappend cth $ct

   set i [ expr [llength $cth]-8 ]

   set cthh [lrange $cth $i end]
   
   puts $cthh
   
   after $timer {set ct [getdata]}
}

Но это же нелепо...

Сильно не пинайте - смотрю на Tcl 2 день.

★★★★★

Последнее исправление: Suntechnic (всего исправлений: 1)

Не то чтобы въехал в суть, но может, что-то типо так?

# процедура-обработчик события по таймеру proc do_you_need {} { global timer cth # читаем данные с бинарника set ct [getdata] # если прочитали, что хотели, обработаем if {$ct ne «„} { lappend cth $ct

... что-то со всем этим делаем ...

puts $cthh } # зевая, просим будильник разбудить нас в следующий раз after $timer do_you_need }

set cth {} set freeze 0

# поехали... do_you_need # чтобы сразу не вылететь в консоль vwait freeze

anonymous
()

Fuck...

# процедура-обработчик события по таймеру
proc do_you_need {} {
global timer cth
# читаем данные с бинарника
set ct [getdata]
# если прочитали, что хотели, обработаем
if {$ct ne «„} {
lappend cth $ct

... что-то со всем этим делаем ...

puts $cthh
}
# зевая, просим будильник разбудить нас в следующий раз
after $timer do_you_need
}

set cth {}
set freeze 0

# поехали...
do_you_need
# чтобы сразу не вылететь в консоль
vwait freeze

anonymous
()
Ответ на: комментарий от anonymous

Мне и мысль такая не пришла в голову - ничего что рекурсивный вызов? Не будет там переполнения стека скажем?

А проверять вобщем и не надо получено ли значение - всякий раз как мы торкаем бинарник он читает данные с датчика (пока для отладки сделал считывание темпы процессора).

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

все нормально, там нет рекурсии :)

after $timer только даст задание таймеру выполнить процедуру еще раз через заданный промежуток времени и не задержит завершение процедуры текущей

anonymous
()
Ответ на: комментарий от anonymous

Спасибо. Это у меня Бэйсиковские замашки...

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Да - полностью вкурил систему. Понял почему нет рекурсии. Переделал по другому - с помощью trace записи в переменную.
Т.е. теперь after запускает чтение с датчика, а изменение переменной вызывает процедуру обработк - так лучше так как в реальности у меня будет где-то 200-300 датчиков и обрабатывать их надо однотипно.
Правда переменные приходится апать аж на 2 уровня.

У меня потом проблем с параллельным выполнением одной и той же процедуры над разными переменными не будет?

И ещё следом вопрос - что-то мне не хватает возможностей math из tcllib - как R забиндить в tcl не пойму - покажите пример, плиз...

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

> Правда переменные приходится апать аж на 2 уровня.

Может их в массив свести да в глобальный? проще выйдет? Trace можно поставить как на массив в целом, так и на отдельные элементы.

У меня потом проблем с параллельным выполнением одной и той же процедуры над разными переменными не будет?

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

anonymous
()
Ответ на: комментарий от anonymous

Может их в массив свести да в глобальный? проще выйдет? Trace можно поставить как на массив в целом, так и на отдельные элементы.

Переменных не так много, чтобы запутаться, хотя да - идея со списком хороша - его же здесь можно сделать именованным. А что до уровней, то и код мал - пока хоршо отслеживаю уровни - если начну путаться, тогда сделаю глобальными...

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

Т.е. если истечет время after, код всё равно не начнёт выполняться если в это время всё ещё не завершена работа уже запущенной процедуры?

А что там с работой интерпритатора в несколько потоков - сложные ухищрения?

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

> Т.е. если истечет время after, код всё равно не начнёт выполняться если в это время всё ещё не завершена работа уже запущенной процедуры?

Не начнет, ибо один поток. After ставит в очередь обработки событий. Как только появится просвет, обработчики начнут выполняться в порядке очереди. Можно специально вызывать update для просвета.

А что там с работой интерпритатора в несколько потоков - сложные ухищрения?

С потоками как обычно - синхронизировать надо, shared variables заводить, нуевонах... Тут кстати где-то рядом топик на эту тему.

anonymous
()
Ответ на: комментарий от anonymous

Да, нашёл топик - спасибо огромное - там ссылка на отличное руководство по Tcl на русском. Супер!

Но вот ещё один нубский вопрос (я же сантехник, а не прогер) - как всё таки забиндить R?
Вот если мне нужен модуль math из tcllib, то я так и пишу:

package require math::statistics

А какие волшебные слова нужны для биндинга R?

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

> как всё таки забиндить R?

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

anonymous
()
Ответ на: комментарий от elipse

Версия 0.1 как-то настораживает...

С другой стороны, где-то слышал, что в R уже есть биндинг к Tcl, но вот что даёт >??Tcl:

Help files with alias or concept or title matching ‘Tcl’ using regular
expression matching:


Rcmdr::Rcmdr.Utilities
Rcmdr Utility Functions
Rcmdr::Rcmdr.sciviews-specific
Rcmdr SciViews-specific Functions
relimp::R.to.Tcl Convert a Character Vector to Tcl Format
relimp::Tcl.to.R Convert a Tcl List to R Character Vector
base::asNamespace Name Space Internals
graphics::par Set or Query Graphical Parameters
methods::completeSubclasses
Utilities for Managing Class Definitions
methods::removeClass Computations with Classes
methods::getClass Get Class Definition
methods::methods-defunct
Defunct Functions in the Methods Package
methods::promptClass Generate a Shell for Documentation of a Formal
Class
methods::setClass Create a Class Definition
methods::setClassUnion
Classes Defined as the Union of Other Classes
stats::NLSstClosestX Inverse Interpolation
tcltk::TclInterface Low-level Tcl/Tk Interface
tcltk::TkCommands Tk non-widget commands
tcltk::tclServiceMode Allow Tcl events to be serviced or not
tcltk::tcltk-defunct Defunct Functions in Package tcltk
tcltk::tcltk-package Tcl/Tk Interface
tcltk::tkStartGUI Tcl/Tk GUI startup


Type '?PKG::FOO' to inspect entry 'PKG::FOO TITLE'.

Здесь вроде всё как раз наоборот - биндинг Tcl к R.
Так же?

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от elipse

1. Разобраться
2. В R есть solve для решения СЛАУ. Понятно что и в Tcl можно решить, раз уж есть решение на OOo Basic, но всегда хочется большего.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

>но всегда хочется большего.

большего ?))
ну а так:
http://tcl-nap.sourceforge.net/
http://tcl-nap.sourceforge.net/nap_users_guide.pdf
cм. 5.5.7 Linear-algebra Functions

1. Разобраться


Образно так: нет биндинга Abiword к Оpenoffice.
Теоретически это возможно, а практически - не нужно.

elipse ★★★
()
Ответ на: комментарий от Suntechnic

> В R есть solve для решения СЛАУ

> всегда хочется большего

Тащить к своей программе целый R только для решения СЛАУ ??? Этож из курса средней школы ИМХО. Еще на сраном Б3-34 труЪ писали программы для решения систем с произвольным числом (ограничение было только из-за комариного ОЗУ) уравнений. Метод Гаусса-Жордана там. Делайте прямо на tcl. Если уравнений сотни, и/или будет тормозить, переписываем этот кусок на C и в виде .so подключаем к программе. Получится быстро и компактно без лишних зависимостей.

anonymous
()
Ответ на: комментарий от anonymous

Не даром «Разобраться» шло под номером 1 ;)
У меня уже есть решение полностью написанное на OOo Basic и не только Гаусса-Жордана, но и Крамера :).
Просто интересны сразу оба языка и я только-только изучаю их...

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Тогда стоит посмотреть биндинг версии 0.1 :) глянул, исходник там небольшой, всего в одном сишнике, если не заработает, можно будет допилить и продолжить развитие проекта :). Заодно прекрасная возможность разобраться.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.