Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Using and building the library

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 35. Thread 4.7.1

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Повышаю. Thread настраивается в соответствии с соглашениями, используемыми для создания библиотек с отдельным исходным кодом . Повышаю. Thread будет импортировать/экспортировать код только в том случае, если пользователь специально запросил его, определив либо BOOST_ALL_DYN_LINK, если они хотят, чтобы все библиотеки повышения были динамически связаны, либо BOOST_ THREAD_DYN_LINK, если они хотят, чтобы эта модель им понравилась.

Определение этих макросов определяет, является ли BOOST_ Определяется THREAD_USE_DLL. Если BOOST_THREAD_USE_DLL Библиотека определяет BOOST_THREAD_USE_DLL или BOOST_THREAD_USE_LIB в зависимости от платформы. На платформах без окон BOOST_THREAD_USE_LIB определяется, если не определено. В платформах Windows BOOST_THREAD_USE_LIB определяется как BOOST_THREAD_USE_DLL. и компилятор поддерживает автоматическую очистку с помощью Boost. Threads (на тот момент это были Msvc и Intel)

Исходный код, собранный при создании библиотеки, определяет макросы BOOST_THREAD_SOURCE, которые используются для импорта или экспорта. Пользователь ни в коем случае не должен определять этот макрос.

Повышаю. Поток зависит от некоторых не только заголовок библиотек.

  • Повышаю. Система: Эта зависимость обязательна, и вам нужно будет связаться с библиотекой.
  • Повышаю. Хроно: Эта зависимость необязательна (см. ниже, как настроить), и вам нужно будет связаться с библиотекой, если вы используете некоторые интерфейсы, связанные с временем.
  • Повышаю. Дата: Эта зависимость является обязательной, но даже если она увеличивается. DateTime - это не только библиотека Boost. Thread использует только те части, которые являются только заголовками, поэтому в принципе вам не нужно связываться с библиотекой.

Кажется, что есть некоторые IDE (например, Visual Studio), которые выводят библиотеки, которые программа должна связать, чтобы проверить источники. Такая IDE может заставить подключиться к Boost. Дата и/или Boost.Chrono.

В качестве единственной обязательной зависимости выступает буст. Система, следующие

bjam toolset=msvc-11.0 --build-type=complete --with-thread

устанавливается только boost_thread и boost_system.

Пользователи такой IDE должны заставить Boost. Хроно и Бут. DateTime сборка с использованием

bjam toolset=msvc-11.0 --build-type=complete --with-thread --with-chrono --with-date_time

В следующем разделе описаны все макросы, используемые для настройки Boost. Нить.

Table 35.1. Default Values for Configurable Features

Особенность

Противоядие

V2

V3

V4

USES_CHRONO

DONT_USE_CHRONO

YES/NO

YES/NO

YES/NO

ПРОВИДЕНИЯ_ИНТЕРРУПЦИИ

DONT_PROVIDE_INTERRUPTIONS

ДА

ДА

ДА

THROW_IF_PRECONDITION_NOT_SATISFIED

-

NO

NO

NO

PROVIDES_PROMISE_LAZY

DONT_PROVIDE_PROMISE_LAZY

ДА

NO

NO

PROVIDES_BASIC_THREAD_ID

DONT_PROVIDE_BASIC_THREAD_ID

NO

ДА

ДА

PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN

DONT_PROVIDE_GENERIC_SHARED_MUTEX_ON_WIN

NO

ДА

ДА

ПРОВИДЫ_ШАРЕД_МУТЕКС_УПРАВКИ_КОНВЕРСИЯ

DONT_PROVIDE_SHARED_MUTEX_UPWARDS_CONVERSION

NO

ДА

ДА

ПРОВИДЫ_ЭКСПУТОРЫ

-

NO

NO

NO

ПРОВИДЕНИЯ_EXPLICIT_LOCK_CONVERSION

DONT_PROVIDE_EXPLICIT_LOCK_CONVERSION

NO

ДА

ДА

ПРОВИДЫ_БУДУЩЕЕ

DONT_PROVIDE_FUTURE

NO

ДА

ДА

ПРОВИДЫ_ФУТУРЕ_КТОР_АЛЛОКАТОРЫ

DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS

NO

ДА

ДА

PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE

DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE

NO

ДА

ДА

PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE

DONT_PROVIDE_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE

NO

ДА

ДА

PROVIDES_ONCE_CXX11

DONT_PROVIDE_ONCE_CXX11

NO

ДА

ДА

USES_MOVE

DONT_USE_MOVE

NO

ДА

ДА

USES_DATEME

DONT_USE_DATEME

YES/NO

YES/NO

YES/NO

PROVIDES_THREAD_EQ

DONT_PROVIDE_THREAD_EQ

ДА

ДА

NO

ПРОВИДЕНИЯ_УСЛОВИЯ

DONT_PROVIDE_CONDITION

ДА

ДА

NO

ПРОВИДЫ_НЕСТЕДЫ_ЛОКСЫ

DONT_PROVIDE_NESTED_LOCKS

ДА

ДА

NO

PROVIDES_SIGNATURE_PACKAGED_TASK

DONT_PROVIDE_SIGNATURE_PACKAGED_TASK

NO

NO

ДА

PROVIDES_FUTURE_INVALID_AFTER_GET

DONT_PROVIDE_FUTURE_INVALID_AFTER_AFTER_GET

NO

NO

ДА

PROVIDES_VARIADIC_THREAD

DONT_PROVIDE_VARIADIC_THREAD

NO

NO

C++11


Повышаю. Thread использует по умолчанию Boost. Хроно для связанных с временем функций и определения BOOST_THREAD_USES_CHRONO, если BOOST_THREAD_DONT_USE_CHRONO не определен. Пользователь должен определить BOOST_THREAD_DONT_USE_CHRONO для компиляторов, которые плохо работают с Boost. Хроно.

[Warning] Warning

При определении BOOST_THREAD_PLATFORM_WIN32 BOOST_THREAD_USES_CHRONO определяется независимо от настроек пользователя.

Повышаю. Thread использует по умолчанию семантический внутренний ход реализации. Начиная с версии 3.0.0 вы можете использовать эмуляцию движения, предоставляемую Boost. Пошли.

Когда BOOST_THREAD_VERSION==2<7 BOOST_THREAD_USES_MOVE , если вы хотите использовать Boost. Переместите интерфейс. Когда BOOST_THREAD_VERSION>=3 определите BOOST_THREAD_DONT_USE_MOVE , если вы не хотите использовать Boost. Переместите интерфейс.

Начало. Функции, связанные со временем, введенные в Boost 1.35.0, с использованием библиотеки Boost.Date_Time, обесцениваются. К ним относятся (но не ограничиваются):

Когда BOOST_THREAD_VERSION<=3 && определено BOOST_THREAD_PLATFORM_PTHREAD определять BOOST_THREAD_DONT_USE_DATETIME, если вы не хотите использовать Boost. Интерфейсы, связанные с DateTime. Когда BOOST_THREAD_VERSION>3 && определено BOOST_THREAD_PLATFORM_PTHREAD определять BOOST_THREAD_USES_DATETIME, если вы хотите использовать Boost. Интерфейсы, связанные с DateTime.

[Warning] Warning

При определении BOOST_THREAD_PLATFORM_WIN32 BOOST_THREAD_USES_DATETIME определяется независимо от настроек пользователя.

Повышаю. Thread использует по умолчанию Boost. Атомный в POSIX платформах для реализации call_once.

Определите BOOST_THREAD_USES_ATOMIC , если вы хотите использовать Boost. Atomic.Define BOOST_THREAD_DONT_USE_ATOMIC , если вы не хотите использовать Boost. Атомный или не поддерживается на платформе.

Обесцениваются следующие операторы:

  • boost::thread::оператор==<13
  • boost::thread::оператор!=<13

При BOOST_THREAD_PROVIDES_THREAD_EQ определяется повышение. Thread предоставляет эти устаревшие функции.

Используйте вместо

  • boost::::id::оператор==<17
  • boost::::id::оператор!=<17
[Warning] Warning

Это серьезное изменение в отношении версии 1.x.

Когда BOOST_THREAD_VERSION>=4 определяют BOOST_THREAD_PROVIDES_THREAD_EQ<2 Если вы хотите эту функцию. Когда BOOST_THREAD_VERSION<4 определяют BOOST_THREAD_DONT_PROVIDE_THREAD_EQ<2 Если вам не нужна эта функция.

boost::условие обесценивается. При BOOST_THREAD_PROVIDES_CONDITION определяется повышение. Thread предоставляет эту устаревшую функцию.

Используйте вместо boost::condition_variable_any.

[Warning] Warning

Это серьезное изменение в отношении версии 1.x.

Когда BOOST_THREAD_VERSION>3<7 BOOST_THREAD_PROVIDES_CONDITION, если вы хотите эту функцию. Когда BOOST_THREAD_VERSION<=3 определите BOOST_THREAD_DONT_PROVIDE_CONDITION, если вам не нужна эта функция.

Обесцениваются следующие вложенные типдефы:

  • boost::mutex::scoped_lock,
  • boost::mutex::scoped_try_lock,
  • boost::timed_mutex::scoped_lock
  • boost::timed_mutex::scoped_try_lock
  • boost::timed_mutex::timed_scoped_timed_lock
  • boost::recursive_mutex::scoped_lock,
  • boost::recursive_mutex::scoped_try_lock,
  • boost::recursive_timed_mutex::scoped_lock
  • boost::recursive_timed_mutex::scoped_try_lock
  • boost::recursive_timed_mutex::timed_scoped_timed_lock

При BOOST_THREAD_PROVIDES_NESTED_LOCKS определяется повышение. Thread предоставляет эти устаревшие функции.

Используйте вместо этого * boost::boost::mutex>, boost::mutex>try_to_lock_t конструктор, boost::boost::boost::try_to_lock_tboost::unique_lock::boost: recursive_mutex:recursive_mutextry_to_lock_t конструктор boost::recursive_timed_mutexboost::unique_lock::boostrecursive_timed_mutex::recursive_timed_mutexrecursive_timed_mutex с try_to_lock_t конструктор boost::boost::recursive_timed_mutex

[Warning] Warning

Это серьезное изменение в отношении версии 1.x.

Когда BOOST_THREAD_VERSION>=4<7 BOOST_THREAD_PROVIDES_NESTED_LOCKS, если вам нужны эти функции. Когда BOOST_THREAD_VERSION<4 определите BOOST_THREAD_DONT_PROVIDE_NESTED_LOCKS, если вам не нужны эти функции.

Повышаю. Thread по умолчанию использует поток::id на Posix на основе типа pthread (BOOST_THREAD_PROVIDES_BASIC_THREAD_ID). Для обратной совместимости, а также для компиляторов, которые плохо работают с этой модификацией, пользователь может определить BOOST_THREAD_DONT_PROVIDE_BASIC_THREAD_ID.

Определите BOOST_THREAD_DONT_PROVIDE_BASIC_THREAD_ID , если вам не нужны эти функции.

Общая реализация mutex на платформе Windows в настоящее время обеспечивает меньшую функциональность, чем общая, которая используется для платформ на основе PTheads. Чтобы иметь доступ к этим функциям, пользователю необходимо определить BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN, чтобы использовать общую реализацию, которая, хотя и может быть менее эффективной, предоставляет все функции.

Когда BOOST_THREAD_VERSION==2 определите BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN , если вам нужны эти функции. Когда BOOST_THREAD_VERSION>=3 определите BOOST_THREAD_DONT_PROVIDE_GENERIC_SHARED_MUTEX_ON_WIN , если вам не нужны эти функции.

Повышаю. Потоки включают в версию 3 конверсию Shared Locking Upwards, как определено в Shared Locking. Эти преобразования должны использоваться осторожно, чтобы избежать тупика или лайв-лока. Пользователь должен четко определить BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION, чтобы получить эти конверсии вверх.

Когда BOOST_THREAD_VERSION==2 определите BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION , если вам нужны эти функции. Когда BOOST_THREAD_VERSION>=3 определите BOOST_THREAD_DONT_PROVIDE_SHARED_MUTEX_UPWARDS_CONVERSION , если вам не нужны эти функции.

В Shared Locking конверсии блокировки являются явными. Поскольку это явное преобразование нарушает интерфейсы блокировки, оно предоставляется только в том случае, если определено BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION.

Когда BOOST_THREAD_VERSION==2 определите BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION , если вам нужны эти функции. Когда BOOST_THREAD_VERSION==3 определите BOOST_THREAD_DONT_PROVIDE_EXPLICIT_LOCK_CONVERSION , если вам не нужны эти функции.

C++11 использует std::будущее. Версии Boost. Предыдущая версия 3.0.0 использует boost:unique_future. Так как версия 3.0.0 boost::future заменяет boost::unique_future при определении BOOST_THREAD_PROVIDES_FUTURE. Документация больше не содержит boost::unique_future.

Когда BOOST_THREAD_VERSION==2<7 BOOST_THREAD_PROVIDES_FUTURE, если вы хотите использовать boost::future. Когда BOOST_THREAD_VERSION>=3 определите BOOST_THREAD_DONT_PROVIDE_FUTURE, если вы хотите использовать boost::unique_future.

C++11 обещает инициализировать связанное состояние в момент строительства. Версии Boost. Поток, предшествующий версии 3.0.0, инициализирует его лениво в любой момент времени, когда это состояние необходимо.

С версии 3.0.0 эта разница в поведении может быть настроена. При определении BOOST_THREAD_PROVIDES_PROMISE_LAZY обеспечивается обратно совместимое поведение.

Когда BOOST_THREAD_VERSION==2 определите BOOST_THREAD_DONT_PROVIDE_PROMISE_LAZY , если вы хотите использовать boost::future. Когда BOOST_THREAD_VERSION>=3 определите BOOST_THREAD_PROVIDES_PROMIDES_LAZY , если вы хотите использовать boost::unique_future.

C++11 std::promise предоставляет конструкторам распределители.

template <typename R>
class promise
{
  public:
    template <class Allocator>
    explicit promise(allocator_arg_t, Allocator a);
  // ...
};
template <class R, class Alloc> struct uses_allocator<promise<R>,Alloc>: true_type {};

где

struct allocator_arg_t { };
constexpr allocator_arg_t allocator_arg = allocator_arg_t();
template <class T, class Alloc> struct uses_allocator;

С версии 3.0.0 Boost. Thread реализует этот конструктор, используя следующий интерфейс:

namespace boost
{
  typedef container::allocator_arg_t allocator_arg_t;
  constexpr allocator_arg_t allocator_arg = {};
  namespace container
  {
    template <class R, class Alloc>
    struct uses_allocator<promise<R>,Alloc>: true_type {};
  }
  template <class T, class Alloc>
  struct uses_allocator : public container::uses_allocator<T, Alloc> {};
}

это создает зависимость от роста. Контейнер. Эта функция предоставляется только в том случае, если определено BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS.

Когда BOOST_THREAD_VERSION==2 определите BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS , если вам нужны эти функции. Когда BOOST_THREAD_VERSION>=3 определите BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS , если вам не нужны эти функции.

C++11 имеет различную семантику для разрушителя потока и назначения движения. Вместо того, чтобы отсоединять нить, вызывает окончание(), если нить была соединена. При BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE и BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE определяется Boost. Thread обеспечивает семантику C++.

Когда BOOST_THREAD_VERSION==2 определите BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE , если вам нужны эти функции. Когда BOOST_THREAD_VERSION>=3 определите BOOST_THREAD_DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE , если вам не нужны эти функции.

Когда BOOST_THREAD_VERSION==2 определите BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE , если вам нужны эти функции. Когда BOOST_THREAD_VERSION>=3 определите BOOST_THREAD_DONT_PROVIDE_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE , если вам не нужны эти функции.

C++11 определяет конструктор по умолчанию для once_flag. При BOOST_THREAD_PROVIDES_ONCE_CXX11 определяется повышение. Thread обеспечивает семантику C++. При этом предыдущий совокупный синтаксис не поддерживается.

boost::once_flag once = BOOST_ONCE_INIT;

Теперь ты должен просто сделать

boost::once_flag once;

Когда BOOST_THREAD_VERSION==2 определите BOOST_THREAD_PROVIDES_ONCE_CXX11, если вам нужны эти функции. Когда BOOST_THREAD_VERSION>=3 определите BOOST_THREAD_DONT_PROVIDE_ONCE_CXX11, если вам не нужны эти функции.

Упакованный класс задач C++11 имеет параметр шаблона подписи. При BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK определяется повышение. Thread предоставляет эту функцию C++.

[Warning] Warning

Это серьезное изменение в отношении версии 3.x.

Когда BOOST_THREAD_VERSION<4 определите BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK, если вы хотите эту функцию. Когда BOOST_THREAD_VERSION>=4 определите BOOST_THREAD_DONT_PROVIDE_SIGNATURE_PACKAGED_TASK, если вам не нужна эта функция.

Конструктор потоков C++11 принимает переменное число аргументов rvalue. При BOOST_THREAD_PROVIDES_VARIADIC_THREAD определяется повышение. Thread предоставляет эту функцию C++, если не определено следующее:

  • BOOST_NO_SFINAE_EXPR
  • BOOST_NO_CXX11_VARIADIC_TEMPLATES
  • BOOST_NO_CXX11_DECLTYPE
  • BOOST_NO_CXX11_DECLTYPE_N3276
  • BOOST_NO_CXX11_RVALUE_REFERENCES
  • BOOST_NO_CXX11_TRAILING_RESULT_TYPES
  • BOOST_NO_CXX11_RVALUE_REFERENCES
  • BOOST_NO_CXX11_HDR_TUPLE

Когда BOOST_THREAD_VERSION>4 определяют BOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD<2 Если вам не нужна эта функция.

C++11 future<>::get() объявляет недействительным будущее после получения его значения. При BOOST_THREAD_PROVIDES_FUTURE_INVALID_AFTER_GET определяется повышение. Thread предоставляет эту функцию C++.

[Warning] Warning

Это серьезное изменение в отношении версии 3.x.

Когда BOOST_THREAD_VERSION<4 определите BOOST_THREAD_PROVIDES_FUTURE_INVALID_AFTER_GET, если вы хотите эту функцию. Когда BOOST_THREAD_VERSION>=4 определите BOOST_THREAD_DONT_PROVIDE_FUTURE_INVALID_AFTER_GET, если вам не нужна эта функция.

Прерывание потока, хотя и полезно, делает любую точку прерывания менее эффективной, чем если бы нить не была прерываемой.

При BOOST_THREAD_PROVIDES_INTERRUPTIONS определяется повышение. Нить обеспечивает прерывания. При BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS определяется повышение. Нить не обеспечивает прерывания.

Повышаю. BOOST_THREAD_PROVIDES_INTERRUPTIONS Если ни BOOST_THREAD_PROVIDES_INTERRUPTIONS, ни BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS не определены, то разрыв совместимости отсутствует.

BOOST_THREAD_VERSION определяет Рост. Версия Thread. Версия по умолчанию 2. В этом случае следующие макросы разрушения или расширения определяются, если не требуется обратное:

  • BOOST_THREAD_PROVIDES_PROMISE_LAZY

Пользователь может запросить версию 3, определив BOOST_THREAD_VERSION-3. В этом случае следующие макросы разрушения или расширения определяются, если не требуется обратное:

  • Переломное изменение BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
  • Исполнитель: Breaking Change BOOST_THREAD_PROVIDES_FUTURE
  • Единообразие BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN
  • Расширение BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSION
  • Соответствие BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
  • Conformity & Breaking change BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE
  • Conformity & Breaking change BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE
  • Соответствие и усилие; Преодоление изменения BOOST_THREAD_PROVIDES_ONCE_CXX11
  • Переломное изменение BOOST_THREAD_DONT_PROVIDE_PROMISE_LAZY

Пользователь может запросить версию 4, определив BOOST_THREAD_VERSION до 4. В этом случае определяются следующие разбивающие или расширяющие макросы, если не запрашивается обратное:

  • Conformity & Breaking change BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK
  • Conformity & Breaking change BOOST_THREAD_PROVIDES_FUTURE_INVALID_AFTER_GET
  • Соответствие BOOST_THREAD_PROVIDES_VARIADIC_THREAD
  • Переломное изменение BOOST_THREAD_DONT_PROVIDE_THREAD_EQ
  • Разрыв перемен BOOST_THREAD_DONT_USE_DATEME

Некоторые компиляторы работают неправильно с некоторыми добавленными функциями.

Если __SUNPRO_CC <0x5100, библиотека определяет

  • BOOST_THREAD_DONT_USE_MOVE

Если __SUNPRO_CC <0x5100, библиотека определяет

  • BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS

Если __IBMCPP__ < 1100, то библиотека определяет

  • BOOST_THREAD_DONT_USE_CHRONO
  • BOOST_THREAD_USES_DATE

И увеличить. Нить не связана с Boost. Хроно.

WCE

Если _WIN32_WCE && _WIN32_WCE==0x501 библиотека определяет

  • BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS

PrevUpHomeNext

Статья Using and building the library раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 35. Thread 4.7.1 может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 35. Thread 4.7.1 ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:46:37/0.034440040588379/1