Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 14:39

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 43 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пт янв 23, 2009 20:56 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ygrek писал(а):
Очевидно, затем что callback может вызываться из потока не проинициализированного форт-системой и соответственно использовать USER нельзя будет

это мне не совсем понятно. Как может Callback вызываться не из форт-потока? (если спф внутрях длл? так он это не особо и позволяет-то!)

ygrek писал(а):
Если же надо использовать USER-область какого-то конкретного потока - передайте и установите в callback нужный TlsIndex. Смотрите примеры в devel.

вообще не понятно. То есть, ведь всегда известно, какой поток "регистрирует" callback ! и наверняка обрабатывать будет он же (ну в большинстве случаев оно быть так должно). А это значит, что формовать код Callback имеет смысл в момент его регистрации, и связывать с вызвавшим потоком.

ygrek писал(а):
Если callback гарантированно будет вызывается в контексте потока созданного форт-системой, то инициализацию USER-области можно не проводить -- используя облегчённую реализацию CALLBACK: -- ~af/lib/QuickWNDPROC.f

ну, там код спорный. мне не понравился.
к тому же почему в ядре именно тяжелое решение, которое (неужели так часто надо именно тяжелое?) было бы логичнее расположить во внешней либе, а не в ядре.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 24, 2009 15:25 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
это мне не совсем понятно. Как может Callback вызываться не из форт-потока?

callback это адрес который вы передаёт внешнему коду. Внешний код може делать с этим адресом что угодно :
- вызывать в том же потоке откуда его установил форт-код
- вызывать его из другого потока
- вызывать его из нескольких потоков сериализуя вызов (callback'и выполняются по-очереди, но в разных потоках)
- вызывать его из нескольких потоков конкуретно - т.е. несколько callback'ов может выполняться одновременно в нескольких потоках
- во время выполнения внешней функции вызванной из callback генерировать ещё один вызов callback'а (рекурсивно)

mOleg писал(а):
То есть, ведь всегда известно, какой поток "регистрирует" callback ! и наверняка обрабатывать будет он же (ну в большинстве случаев оно быть так должно).

Хорошие принципы написания кода : "наверняка" и в "большинстве случаев".

mOleg писал(а):
ну, там код спорный. мне не понравился.

Вы используете код по принципу нравится/не нравится? А я по принципу работает/не работает.
Только перед тем как исправлять работающее -- разберитесь сначала в существе проблемы.

mOleg писал(а):
к тому же почему в ядре именно тяжелое решение, которое (неужели так часто надо именно тяжелое?) было бы логичнее расположить во внешней либе, а не в ядре.

Вопросы "почему в ядре так" -- в spf-dev.
Моё мнение : потому что это работает. Когда же появляются проблемы скорости - тогда они и решаются. А вариант по умолчанию работает для всех "из коробки". Я лично ещё ни разу не наблюдал проблем скорости при использовании CALLBACK:, а вы? А вывод профайлера покажете?

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс янв 25, 2009 20:47 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ygrek писал(а):
mOleg писал(а):это мне не совсем понятно. Как может Callback вызываться не из форт-потока?

callback это адрес который вы передаёт внешнему коду. Внешний код може делать с этим адресом что угодно :
- вызывать в том же потоке откуда его установил форт-код
- вызывать его из другого потока
- вызывать его из нескольких потоков сериализуя вызов (callback'и выполняются по-очереди, но в разных потоках)
- вызывать его из нескольких потоков конкуретно - т.е. несколько callback'ов может выполняться одновременно в нескольких потоках
- во время выполнения внешней функции вызванной из callback генерировать ещё один вызов callback'а (рекурсивно)

не подскажете, где об этом можно почитать? (я нагуглить ответы на свои вопросы пока не смог 8( )
я так понимаю, что callback вызов всегда отрабатывается внутри установившего его процесса по крайней мере в АДРЕСНОМ ПРОСТРАНСТВЕ ПРОЦЕССА (не обязательно? потока хотя в винде они практически не различимы-то) "подписавшегося" на callback?
Второй вопрос при callback вызове чья TEB (TIB) активна (можно и поэкспериментировать, но хочется почитать)

ygrek писал(а):
mOleg писал(а):То есть, ведь всегда известно, какой поток "регистрирует" callback ! и наверняка обрабатывать будет он же (ну в большинстве случаев оно быть так должно).
Хорошие принципы написания кода : "наверняка" и в "большинстве случаев".

вполне нормальные. Как раз перестраховываться на все случаи ненормально.

ygrek писал(а):
mOleg писал(а):ну, там код спорный. мне не понравился.
Вы используете код по принципу нравится/не нравится? А я по принципу работает/не работает.
Только перед тем как исправлять работающее -- разберитесь сначала в существе проблемы.

а я и не исправляю рабочие, я вопросы задаю и пытаюсь разобраться.
а принцип нравится\ненравится фундаментален, раз не нравится, значит есть вопросы, либо понимание\ощущение возможной скрытой ошибки\проблемы.

ygrek писал(а):
Я лично ещё ни разу не наблюдал проблем скорости при использовании CALLBACK:, а вы? А вывод профайлера покажете?

мне лично до сих пор ни разу небыли нужны callback (небыло необходимости).

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 26, 2009 01:35 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
не подскажете, где об этом можно почитать?

О чём тут читать? Callback это обычный адрес. Чужой код передаёт управление на этот адрес. Естественно адрес имеет смысл только в пределах одного адресного пространства. Условия в которых будет выполняться callback определяет вызывающий код.
mOleg писал(а):
Второй вопрос при callback вызове чья TEB (TIB) активна

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

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 26, 2009 19:47 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ygrek писал(а):
mOleg писал(а):не подскажете, где об этом можно почитать?
О чём тут читать? Callback это обычный адрес. Чужой код передаёт управление на этот адрес. Естественно адрес имеет смысл только в пределах одного адресного пространства. Условия в которых будет выполняться callback определяет вызывающий код.

в том то и дело, что в пределах одного адресного пространства, причем пространства не вызывающего, а вызываемого, то есть того, кто "подписан" на callback. И я тогда не понимаю, почему надо создавать новую USER область и стек.

ygrek писал(а):
mOleg писал(а):Второй вопрос при callback вызове чья TEB (TIB) активна
Очевидно того потока который выполнил call.

не очевидно. совсем не очевидно. очевидно что будет TEB вызываемого потока, то есть того, который получает управления.

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

вот этого никак понять не могу.
"вызов из ниоткуда" - понятно, но ведь не вызов "в никуда", а скорее вызов в указанный процесс (или поток)
то есть я лично вижу только два варианта: система помнит, какой поток заказывал "разбудить утром", либо не помнит поток, но помнит процесс, то есть всегда отдает управление самому первому потоку, созданному при запуске программы. Так же может быть отличие при вызове callback в dll.
да, есть третий вариант, система каждый раз создает новый поток и в нем передает управление на указанный адрес, и только тогда понятно, зачем необходима инициализация всего!!!

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 31, 2009 01:46 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
в том то и дело, что в пределах одного адресного пространства, причем пространства не вызывающего, а вызываемого, то есть того, кто "подписан" на callback.

Какие ещё пространства вызывающего и вызываемого? Адресное пространство едино (для процесса).
mOleg писал(а):
И я тогда не понимаю, почему надо создавать новую USER область и стек.

Потому что вызывающий код может вызвать callback в потоке который он сам создал и в котором форт-система ни разу не инициализировалась. Даже если инициализировалась - как найти свою USER область? Регистр edi уже скорее всего затёрт вызывающим кодом. Можно использовать TLS, но это точно так же не спасает в случае вызова из не форт-потока.
mOleg писал(а):
очевидно что будет TEB вызываемого потока

Судя по формулировке вы считаете что вызываемый и вызывающий поток - это не один и тот же?
mOleg писал(а):
"вызов из ниоткуда" - понятно, но ведь не вызов "в никуда", а скорее вызов в указанный процесс (или поток)
то есть я лично вижу только два варианта: система помнит, какой поток заказывал "разбудить утром", либо не помнит поток, но помнит процесс, то есть всегда отдает управление самому первому потоку, созданному при запуске программы. Так же может быть отличие при вызове callback в dll.
да, есть третий вариант, система каждый раз создает новый поток и в нем передает управление на указанный адрес, и только тогда понятно, зачем необходима инициализация всего!!!

Жуть. Какая система? форт? или ОС? Кто запоминает поток (и процесс)?
Судя по формулировке вы считает что ОС регистрирует и выполняет callback вызовы?
ОС тут вообще ни при чём.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 31, 2009 01:59 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ygrek писал(а):
mOleg писал(а):в том то и дело, что в пределах одного адресного пространства, причем пространства не вызывающего, а вызываемого, то есть того, кто "подписан" на callback.
Какие ещё пространства вызывающего и вызываемого? Адресное пространство едино (для процесса).

не совсем верно. TEB область у каждого потока интимна.

ygrek писал(а):
mOleg писал(а):И я тогда не понимаю, почему надо создавать новую USER область и стек.
Потому что вызывающий код может вызвать callback в потоке который он сам создал и в котором форт-система ни разу не инициализировалась.

вот этого никак не могу понять.

ygrek писал(а):
Даже если инициализировалась - как найти свою USER область?

достаточно сохранять Tls в TEB, например в 0x14h

ygrek писал(а):
Регистр edi уже скорее всего затёрт вызывающим кодом. Можно использовать TLS, но это точно так же не спасает в случае вызова из не форт-потока.

опять же не понятно, потому как понял я, callback вызывается DispatchMessage из того потока, в котором оно обрабатывается.
опять же, как оказалось, callback вообще не обязательно поддерживать, если самостоятельно обрабатывать результат GetMessage, или фильтровать события перед DispatchMessage

ygrek писал(а):
Судя по формулировке вы считает что ОС регистрирует и выполняет callback вызовы?
ОС тут вообще ни при чём.

да, вы правы, я считал, что система вызвает callback с 0 кольца.
сейчас стало понятнее, спасибо за помощь

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 31, 2009 03:06 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
не совсем верно. TEB область у каждого потока интимна.

А TEB что -- не в памяти хранится?
mOleg писал(а):
достаточно сохранять Tls в TEB, например в 0x14h

Эквивалентно TLS, только менее надёжно и с той же проблемой.
mOleg писал(а):
опять же не понятно, потому как понял я, callback вызывается DispatchMessage из того потока, в котором оно обрабатывается.
опять же, как оказалось, callback вообще не обязательно поддерживать, если самостоятельно обрабатывать результат GetMessage, или фильтровать события перед DispatchMessage

Это полная чушь.
Я не знаю как вам ещё намекнуть -- ОС вообще не имеет к callback'ам никакого отношения. Забудьте про ОС -- считайте что код выполняется на голом процессоре.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 31, 2009 12:32 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
видимо надо рарзличть системные callback ОС от так называемого удаленного вызова функции-пользователя для изменения поведения алгоритма. Примером последней является функция быстрой сортировки взятая в С; там есть указатель на функцию сравнения и в коей-то мере, если сильно не вдаваться в терминологию на англицком, это тоже Callback-функция.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 31, 2009 22:04 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ygrek писал(а):
mOleg писал(а):не совсем верно. TEB область у каждого потока интимна.
А TEB что -- не в памяти хранится?

в другой памяти. В смысле в отдельном сегменте (хотя мапится и в DS тоже, но находится только через FS: )
то есть это другое адресное пространство, именно это я имел ввиду.

ygrek писал(а):
mOleg писал(а):достаточно сохранять Tls в TEB, например в 0x14h
Эквивалентно TLS, только менее надёжно и с той же проблемой.

почему менее надежно?
почему с той же проблемой?

ygrek писал(а):
mOleg писал(а):опять же не понятно, потому как понял я, callback вызывается DispatchMessage из того потока, в котором оно обрабатывается. опять же, как оказалось, callback вообще не обязательно поддерживать, если самостоятельно обрабатывать результат GetMessage, или фильтровать события перед DispatchMessage

Это полная чушь.

Я не знаю как вам ещё намекнуть -- ОС вообще не имеет к callback'ам никакого отношения. Забудьте про ОС -- считайте что код выполняется на голом процессоре.

?
я же сказал, что уже понял, что ОС к колбэкам отношения не имеет.
но колбэки не обязательны как вид (я так понял), то есть без них вообще можно обходиться.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 31, 2009 22:05 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Alexander писал(а):
видимо надо рарзличть системные callback ОС

а они таки есть?
я в том смысле, что есть ли callback вызовы с 0 кольца на 3 ??? Естественно в винде

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб янв 31, 2009 22:24 
Не в сети
Аватара пользователя

Зарегистрирован: Вт ноя 06, 2007 21:23
Сообщения: 227
Откуда: Екатеринбург
Благодарил (а): 4 раз.
Поблагодарили: 7 раз.
видимо надо уточнить что-то про APC (асинхронный вызов процедур) они вроде как почти в ядре. но доступны с 2000 винды только, но они уж очень капризные.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 04, 2009 21:31 
Не в сети

Зарегистрирован: Сб янв 24, 2009 10:06
Сообщения: 96
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
ygrek писал(а):
....TEB область у каждого потока интимна.

ygrek писал(а):
mOleg писал(а):И я тогда не понимаю, почему надо создавать новую USER область и стек.

вот этого никак не могу понять.

ygrek писал(а):
Даже если инициализировалась - как найти свою USER область?

сейчас стало понятнее....

Проходя по темам Форума, попал сюда. Читаю «тему», а вижу …. Поэтому пишу в эту «тему».
Не знаю я «пользовательских» переменных, извините.
Знаю я о глобальных и локальных переменных, знаю о константах, стеке и фреймах в нем, знаю о параметрах процедур, которые передаются либо по вызову, либо по значению, знаю о байтах, битах и знаю даже, что где-то есть структурированные данные и пр…..
Всем этим пользуюсь, поэтому для меня это! пользовательские переменные. А у вас?
Случайный прохожий написал.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 04, 2009 21:33 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
architector писал(а):
Не знаю я «пользовательских» переменных, извините.

ну, вы ведь и форта пока не знаете (или я ошибаюcь?)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 05, 2009 04:29 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
architector писал(а):
Не знаю я «пользовательских» переменных, извините.

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

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 43 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB