Если про компонент написано, что точки ## расцениваются как зарезервированные, то правильно было бы выполнить это требование. Не зависимо от того, понадобятся они когда нибудь или нет.
Этот топик читают: Гость
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
карма: 27 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Ситуация очень простая:
Если есть примеры (с подключением обработчика события), в которых некий Self работает, а некий EventHandle - нет (при параллельной работе экземпляров мультика), то контр аргументация этого топика имеет под собой объективное содержание. так вот - таких примеров нет. Вывод, который я вынужден из этого сделать (правда, несколько контекстный) - здесь проблемы с пониманием разницы между ООП и структурным программированием. |
|||
карма: 9 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
А всетаки что уже сейчас будет не верно работать при использование Thread в MultiElementEx?
|
|||
карма: 27 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Ну я не знаю уже как объяснять...
Любая точка элемента, меняющая свои внутренние поля, не может вызываться из параллельных потоков. Как и не может "кольцеваться" Ну не будет такое корректно работать:
Начнем с самого начала... В структурном программировании все переменные: либо локальные, либо аргументы - расположены в кадре стека. Поэтому, как при рекурсивном вызове, так и при работе параллельных потоков - конфликта данных нет - это разные кадры стека. В ООП нет понятия ф-ии - есть методы объекта. И все - конфликты данных будут. Если методы изменяют и пользуются полями объекта. И вовсе не тупик это - просто, для отсутствия конфликта, надо использовать методы разных объектов. И, следовательно , то, что в структурном программировании делалось автоматически (новый экземпляр данных), в ООП переложено на программиста - заводить новые экземпляры объекта, или синхронизировать потоки. И переложено - авторами ООП. И я во всем этом не виноват - просто логически анализирую происходящее. И логически анализируя, делаю выводы, что рекурсия в ООП - это: а) создать объект б) вызвать метод объекта с) уничтожить при необходимости. ((Что успешно делает режим OnlyOnce.)) Сколько не пытался объяснить - не помогает: вместо возможности линка на верхний уровень, мы совершенствуем технологию "кольцевания" То же самое про параллельные потоки - синхронизация потоков переложена на программиста. И такая схема уже будет работать без проблем
Вот это работать не будет: code_379 А, если синхронизировать потоки - будет: code_380 |
|||
карма: 9 |
| ||
файлы: 2 | code_379.txt [1KB] [550], code_380.txt [1.1KB] [582] |
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
Так я же конкретно про MultiElementEx спрашивал. Выходит, что сам по себе он на данный момент не содержит ошибок как при однопоточной так и многопоточной схеме.
А вот такая схема:
вообще соблязняет идея сделать некоторый подтип точек ##MT_XXX, которые для событий и данных возвращали бы в поток Self текущей схемы вместе с данными через точку, а для методов и св-тв наоборот принимали бы Self из потока(так же вместе с данными) и миную всякие ##Select сразу же вызывали бы точки нужного экземпляра схемы. При таком подходе работа могла бы выглядеть так:
|
|||
карма: 27 |
|
Ответов: 9906
Рейтинг: 351
|
|||
1) Содержит или не содержит ошибки конкретно MultiElementEx, зависит от понимания, что есть ошибка. И проблема, как раз, в неодинаковости этого понимания.
Для ЛЮБОГО элемента 2) Это не проблема схемы - а проблема элемента ProcessMessage. Который является инструментом рекурсивного вызова. Того самого, без генерации новых экземпляров объектов. Фактически - это то же самое "не визуализированное кольцевание" И может уронить не только эту схему. Модальные формы еще таким качеством обладают. 3) Меня не привлекает. И не будет привлекать до тех пор, пока MT-техника не приобретет достаточную степень надежности. Там сегодня есть проблемы. Поэтому, сегодня возводить надстройки, без укрепления фундамента - не стал бы. Плохим фактором является безусловное изменение структуры входных/выходных данных, по сравнении с инлайнингом мультика. Если не безусловное, а опциональное, тогда необходимо: 1) Индекс/хэндл схемы должен добавляться не в "хвост", а в "голову". Которые снимаются в MultiElementEx, еще до EditMulti 2) Должны быть специальные типы данных (MultiHandle, MultiIndex) для них - по ним и определяется необходимость индексирования/отсечения данных. Обеспечивая возможность стандартного режима работы. 3) Можно принимать индекс/хендл с верхней точки с зарезервированным именем. С приоритетом, аналогичным стандартному 4) И принимать хэндл события удобней с нижней точки, чем с MT (который может там конечно, и быть, но опять - в "голове", а не в "хвосте" ). Потому что элемент Memory ничуть не корректнее к параллельным потокам, чем поле MultiElementEx.EvHandle - а схемной мороки побольше будет. 5) Self вещь нужная, независимо от темы этого топика. Но, устроен он должен быть совсем по-другому. Это должен быть объект похожий на элемент, но с уникальными св-ми. Он должен воплощать в себе беспроблемность вызова методом класса ЛЮБОГО метода данного класса. Т.е., он должен иметь комплект скрытых точек, полностью совпадающий со списками EditMultiEx. Ну, возможно, несколько специальных.... [size=-2]------ Добавлено в 22:06 А вот подать на ##Add данные для внешних св-в в виде MT-списка - было бы дело .......... И реализовать это CodeGen-ом в конструкторе схемы... В одном загвоздка - СРЕДА не сообщает в CodeGen о том, какое св-во внешнее, а какое нет Надо бы придумать такой интерфейсный метод с префиксом sdk ... |
|||
карма: 9 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
5) не понятно только как его лучше всего сделать.
|
|||
карма: 27 |
|
Ответов: 2125
Рейтинг: 159
|
|||
Вот, кстати, по поводу Self и SelfIndex, я сделал у себя в CodeGen в процедуре codePoint такие изменения: code_399
Для CI_MultiElement не было особой необходимости делать проверку типа точки, но я думаю - так более логично. Соответственно добавил в hiEditMultiEx
|
|||
карма: 1 |
| ||
файлы: 1 | code_399.txt [882B] [434] |
Ответов: 9906
Рейтинг: 351
|
|||
Да не вопрос, что едиобразие лучше, чем отсутствие такового.
Вот только мне представляется, что более единообразным был бы второй парсинг MultiElementEx, а не EditMulti. Внешние данные подходящие снаружи более понятны, ИМХО Чем данные, принимаемые с "потолка" Ну и наконец, посмотрим на получившееся:
|
|||
карма: 9 |
|
Ответов: 2125
Рейтинг: 159
|
|||
И чего проще ? А делать EventHandle так, чтобы он для каждого Thread-a выбирался свой - проще? Не, ну можно конечно завести список EventHandle (на каждый Thread), в принципе - не такая уж и проблема. |
|||
карма: 1 |
|
Ответов: 9906
Рейтинг: 351
|
|||
А не надо этого делать.
И не надо не синхронизированными Thread-ами запускать один и тот же элемент, имеющий внутренние поля. Memory к примеру. Или есть варианты использования Self-техники без этого Не надо - это если хочешь чтобы оно (независимо от моих доработок) работало. И откуда такая уверенность, что Self "сверху" позволит это делать. НЕ ПОЗВОЛИТ. Еще раз : это не я придумал (читай выше). Необходимость создания нового экземпляра класса для рекурсивного (кстати, моя-то схема устойчива к рекурсиям), или меж поточного вызова - переложена на плечи программиста создателями ООП. [size=-2]------ Добавлено в 17:19 tsdima писал(а): Не, ну можно конечно завести список EventHandle (на каждый Thread), в принципе - не такая уж и проблемаНо не нужно. Потому что это не решит ни одного вопроса много поточности. [size=-2]------ Добавлено в 17:42 Ну для наведения полной ясности, можно поступить так: я выкладываю много поточную задачечку и реализую ее по своему. И, чтобы работало - буду вынужден синхронизировать потоки А ты ПОПРОБУЕШЬ рассказать, как это же самое сделать в Self-технике без синхронизации А |
|||
карма: 9 |
|
Ответов: 2125
Рейтинг: 159
|
|||
я выкладываю много поточную задачечку Многопоточные задачи - это отдельная песня. Я же просто, так как уже сталкивался с необходимостью запоминать свой собственный индекс внутри мультика в Memory, хочу упростить этот процесс. Вот и всё. Зачем хранить в дополнительной переменной то, что уже может быть доступно.
Вот кстати, по поводу:
|
|||
карма: 1 |
|
Ответов: 9906
Рейтинг: 351
|
|||
tsdima писал(а): Зачем хранить в дополнительной переменной то, что уже может быть доступноХраню, потому что он мне нужен снаружи, а не изнутри. И чтобы иметь для этого нулевой расход элементной базы. И имею. Затратами в три команды проца. Очень быстрых команды. Я ведь тоже сталкивался, и тоже хочу упростить tsdima писал(а): Что будет, если в процессе обработки _hi_onEvent тот мультик, что был сохранён в Х, будет уничтожен? Правильно - Runtime error ...А без этого, что, блин, не было Когда событие уничтожает своего прародителя. Вот писал же выше: btw: я иного способа уничтожить самого себя, иначе как через таймер (PostMessage - по большому счету) и не придумал пока |
|||
карма: 9 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
Что будет, если в процессе обработки _hi_onEvent тот мультик, что был сохранён в Х, будет уничтожен? Правильно - Runtime error ...
Когда событие уничтожает своего прародителя.
насколько я понял задачу, то тут ни о каком уничтожение самого себя речи не идет. В X мы сохраняем указатель на вообще говоря любую схему внутри контейнера. А значит, к примеру, _hi_onEvent, который удалит все схемы кроме себя самого и вызовет Runtime error. а значит после
|
|||
карма: 27 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Dilma писал(а): Self и SelfIndex это 0 команд проца для тех, кому эта ф-ность не нужна и в поминеА сколько затрат для тех кому нужна Ну не виноват я, что Self нужен "снаружи". А "внутри" нужны, скорее, его поля.... Абстрактный, но конкретный пример: code_405 А теперь зададимся вопросом: сколько элементов добавится в Self-технике А теперь пусть таких выходных событий штуки 4 (у меня сегодня так, скажем)... Dilma писал(а): А значит, к примеру, _hi_onEvent, который удалит все схемы кроме себя самого и вызовет Runtime errorИ Run Time Error будет независимо от использования EvHandle. Следовательно, проверка X на валидность - бессмысленной становится. Осмыссленным остается вопрос, как в Delete определить "занятость" схемы. И это опять не очень зависит от evHandle-фичи.... Но вопрос конечно же |
|||
карма: 9 |
| ||
файлы: 1 | code_405.txt [1.5KB] [411] |