From b22e30c99d2db8b74162fc6fc9ef940c17f60e6e Mon Sep 17 00:00:00 2001 From: aapolkovsky Date: Wed, 23 Nov 2016 01:23:22 +0300 Subject: [PATCH] some fixes --- translated/boost.signals2.md | 46 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/translated/boost.signals2.md b/translated/boost.signals2.md index d54fcba..f526cb8 100644 --- a/translated/boost.signals2.md +++ b/translated/boost.signals2.md @@ -8,7 +8,7 @@ [Boost.Signals2](http://www.boost.org/libs/signals2) реализует концепцию "сигнал/слот". Одна или несколько функций под названием *слоты* связаны с объектом, который может "посылать" сигнал. Каждый раз, когда посылается сигнал, связанные с ним функции будут вызваны. -Концепция "сигнал/слот" может быть полезна, например, при разработке приложений с графическим интерфейсом. Кнопки могут быть сделаны так, чтобы посылать сингнал, когда пользователь нажимает на них. Они могут поддерживать связи сразу с несколькими функциями для обработки пользовательского ввода. Таким образом становится возможно гибко обрабатывать события. +Концепция "сигнал/слот" может быть полезна, например, при разработке приложений с графическим интерфейсом. Кнопки могут быть сделаны так, чтобы посылать сигнал, когда пользователь нажимает на них. Они могут поддерживать связи сразу с несколькими функциями для обработки пользовательского ввода. Таким образом становится возможно гибко обрабатывать события. Класс `std::function` так же может быть использован для обработки событий. Важное различие между `std::function` и Boost.Signals2 состоит в том, что Boost.Signals2 позволяет связать более одного обработчика с одним событием. Поэтому, библиотека Boost.Signals2 лучше для событийно-ориентированной разработки и должна быть в приоритете, в случае, если необходимо обрабатывать события. @@ -17,9 +17,9 @@ Boost.Signals2 сменяет библиотеку Boost.Signals, которая ## Сигналы -Boost.Signals2 предостовляет класс `boost::signals2::signal`, который используется для создания сигналов. Этот класс определен в файле `boost/signals2/signal.hpp`. Также, вы можете использовать главный заголовочный файл `boost/signals2.hpp`, в котором определены все классы и функции библиотеки Boost.Signals2. +Boost.Signals2 предоставляет класс `boost::signals2::signal`, который используется для создания сигналов. Этот класс определен в файле `boost/signals2/signal.hpp`. Также, вы можете использовать главный заголовочный файл `boost/signals2.hpp`, в котором определены все классы и функции библиотеки Boost.Signals2. -Boost.Signals2 определяет `boost::signals2::signal` и другие классы, так же как и все функции, в пространстве имен `boost::signals2`. +Boost.Signals2 определяет `boost::signals2::signal` и другие классы, так же, как и все функции, в пространстве имен `boost::signals2`. ### Пример 67.1. “Hello, world!” с использованием boost::signals2::signal @@ -42,7 +42,7 @@ int main() Лямбда-функция связывается с сигналом **s** с помощью функции `connect()`. Так как лямбда-функция удовлетворяет требуемой сигнатуре `void()`, связывание произошло успешно. Лямбда-функция будет вызвана всякий раз, когда сработает сигнал **s**. -Сигнал посылается с помощью вызова **s** как обычной функции. Сигнатура этой функции совпадает с той, которая была передана в качестве шаблонного параметра. Скобки пусты потому, что `void()` не принимает никаких аргументов. Вызов **s** приводит к срабатыванию сигнала, что в свою очередь вызывает лямбда-функцию, которая была ранее связана с помошью `connect()`. +Сигнал посылается с помощью вызова **s** как обычной функции. Сигнатура этой функции совпадает с той, которая была передана в качестве шаблонного параметра. Скобки пусты потому, что `void()` не принимает никаких аргументов. Вызов **s** приводит к срабатыванию сигнала, что в свою очередь вызывает лямбда-функцию, которая была ранее связана с помощью `connect()`. [Пример 67.1](#ex.signals2_01) так же может быть реализован с помощью `std::function`, так как показано в [Примере 67.2](#ex.signals2_02). @@ -81,7 +81,7 @@ int main() } ``` -`boost::signals2::signal` позволяет связать несколько функций с отдельным сигналом с помощью многократных вызовов `connect()`. Каждый раз, когда срабатывает сигнал, функции будут вызваны в том порядке, в котором они были связвны с помощью `connect()`. +`boost::signals2::signal` позволяет связать несколько функций с отдельным сигналом с помощью многократных вызовов `connect()`. Каждый раз, когда срабатывает сигнал, функции будут вызваны в том порядке, в котором они были связаны с помощью `connect()`. Так же, порядок может быть определен явно с помощью перегруженной функции `connect()`, которая принимает значение типа `int` в качестве дополнительного аргумента ([Пример 67.4](#ex.signals2_04)). @@ -129,7 +129,7 @@ int main() } ``` -[Пример 67.5](#ex.signals2_05) выведетна экран только `Hello`, потому что связь с `world()` была разорвана до того как сигнал был послан. +[Пример 67.5](#ex.signals2_05) выведет на экран только `Hello`, потому что связь с `world()` была разорвана до того как сигнал был послан. Помимо `connect()` и `disconnect()`, `boost::signals2::signal` предлагает ещё несколько функций (см. [Пример 67.6](#ex.signals2_06)). @@ -154,7 +154,7 @@ int main() } ``` -`num_slots()` возвращает число связанных функций. Если связанных функций нет, то `num_slots()` возвращает 0. `empty()` сообщит вам, связаны ли с сигналом обработчики событий или нет . А функция `disconnect_all_slots()` делает именно то, что говорит её имя: она разрывает все существующие связи. +`num_slots()` возвращает число связанных функций. Если связанных функций нет, то `num_slots()` возвращает 0. `empty()` сообщит вам, связаны ли с сигналом обработчики событий или нет. А функция `disconnect_all_slots()` делает именно то, что говорит её имя: она разрывает все существующие связи. ### Пример 67.7. Обработка возвращаемых значений обработчиков событий @@ -178,7 +178,7 @@ int main() [Пример 67.7](#ex.signals2_07) выведет `2` в стандартный поток вывода. Оба возвращаемых значения были правильно приняты сигналом **s**, но все, кроме последнего, были проигнорированы. По умолчанию, возвращается только последнее возвращаемое значение всех связанных функций. -Обратите внимание, что `s()` не возвращает результат последней вызванной функции напрямую. Возвращается объект типа `boost::optional`, который при разименовывании возвращает число 2. Посланый сигнал, который не связан с какой-либо функцией, не возвращает никакого значения. Таким образом, в данном случае, `boost::optional` позволяет Boost.Signals2 вернуть пустой объект. С классом `boost::optional` мы познакомились в [Главе 21][chapter21]. +Обратите внимание, что `s()` не возвращает результат последней вызванной функции напрямую. Возвращается объект типа `boost::optional`, который при разыменовывании возвращает число 2. Посланный сигнал, который не связан с какой-либо функцией, не возвращает никакого значения. Таким образом, в данном случае, `boost::optional` позволяет Boost.Signals2 вернуть пустой объект. С классом `boost::optional` мы познакомились в [Главе 21][chapter21]. Можно настроить сигнал таким образом, что каждое возвращаемое значение будет соответствующим образом обработано. Чтобы сделать это, необходимо передать *объединитель* (combiner) в `boost::signals2::signal` в качестве второго шаблонного параметра. @@ -215,15 +215,15 @@ int main() } ``` -Объединитель - это класс с перегруженным оператором `operator()`. Этот оператор будет автоматически вызван с двумя итераторами в качестве аргументов, которые используются для доступа к функциям, связанным с определенным сигналом. При разименовывании итераторов, происходит вызов соответствующих функций, и их возвращаемые значения становятся доступны в объединителе. В дальнейщем, обычный алгоритм из стандартной библиотеки, такой как `std::min_element()` может быть использован для расчета и возврата наименьшего значения (см. [Пример 67.8](#ex.signals2_08)). +Объединитель - это класс с перегруженным оператором `operator()`. Этот оператор будет автоматически вызван с двумя итераторами в качестве аргументов, которые используются для доступа к функциям, связанным с определенным сигналом. При разыменовывании итераторов, происходит вызов соответствующих функций, и их возвращаемые значения становятся доступны в объединителе. В дальнейшем, обычный алгоритм из стандартной библиотеки, такой как `std::min_element()` может быть использован для расчета и возврата наименьшего значения (см. [Пример 67.8](#ex.signals2_08)). -`boost::signals2::signal` использует `boost::signals2::optional_last_value` как объединитель поумолчанию. Этот объединитель возвращает объект типа `boost::optional`. Пользователь может определить объединитель с возвращаемым значением любого типа. Например, объединитель `min_element` в [Примере 67.8](#ex.signals2_08) возвращает значение такого же типа, который был передан в качестве шаблоного параметра в `min_element`. +`boost::signals2::signal` использует `boost::signals2::optional_last_value` как объединитель по умолчанию. Этот объединитель возвращает объект типа `boost::optional`. Пользователь может определить объединитель с возвращаемым значением любого типа. Например, объединитель `min_element` в [Примере 67.8](#ex.signals2_08) возвращает значение такого же типа, который был передан в качестве шаблонного параметра в `min_element`. -Невозможно передать такой алгоритм, как `std::min_element()` в качестве шаблонного параметра напямую в `boost::signals2::signal`. `boost::signals2::signal` ожидает, что в объединителе обявлен тип `result_type`, который указывает тип возвращаемого значения оператора `operator()`. Так как этот тип не определен в стандартных алгоритмах, компилятор выдаст сообщение об ошибке. +Невозможно передать такой алгоритм, как `std::min_element()` в качестве шаблонного параметра напрямую в `boost::signals2::signal`. `boost::signals2::signal` ожидает, что в объединителе объявлен тип `result_type`, который указывает тип возвращаемого значения оператора `operator()`. Так как этот тип не определен в стандартных алгоритмах, компилятор выдаст сообщение об ошибке. Обратите внимание, что не представляется возможным передать итераторы **first** и **last** в `std::min_element()` напрямую, потому что этот алгоритм ожидает итераторы прямого доступа (forward iterators), в то время как объединитель работает с итераторами ввода (input iterators). Поэтому, перед тем как определить наименьшее значение с помощью `std::min_element()`, для хранения всех возвращаемых значений используется вектор. -В [Примере 67.9](#ex.signals2_09) объединитель изменен так, что бы хранить все возвращаемые значения в контейнере, вместо того чтобы сравнивать их. Он размещает все возвращаемые значения в векторе, который будет возвращен при вызове`s()`. +В [Примере 67.9](#ex.signals2_09) объединитель изменен так, что бы хранить все возвращаемые значения в контейнере, вместо того чтобы сравнивать их. Он размещает все возвращаемые значения в векторе, который будет возвращен при вызове `s()`. ### Пример 67.9. Получение всех возвращаемых значений при помощи пользовательского объединителя @@ -282,7 +282,7 @@ int main() Функции `disconnect()` класса `boost::signals2::signal` в качестве аргумента требуется указатель на функцию. Обойти это можно путем вызова `disconnect()` с объектом `boost::signals2::connection`. -Для того, чтобы заблокировать функцию на короткий промежуток времени не разрывая связи с сигналом, может быть использован `boost::signals2::shared_connection_block`. +Для того, чтобы заблокировать функцию на короткий промежуток времени, не разрывая связи с сигналом, может быть использован `boost::signals2::shared_connection_block`. ### Пример 67.11. Блокировка соединений с помощью shared_connection_block @@ -334,13 +334,13 @@ int main() } ``` -В [Примере 67.12](#ex.signals2_12) сигнал **s** посылается дважды, но лямбда-функция быдет вызвана только во второй раз. Программа выведет `Hello, world!` в стандартный поток вывода только один раз. +В [Примере 67.12](#ex.signals2_12) сигнал **s** посылается дважды, но лямбда-функция будет вызвана только во второй раз. Программа выведет `Hello, world!` в стандартный поток вывода только один раз. Так как `false` передан в конструктор в качестве второго аргумента, первый объект типа `boost::signals2::shared_connection_block` не блокирует соединение с сигналом **s**. Следовательно, вызов `blocking()` объекта **b1** вернет `false`. Тем не менее, лямбда-функция не выполняется при первом вызове **s**, так как доступ происходит только после того как второй объект типа `boost::signals2::shared_connection_block` будет инстанцирован. Но, не передавая второй параметр конструктору, соединение блокируется объектом. Когда **s** вызывается во второй раз, лямбда-функция выполнится, так как блокировка была автоматически удалена, когда **b2** вышел из области видимости. -Boost.Signals2 может разрывать соединения как только объект, чьим членом является функция, связанная с сигналом, будет разрушен. +Boost.Signals2 может разрывать соединения, как только объект, чьим членом является функция, связанная с сигналом, будет разрушен. ### Пример 67.13. Функция-член в качестве обработчика событий @@ -373,9 +373,9 @@ int main() } ``` -В [Примере 67.13](#ex.signals2_13) функция-член объекта связывается с сигналом с помощью `std::bind()`. Объект разрушен до того как сигнал будет послан, что является проблемой, так как вместо того чтобы передать объект типа `world` в `std::bind()`, будет передан только адрес. К тому времени как `s()` будут вызван, объект, на который мы ссылались, не будет существовать. +В [Примере 67.13](#ex.signals2_13) функция-член объекта связывается с сигналом с помощью `std::bind()`. Объект разрушен до того, как сигнал будет послан, что является проблемой, так как вместо того чтобы передать объект типа `world` в `std::bind()`, будет передан только адрес. К тому времени как `s()` будут вызван, объект, на который мы ссылались, не будет существовать. -Возможно изменить программу так, что бы соедининие автоматически разрывалось как только объект был уничтожен. В [Примере 67.14](#ex.signals2_14) происходит именно это. +Возможно изменить программу так, чтобы соединение автоматически разрывалось, как только объект был уничтожен. В [Примере 67.14](#ex.signals2_14) происходит именно это. ### Пример 67.14. Автоматический разрыв связи с функцией-членом @@ -407,13 +407,13 @@ int main() } ``` -Теперь `num_slots()` вернет `0`. В [Примере 67.14](#ex.signals2_14) при отправки сигнала, не происходит попытки вызвать функцию-член объекта, который не существует. Изменение состоит в том, что мы обернули объект типа `world` умным указателем `boost::shared_ptr`, который передаётся в `track()`. Эта функция-член вызыается для слота, который был передан в `connect()`, для запроса отслеживания соответствующего объекта. +Теперь `num_slots()` вернет `0`. В [Примере 67.14](#ex.signals2_14) при отправки сигнала, не происходит попытки вызвать функцию-член объекта, который не существует. Изменение состоит в том, что мы обернули объект типа `world` умным указателем `boost::shared_ptr`, который передаётся в `track()`. Эта функция-член вызывается для слота, который был передан в `connect()`, для запроса отслеживания соответствующего объекта. Функция или функция-член связанная с сигналом называется *слот*. Тип для задания слота не был использован в предыдущих примерах, потому что передать указатель на функцию или функцию-член в `connect()` было достаточно. Соответствующий слот был создан и связан с сигналом автоматически. Тем не менее, в [Примере 67.14](#ex.signals2_14) умный указатель связывается со слотом путем вызова `track()`. Так как тип слота зависит от сигнала, `boost::signals2::signal` предоставляет тип `slot_type` для доступа к требующемуся типу. `slot_type` ведет себя так же, как `std::bind`, что позволяет передавать оба параметра для описания слота напрямую. `track()` может связать слот с умным указателем типа `boost::shared_ptr`. Затем объект отслеживается, что приводит к тому, что слот будет автоматически удален, как только отслеживаемый объект разрушится. -Для того, чтобы управлять объектами с другими умными указателями, слоты предоставляют функцию под названием `track_foreign()`. В то время как `track()` принимает умный указатель типа `boost::shared_ptr`, `track_foreign()` позволяет, например, использовать умный указатель типа `std::shared_ptr`. Умные указатели, кроме `std::shared_ptr` и `std::weak_ptr`, должны быть добавлены в Boost.Signals2 , прежде чем они могут быть переданы в `track_foreign()`. +Для того, чтобы управлять объектами с другими умными указателями, слоты предоставляют функцию под названием `track_foreign()`. В то время как `track()` принимает умный указатель типа `boost::shared_ptr`, `track_foreign()` позволяет, например, использовать умный указатель типа `std::shared_ptr`. Умные указатели, кроме `std::shared_ptr` и `std::weak_ptr`, должны быть добавлены в Boost.Signals2, прежде чем они могут быть переданы в `track_foreign()`. Подписчик конкретного события может получить доступ к объекту типа `boost::signals2::signal` для создания новых связей или разрыва связи существующих. @@ -440,7 +440,7 @@ int main() В [Примере 67.15](#ex.signals2_15) мы получаем доступ к **s** внутри функции `connect()` для связывания лямбда-функции с сигналом. Так как `connect()` вызывается, когда сигнал уже послан, возникает вопрос, будет ли вызвана лямбда-функция. -Программа не выводит ничего, что означает, что лямбда-функция ни разу не была вызывана. Хотя Boost.Signals2 и поддерживает связывание функций с сигналами во время срабатывания сигнала, новые связи будут использованны только при следующем срабатывании сигнала. +Программа не выводит ничего, что означает, что лямбда-функция ни разу не была вызвана. Хотя Boost.Signals2 и поддерживает связывание функций с сигналами во время срабатывания сигнала, новые связи будут использованы только при следующем срабатывании сигнала. ### Пример 67.16. Разрыв соединения в обработчике событий @@ -476,9 +476,9 @@ int main() ## Многопоточность -Почти все классы, предоставляемые Boost.Signals2 являются потокобезопасными и могут использоваться в многопоточных приложениях. Например, к объектам типа `boost::signals2::signal` и `boost::signals2::connection` можно обращаться из разных потоков. +Почти все классы, предоставляемые Boost.Signals2, являются потокобезопасными и могут использоваться в многопоточных приложениях. Например, к объектам типа `boost::signals2::signal` и `boost::signals2::connection` можно обращаться из разных потоков. -С другой стороны, `boost::signals2::shared_connection_block` не потокобезопасен. Это ограничение не важно, потому что несколько объектов типа `boost::signals2::shared_connection_block` могут быть созданы в различных потоках и могут использовать одни и теже объекты соединений. +С другой стороны, `boost::signals2::shared_connection_block` не потокобезопасен. Это ограничение не важно, потому что несколько объектов типа `boost::signals2::shared_connection_block` могут быть созданы в различных потоках и могут использовать одни и те же объекты соединений. ### Пример 67.17. Потокобезопасность boost::signals2::signal @@ -539,7 +539,7 @@ int main() } ``` -Последний из многих шаблонных параметров, поддерживаемых `boost::signals2::signal`, определяет тип мьютекса, используемого для синхронизации. К счастью, Boost.Signals2 предлагает более простой способ отключить синхронизацию, чем передача всего списока параметров. +Последний из многих шаблонных параметров, поддерживаемых `boost::signals2::signal`, определяет тип мьютекса, используемого для синхронизации. К счастью, Boost.Signals2 предлагает более простой способ отключить синхронизацию, чем передача всего списка параметров. Пространство имен `boost::signals2::keywords` содержит классы, которые позволяют передавать шаблонные параметры по имени. `boost::signals2::keywords::mutex_type` может быть использован для передачи типа мьютекса в качестве второго шаблонного параметра для `boost::signals2::signal_type`. Обратите внимание, что `boost::signals2::signal_type`, а не `boost::signals2::signal` необходимо использовать в данном случае. Тип эквивалентный типу `boost::signals2::signal`, необходимый для определения сигнала **s**, извлекается с помощью `boost::signals2::signal_type::type`.