OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 28 Апрель, 2024 11:06

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Воскресенье, 15 Ноябрь, 2009 23:33 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Код:
MODULE PrivTest;

   IMPORT Log := StdLog, TextModels;
   
   PROCEDURE Test3* ();
   VAR wrA,wrB: TextModels.Writer;
   BEGIN
      wrA := Log.text.NewWriter (wrA);
      wrB := Log.text.NewWriter (wrB);
      wrA.WriteChar ('A');
      wrB.WriteChar ('B');
      wrB.WriteChar ('B');
      wrA.WriteChar ('A');
      Log.Ln
   END Test3;

END PrivTest.

^Q PrivTest.Test3
У меня вместо "ABBA" получается "BABA", а если попробовать порядок "ABAB" то на выходе получим "BBAA".
Почему так? Это документированное поведение? Где оно описано?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 15 Ноябрь, 2009 23:36 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Параллельные процессы-нити?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 15 Ноябрь, 2009 23:38 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Валерий Лаптев писал(а):
Параллельные процессы-нити?
BlackBox 1.5.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 15 Ноябрь, 2009 23:48 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Assert поставить после каждого врайтера?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 15 Ноябрь, 2009 23:55 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Валерий Лаптев писал(а):
Assert поставить после каждого врайтера?
Что проверять в ASSERT'е?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 15 Ноябрь, 2009 23:59 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Ничего не проверять. Сначала безусловный после одного, потом - после двух.
Или вместо констант поставить переменные - как тогда сработает?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 00:08 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Валерий Лаптев писал(а):
Или вместо констант поставить переменные - как тогда сработает?
Точно так же сработает, проверял.
Валерий Лаптев писал(а):
Сначала безусловный после одного, потом - после двух.
Всё равно не понимаю, что там искать. Вот пример, который работает точно так же, хотя до вывода в журнал пишет в локальную TextModels.Model.
Код:
MODULE PrivTest;

   IMPORT Log := StdLog, TextModels;
   
   PROCEDURE Test3* ();
   VAR
      t: TextModels.Model;
      wrA,wrB: TextModels.Writer;
   BEGIN
      t := TextModels.dir.New ();
      wrA := t.NewWriter (wrA);
      wrB := t.NewWriter (wrB);
      wrA.WriteChar ('A');
      wrB.WriteChar ('B');
      wrB.WriteChar ('B');
      wrA.WriteChar ('A');
      Log.text.Append (t); (* BABA instead of ABBA *)
      Log.Ln;
      t := TextModels.dir.New ();
      wrA := t.NewWriter (wrA);
      wrB := t.NewWriter (wrB);
      wrA.WriteChar ('A');
      wrB.WriteChar ('B');
      wrA.WriteChar ('A');
      wrB.WriteChar ('B');
      Log.text.Append (t); (* BBAA instead of ABAB *)
      Log.Ln
   END Test3;

END PrivTest.

^Q PrivTest.Test3
Другими словами, дело не в журнале (Log) и какой-то параллельности записи него, а в устройстве самого TextModels.Model и особенностях его работы с TextModels.Writer. Вот только найти бы документацию по этим особенностям...


Последний раз редактировалось Александр Ильин Понедельник, 16 Ноябрь, 2009 00:09, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 00:09 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Всё просто. Курьеры wrA и wrB имеют собственные позиции для записи в текст. Происходит вот что:

Код:
wrA.WriteChar ('A');
wrB.WriteChar ('B');
wrB.WriteChar ('B');
wrA.WriteChar ('A');


Пусть исходная позиция в тексте = P.
1. В свою текущую позицию P1 курьер wrA пишет 'A'.
2. В свою текущую позицию P2 курьер wrB пишет 'B'. Поскольку P2 = P, то 'B' вписывается перед 'A'. Результат: 'BA';
3. Далее, курьер wrB снова пишет 'B'. Получается 'BBA';
4. Теперь курьер wrA пишет 'A' в свою позицию P1. Поскольку его позиция равна P+1, то символ записывается перед второй буквой, что приводит к результату 'BABA'.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 00:35 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Чёрт, пока ответ готовил, Иван сказал тоже самое. Только быстрее : )

Для наглядности вот:

BABA

Жирным помечены буквы, записанные второй раз.

А в программе можно посмотреть так:
Код:
wrA.WriteChar ('A'); Log.Char('[');Log.Int(wrA.Pos());Log.Int(wrB.Pos());Log.Char(']');Log.Ln();


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 00:38 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
То есть дело именно в том, что два разную врайтера...
Хотя пишут в один текст...
Интересно!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 01:25 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Это блэкбоксовский шаблон "Carrier-Rider-Mapper", см. Глава 3 "Приёмы проектирования".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 09:47 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Эт понятно...
Интересны следствия из такого положения... :)
Вот в С++, если связать две потоковые переменные с одним файлом - надо проверить.
1. Создаем пустой текстовый файл.
2. Потом начинаем туду писать двумя потоками.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 10:13 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1429
Можно и без потоков. Открываем два раза один файл.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 10:21 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Trurl писал(а):
Можно и без потоков. Открываем два раза один файл.

Потоки ввода-вывода. Должны быть две потоковых переменных, чтобы дважды открыть. Иначе будет вывод через один поток и все чисто последовательно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 10:23 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
К слову будет сказать, имя процедуры WriteChar следовало бы заменить на InsertChar, чтобы не вводило в заблуждение. А потом добавить новую процедуру WriteChar, которая писала бы поверх символа.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 10:34 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
А ещё есть мысли по поводу :)
Райтеры ничего не знают друг о друге и поэтому действуют несогласованно, что и привело к эффектам, продемонстрированным Александром.
В принципе можно сделать механизм, что-то типа менеджера курьеров, который регистрировал бы все вновь создаваемые курьеры, а затем автоматически корректировал бы позиции всех зарегистрированных курьеров, когда какой-нибудь райтер производит запись в текст.
Можно, конечно, не делать никаких менеджеров, а решать эту задачу всякий раз индивидуально. Каждый решает для себя сам.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 10:39 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
igor писал(а):
К слову будет сказать, имя процедуры WriteChar следовало бы заменить на InsertChar, чтобы не вводило в заблуждение. А потом добавить новую процедуру WriteChar, которая писала бы поверх символа.

igor писал(а):
В принципе можно сделать механизм, что-то типа менеджера курьеров, который регистрировал бы все вновь создаваемые курьеры, а затем автоматически корректировал бы позиции всех зарегистрированных курьеров, когда какой-нибудь райтер производит запись в текст...
имхо, не вижу смысла ни в том ни в другом.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 10:39 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Паттерн Посредник! Mediator


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 10:46 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Исходный вопрос
Александр Ильин писал(а):
Почему так? Это документированное поведение? Где оно описано?
Ответ
TextModels docu писал(а):
PROCEDURE (wr: Writer) WriteChar (ch: CHAR)
NEW, ABSTRACT, Operation
Write character with attributes wr.attr. Nothing happens if ch is not writeable (see procedure WriteableChar).

Post
WriteableChar(ch)
wr.Pos() = wr.Pos'() + 1
~WriteableChar(ch)
wr.Pos() = wr.Pos'()
Изменяется положение только данного писателя (про другие ничего). (viewtopic.php?p=38034#p38034). Смысл что-то поверх этого изобретать. Было бы реально нужно - уже бы сделали до нас (тексты с системы Оберон идут).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 16 Ноябрь, 2009 11:00 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Евгений Темиргалеев писал(а):
имхо, не вижу смысла ни в том ни в другом.
Не настаиваю! Как я уже сказал:
igor писал(а):
Каждый решает для себя сам.


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

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB