diff --git "a/doc/\320\241\320\277\320\270\321\201\320\272\320\270/\320\241\320\277\320\270\321\201\320\276\320\272.md" "b/doc/\320\241\320\277\320\270\321\201\320\272\320\270/\320\241\320\277\320\270\321\201\320\276\320\272.md" index 76cd03c..fead94c 100644 --- "a/doc/\320\241\320\277\320\270\321\201\320\272\320\270/\320\241\320\277\320\270\321\201\320\276\320\272.md" +++ "b/doc/\320\241\320\277\320\270\321\201\320\272\320\270/\320\241\320\277\320\270\321\201\320\276\320\272.md" @@ -101,7 +101,7 @@ // // Параметры: // Индекс - Число - Индекс устанавливаемого элемента -// Значение -Произвольный - Устанавливаемый элемент +// Значение - Произвольный - Устанавливаемый элемент // // Возвращаемое значение: // Произвольный - Значение которое было заменено diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\321\214\320\236\321\202\320\273\320\276\320\266\320\265\320\275\320\275\321\213\321\205.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\321\214\320\236\321\202\320\273\320\276\320\266\320\265\320\275\320\275\321\213\321\205.os" index dc51a27..e24eaf0 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\321\214\320\236\321\202\320\273\320\276\320\266\320\265\320\275\320\275\321\213\321\205.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\321\214\320\236\321\202\320\273\320\276\320\266\320\265\320\275\320\275\321\213\321\205.os" @@ -31,7 +31,7 @@ Функция ПроцессорКоллекции() Экспорт Возврат Очередь.ПроцессорКоллекции(); КонецФункции - + Функция Количество() Экспорт Возврат Очередь.Количество(); КонецФункции @@ -71,7 +71,7 @@ Блокировка.Разблокировать(); Исключение - + Блокировка.Разблокировать(); ВызватьИсключение; @@ -108,7 +108,7 @@ КонецЕсли; _ = Новый РефлекторОбъекта(Элемент) // BSLLS:UnusedLocalVariable-off - .РеализуетИнтерфейс(ИнтерфейсОтложенный, Истина); + .РеализуетИнтерфейс(ИнтерфейсОтложенный, Истина); Возврат Очередь.Положить(Элемент); КонецФункции @@ -131,24 +131,24 @@ КонецЕсли; Исключение - + Блокировка.Разблокировать(); ВызватьИсключение; - + КонецПопытки; - + Блокировка.Разблокировать(); - + Если ТекущаяУниверсальнаяДатаВМиллисекундах() >= Конец И Результат = Неопределено Тогда Результат = Опциональные.Пустой(); КонецЕсли; - Если Результат <> Неопределено Тогда + Если Результат <> Неопределено Тогда Возврат Результат; КонецЕсли; Приостановить(100); - + КонецЦикла; КонецФункции diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\237\321\200\320\270\320\276\321\200\320\270\321\202\320\265\321\202\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\237\321\200\320\270\320\276\321\200\320\270\321\202\320\265\321\202\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" index 92bf391..694f5c1 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\237\321\200\320\270\320\276\321\200\320\270\321\202\320\265\321\202\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\237\321\200\320\270\320\276\321\200\320\270\321\202\320\265\321\202\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" @@ -60,7 +60,7 @@ Функция ПроцессорКоллекции() Экспорт Возврат ПроцессорыКоллекций.ИзКоллекции(ВМассив()); КонецФункции - + Функция Количество() Экспорт Возврат Массив.Количество(); КонецФункции @@ -108,7 +108,7 @@ КонецПроцедуры Функция Удалить(Элемент) Экспорт - + Индекс = Массив.Найти(Элемент); Если Индекс <> Неопределено Тогда @@ -117,7 +117,7 @@ ОповеститьОбИзмененииКоллекции(); Возврат Истина; - + КонецЕсли; Возврат Ложь; @@ -156,7 +156,7 @@ Пока Итератор.ЕстьСледующий() Цикл Если Предикат.Выполнить(Итератор.Следующий()) Тогда - + Итератор.Удалить(); БылУдаленХотяБыОдинЭлемент = Истина; @@ -178,7 +178,7 @@ Пока Итератор.ЕстьСледующий() Цикл Если Не Коллекция.Содержит(Итератор.Следующий()) Тогда - + Итератор.Удалить(); БылУдаленХотяБыОдинЭлемент = Истина; @@ -200,8 +200,8 @@ Добавлен = Ложь; Для Индекс = 0 По Массив.ВГраница() Цикл - - Если Компаратор.Выполнить(Массив[Индекс], Элемент) < 0 Тогда + + Если Компаратор.Выполнить(Массив[Индекс], Элемент) > 0 Тогда Массив.Вставить(Индекс, Элемент); Добавлен = Истина; Прервать; @@ -222,21 +222,21 @@ Функция Взять() Экспорт Если Количество() > 0 Тогда - + Элемент = Массив[0]; Массив.Удалить(0); ОповеститьОбИзмененииКоллекции(); Возврат Новый Опциональный(Элемент); - + КонецЕсли; Возврат Опциональные.Пустой(); - + КонецФункции Процедура ОповеститьОбИзмененииКоллекции() - + Если ЕстьИтераторы Тогда ВызватьСобытие("КоллекцияМодифицирована", Новый Массив); КонецЕсли; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" index 2d2514b..7fe11eb 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\320\270/\320\236\321\207\320\265\321\200\320\265\320\264\320\270/\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" @@ -255,28 +255,41 @@ Блокировка.Разблокировать(); ВызватьИсключение; КонецПопытки; - + Блокировка.Разблокировать(); Возврат Результат; КонецФункции -Функция Взять() Экспорт +Функция Взять(Таймаут = 0) Экспорт - Блокировка.Заблокировать(); + Конец = ТекущаяУниверсальнаяДатаВМиллисекундах() + Таймаут; + Результат = Неопределено; + + Пока Истина Цикл + + Блокировка.Заблокировать(); + + Попытка + Результат = ВнутренняяОчередь.Взять(); + Исключение + Блокировка.Разблокировать(); + ВызватьИсключение; + КонецПопытки; - Попытка - Результат = ВнутренняяОчередь.Взять(); - Исключение Блокировка.Разблокировать(); - ВызватьИсключение; - КонецПопытки; - - Блокировка.Разблокировать(); - Возврат Результат; - + ВремяВышло = ТекущаяУниверсальнаяДатаВМиллисекундах() >= Конец; + + Если Результат.СодержитЗначение() Или ВремяВышло Тогда + Возврат Результат; + КонецЕсли; + + Приостановить(100); + + КонецЦикла; + КонецФункции Процедура ОбработкаПолученияПредставления(Представление, СтандартнаяОбработка) // BSLLS:UnusedLocalMethod-off @@ -290,7 +303,7 @@ &Обходимое &Реализует("Очередь") Процедура ПриСозданииОбъекта(Очередь) - + ВнутренняяОчередь = Очередь; Блокировка = Новый БлокировкаРесурса(ЭтотОбъект); diff --git "a/tests/\320\234\320\260\321\201\321\201\320\270\320\262\321\213.os" "b/tests/\320\234\320\260\321\201\321\201\320\270\320\262\321\213.os" index b9df48f..0d2057f 100644 --- "a/tests/\320\234\320\260\321\201\321\201\320\270\320\262\321\213.os" +++ "b/tests/\320\234\320\260\321\201\321\201\320\270\320\262\321\213.os" @@ -80,7 +80,7 @@ &Тест Процедура ИзЭлементов() Экспорт - + // Когда Результат = Массивы.ИзЭлементов( @@ -94,9 +94,9 @@ .ИмеетДлину(10); Для Сч = 1 По 9 Цикл - - Ожидаем.Что(Результат.Найти(Сч)).Не_().ЭтоНеопределено(); - + Ожидаем.Что(Результат[Сч - 1]).Равно(Сч); КонецЦикла; + Ожидаем.Что(Результат[9]).Равно(9); + КонецПроцедуры diff --git "a/tests/\320\237\321\200\320\270\320\276\321\200\320\270\321\202\320\265\321\202\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" "b/tests/\320\237\321\200\320\270\320\276\321\200\320\270\321\202\320\265\321\202\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" index a591493..f827ac5 100644 --- "a/tests/\320\237\321\200\320\270\320\276\321\200\320\270\321\202\320\265\321\202\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" +++ "b/tests/\320\237\321\200\320\270\320\276\321\200\320\270\321\202\320\265\321\202\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" @@ -389,9 +389,9 @@ // Дано Массив = Новый Массив; - Массив.Добавить(3); - Массив.Добавить(2); Массив.Добавить(1); + Массив.Добавить(2); + Массив.Добавить(5); ПриоритетнаяОчередь = Новый ПриоритетнаяОчередь; @@ -410,10 +410,10 @@ Ожидаем.Что(Результат).ЭтоИстина(); Ожидаем.Что(Массив).ИмеетДлину(4); - Ожидаем.Что(Массив[0]).Равно(4); - Ожидаем.Что(Массив[1]).Равно(3); - Ожидаем.Что(Массив[2]).Равно(2); - Ожидаем.Что(Массив[3]).Равно(1); + Ожидаем.Что(Массив[0]).Равно(1); + Ожидаем.Что(Массив[1]).Равно(2); + Ожидаем.Что(Массив[2]).Равно(4); + Ожидаем.Что(Массив[3]).Равно(5); КонецПроцедуры @@ -423,9 +423,9 @@ // Дано Массив = Новый Массив; - Массив.Добавить(1); Массив.Добавить(2); - Массив.Добавить(4); + Массив.Добавить(1); + Массив.Добавить(3); ПриоритетнаяОчередь = Новый ПриоритетнаяОчередь(КомпараторДействие()); @@ -436,16 +436,16 @@ ); // Когда - Результат = ПриоритетнаяОчередь.Добавить(3); + Результат = ПриоритетнаяОчередь.Добавить(4); // Тогда Ожидаем.Что(Результат).ЭтоИстина(); Ожидаем.Что(Массив).ИмеетДлину(4); - Ожидаем.Что(Массив[0]).Равно(1); - Ожидаем.Что(Массив[1]).Равно(3); - Ожидаем.Что(Массив[2]).Равно(2); - Ожидаем.Что(Массив[3]).Равно(4); + Ожидаем.Что(Массив[0]).Равно(2); + Ожидаем.Что(Массив[1]).Равно(4); + Ожидаем.Что(Массив[2]).Равно(1); + Ожидаем.Что(Массив[3]).Равно(3); КонецПроцедуры @@ -487,9 +487,9 @@ Массив = Рефлектор.ПолучитьСвойство(ПриоритетнаяОчередь, "Массив"); Ожидаем.Что(Массив).ИмеетДлину(3); - Ожидаем.Что(Массив[0]).Равно(3); + Ожидаем.Что(Массив[0]).Равно(1); Ожидаем.Что(Массив[1]).Равно(2); - Ожидаем.Что(Массив[2]).Равно(1); + Ожидаем.Что(Массив[2]).Равно(3); КонецПроцедуры @@ -1034,9 +1034,9 @@ // Дано Массив = Новый Массив; - Массив.Добавить(3); - Массив.Добавить(2); Массив.Добавить(1); + Массив.Добавить(2); + Массив.Добавить(4); ПриоритетнаяОчередь = Новый ПриоритетнаяОчередь; @@ -1048,17 +1048,17 @@ // Когда - Результат = ПриоритетнаяОчередь.Положить(4); + Результат = ПриоритетнаяОчередь.Положить(3); // Тогда - + Ожидаем.Что(Результат).ЭтоИстина(); Ожидаем.Что(Массив).ИмеетДлину(4); - Ожидаем.Что(Массив[0]).Равно(4); - Ожидаем.Что(Массив[1]).Равно(3); - Ожидаем.Что(Массив[2]).Равно(2); - Ожидаем.Что(Массив[3]).Равно(1); + Ожидаем.Что(Массив[0]).Равно(1); + Ожидаем.Что(Массив[1]).Равно(2); + Ожидаем.Что(Массив[2]).Равно(3); + Ожидаем.Что(Массив[3]).Равно(4); КонецПроцедуры @@ -1086,9 +1086,9 @@ // Дано Массив = Новый Массив; - Массив.Добавить(1); - Массив.Добавить(2); Массив.Добавить(3); + Массив.Добавить(2); + Массив.Добавить(1); ПриоритетнаяОчередь = Новый ПриоритетнаяОчередь(СравнениеЗначений.ОбратныйПорядок()); @@ -1106,11 +1106,11 @@ Ожидаем.Что(Результат).ИмеетТип("Опциональный"); Ожидаем.Что(Результат.Пустой()).ЭтоЛожь(); - Ожидаем.Что(Результат.Получить()).Равно(1); + Ожидаем.Что(Результат.Получить()).Равно(3); Ожидаем.Что(Массив).ИмеетДлину(2); Ожидаем.Что(Массив[0]).Равно(2); - Ожидаем.Что(Массив[1]).Равно(3); + Ожидаем.Что(Массив[1]).Равно(1); КонецПроцедуры @@ -1128,14 +1128,14 @@ КонецПроцедуры Функция Компаратор(Первый, Второй) Экспорт - + Если Первый % 2 > Второй % 2 Тогда Возврат 1; ИначеЕсли Первый % 2 = Второй % 2 Тогда Возврат 0; Иначе Возврат -1; - КонецЕсли; + КонецЕсли; КонецФункции diff --git "a/tests/\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" "b/tests/\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" index 0f3823d..6036e95 100644 --- "a/tests/\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" +++ "b/tests/\320\241\320\270\320\275\321\205\321\200\320\276\320\275\320\270\320\267\320\270\321\200\320\276\320\262\320\260\320\275\320\275\320\260\321\217\320\236\321\207\320\265\321\200\320\265\320\264\321\214.os" @@ -608,6 +608,39 @@ КонецПроцедуры +&Тест +Процедура ВзятьСОжиданием() Экспорт + + // Дано + + ОчередьФикстура = ФикстураВзять(); + ПроверяемаяКоллекция = Новый СинхронизированнаяОчередь(ОчередьФикстура); + + // Когда + + Начало = ТекущаяУниверсальнаяДатаВМиллисекундах(); + + Результаты = ТестМодуль.ВыполнитьВПятьПотоков( + ПроверяемаяКоллекция, + "Взять", + 350 + ); + + Конец = ТекущаяУниверсальнаяДатаВМиллисекундах(); + + // Тогда + + Ожидаем.Что(Результаты).ИмеетДлину(5); + Ожидаем.Что(Конец - Начало).БольшеИлиРавно(350); + Ожидаем.Что(ОчередьФикстура.ВызванМетодВзятьРаз).Равно(25); + + Для каждого Результат Из Результаты Цикл + Ожидаем.Что(Результат).ИмеетТип("Опциональный"); + Ожидаем.Что(Результат.Пустой()).ЭтоИстина(); + КонецЦикла; + +КонецПроцедуры + &Тест Процедура ОбходитсяЦикломДляКаждого() Экспорт @@ -654,4 +687,24 @@ ПроверяемоеЧисло = ПроверяемоеЧисло + Элемент; КонецПроцедуры +Функция ФикстураВзять() + + ПолеВызванМетодВзятьРаз = Новый Поле("ВызванМетодВзятьРаз").Публичное().ЗначениеПоУмолчанию(0); + + МетодВзять = Новый Метод("Взять") + .Публичный() + .ТелоМетода(" + | ВызванМетодВзятьРаз = ВызванМетодВзятьРаз + 1; + | Возврат Опциональные.Пустой();" + ); + + Результат = Новый ПостроительДекоратора() + .Поле(ПолеВызванМетодВзятьРаз) + .Метод(МетодВзять) + .Построить(); + + Возврат Результат; + +КонецФункции + Рефлектор = Новый Рефлектор(); diff --git "a/tests/\320\242\320\265\321\201\321\202\320\234\320\276\320\264\321\203\320\273\321\214/\320\242\320\265\321\201\321\202\320\234\320\276\320\264\321\203\320\273\321\214.os" "b/tests/\320\242\320\265\321\201\321\202\320\234\320\276\320\264\321\203\320\273\321\214/\320\242\320\265\321\201\321\202\320\234\320\276\320\264\321\203\320\273\321\214.os" index 089a1bb..1c2df8f 100644 --- "a/tests/\320\242\320\265\321\201\321\202\320\234\320\276\320\264\321\203\320\273\321\214/\320\242\320\265\321\201\321\202\320\234\320\276\320\264\321\203\320\273\321\214.os" +++ "b/tests/\320\242\320\265\321\201\321\202\320\234\320\276\320\264\321\203\320\273\321\214/\320\242\320\265\321\201\321\202\320\234\320\276\320\264\321\203\320\273\321\214.os" @@ -65,9 +65,13 @@ ФоновыеЗадания.ОжидатьЗавершенияЗадач(); Исключение - ВызватьИсключение ПодробноеПредставлениеОшибки( - ИнформацияОбОшибке().Параметры[0].ИнформацияОбОшибке - ); + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Сообщить(ТипЗнч(ИнформацияОбОшибке)); + Если ИнформацияОбОшибке.Параметры <> Неопределено И ИнформацияОбОшибке.Параметры.Количество() > 0 Тогда + ИнформацияОбОшибке = ИнформацияОбОшибке.Параметры[0].ИнформацияОбОшибке; + КонецЕсли; + + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки;