Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 114

Автор ДТонсон Π₯Π°Ρ€Ρ‚

 hTimer = CreateWaitableTimer(NULL, FALSE /* "Π’Π°ΠΉΠΌΠ΅Ρ€ синхронизации" */, NULL);

 SetWaitableTimer(hTimer, &DueTime, Period, Beeper, &Count, TRUE);

 while (!Exit) {

  _tprintf(_T("Count = %d\n"), Count);

  /* Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика увСличиваСтся Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. */

  /* Π’ΠΎΠΉΡ‚ΠΈ Π² состояниС Π΄Π΅ΠΆΡƒΡ€Π½ΠΎΠ³ΠΎ оТидания. */

  SleepEx(INFINITE, TRUE);

 }

 _tprintf(_T("Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅. Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ = %d"), Count);

 CancelWaitableTimer(hTimer);

 CloseHandle(hTimer);

 return 0;

}


static VOID APIENTRY Beeper(LPVOID lpCount, DWORD dwTimerLowValue, DWORD dwTimerHighValue) {

 *(LPDWORD)lpCount = *(LPDWORD)lpCount + 1; 

 _tprintf(_T("ГСнСрация сигнала Π½ΠΎΠΌΠ΅Ρ€: %d\n"), *(LPDWORD) lpCount);

 Π’Π΅Π΅Ρ€(1000 /* Частота. */, 250 /* Π”Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (мс). */);

 return;

}


BOOL WINAPI Handler(DWORD CntrlEvent) {

 Exit = TRUE;

 _tprintf(_T("Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹\n"));

 return TRUE;

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ с Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠΌ оТидания

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, Π»ΠΈΠ±ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° дСскриптора Π² сигнальноС состояниС, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 14.3 ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ использованиС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Π’Ρ‹ смоТСтС Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ, измСняя ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ TimeBeep.с, доступной Π½Π° Web-сайтС.

ΠŸΠΎΡ€Ρ‚Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

ΠŸΠΎΡ€Ρ‚Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ лишь Π½Π° NT-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ Π² сСбС возмоТности ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ нСзависимых ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‡Π°Ρ‰Π΅ всСго Π² сСрвСрных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΌΠΈ трСбованиями это ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒΡΡ, обратимся ΠΊ сСрвСрам, построСнным Π² Π³Π»Π°Π²Π°Ρ… 11 ΠΈ 12, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ поддСрТивался ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, связанным с сокСтом ΠΈΠ»ΠΈ экзСмпляром ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°. Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ лишь Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° число ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π½Π΅Π²Π΅Π»ΠΈΠΊΠΎ.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли число ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² достигнСт 1000. Π’ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ для этого потрСбуСтся 1000 ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ объСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ памяти. Π’Π°ΠΊ, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ выдСляСтся 1 ΠœΠ±Π°ΠΉΡ‚ стСкового пространства, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ для 1000 ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² потрСбуСтся 1 Π“Π±Π°ΠΉΡ‚, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкстов ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ, обусловлСнныС ошибками ΠΈΠ·-Π·Π° отсутствия страниц.[35] ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΡΡ‚ΡΠ·Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой Π·Π° ΠΏΡ€Π°Π²ΠΎ владСния ΠΎΠ±Ρ‰ΠΈΠΌΠΈ рСсурсами ΠΊΠ°ΠΊ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°, Ρ‚Π°ΠΊ ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ процСсса, ΠΈ это, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π³Π»Π°Π²Π΅ 9, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ сниТСнию ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ связи с этим трСбуСтся ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ ΠΏΡƒΠ»Ρƒ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ большоС количСство ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ².

ИскомоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ обСспСчиваСтся ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ количСство сСрвСрных ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² ΠΏΡƒΠ»Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², имСя ΠΎΡ‡Π΅Π½ΡŒ большоС количСство дСскрипторов ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² (ΠΈΠ»ΠΈ сокСтов). ΠŸΡ€ΠΈ этом дСскрипторы Π½Π΅ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ ΠΏΠΎΠΏΠ°Ρ€Π½ΠΎ с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ сСрвСрными ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ; сСрвСрный ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ любой дСскриптор, Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.

Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΡ€Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° β€” это Π½Π°Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…ΡΡ дСскрипторов, ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΏΠΎΡ€Ρ‚Π° Π² сигнальноС состояниС. Когда Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ опСрация чтСния ΠΈΠ»ΠΈ записи с участиСм ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ дСскриптора, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² пробуТдаСтся ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. Π”Π°Π»Π΅Π΅ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ вновь ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² состояниС оТидания ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΏΠΎΡ€Ρ‚Π° Π² сигнальноС состояниС.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ€Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ дСскрипторы.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

Для создания ΠΏΠΎΡ€Ρ‚Π° ΠΈ присоСдинСния ΠΊ Π½Π΅ΠΌΡƒ дСскрипторов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ функция β€” CreateCompletionPort. ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ выполнСния этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ соотвСтствСнно услоТняСт использованиС Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². 

HANDLE CreateIoCompletionPort(HANDLE FileHandle, HANDLE ExistingCompletionPort, DWORD CompletionKey, DWORD NumberOfConcurrentThreads);

ΠŸΠΎΡ€Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° прСдставляСт собой ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ дСскрипторов Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ OVERLAPPED. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ FileHandle β€” это ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉΡΡ дСскриптор, присоСдиняСмый ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ. Если Π·Π°Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½Ρ‹ΠΌ INVALID_DESCRIPTOR_HANDLE, Ρ‚ΠΎ функция создаст Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π΅Π³ΠΎ дСскриптор. Π’ этом случаС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ExistingCompletionPort, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСн Π² NULL.

ExistingCompletionPort β€” ΠΏΠΎΡ€Ρ‚, созданный ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ присоСдинСн дСскриптор, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅. Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСскриптор ΠΏΠΎΡ€Ρ‚Π°, ΠΈΠ½Π°Ρ‡Π΅ β€” NULL.

CompletionKey β€” ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² ΠΏΠ°ΠΊΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ для дСскриптора FileHandle. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π² качСствС ΠΊΠ»ΡŽΡ‡Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ индСкса массива структур Π΄Π°Π½Π½Ρ‹Ρ…, содСрТащих Ρ‚ΠΈΠΏ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, дСскриптор ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π±ΡƒΡ„Π΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ…. 

NumberOfConcurrentThreads β€” ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ допустимоС количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² свСрх этого количСства, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΏΠΎΡ€Ρ‚Π° Π² сигнальноС состояниС, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ, Π΄Π°ΠΆΠ΅ Ссли сущСствуСт дСскриптор с доступными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Если этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ установлСн Ρ€Π°Π²Π½Ρ‹ΠΌ 0, Ρ‚ΠΎ Π² качСствС ΠΏΡ€Π΅Π΄Π΅Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ количСство процСссоров, установлСнных Π² систСмС.

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…ΡΡ дСскрипторов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ связаны с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ€Ρ‚ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ ограничиваСтся. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateCompletionPort ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΏΠΎΡ€Ρ‚Π° ΠΈ указания максимального количСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ дСскриптора, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ ΡΠ²ΡΠ·Ρ‹Π²Π°Π½ΠΈΡŽ с Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΡ€Ρ‚ΠΎΠΌ, слСдуСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ эту ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. К соТалСнию, способов, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ дСскриптор ΠΈΠ· ΠΏΠΎΡ€Ρ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, Π½Π΅ сущСствуСт, ΠΈ это ΡƒΠΏΡƒΡ‰Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

ДСскрипторы, связанныС с ΠΏΠΎΡ€Ρ‚ΠΎΠΌ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно с функциями ReadFileEx ΠΈ WriteFileEx. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Microsoft Π½Π΅ рСкомСндуСтся Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ дСскрипторы.

ОТиданиС ΠΏΠΎΡ€Ρ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

Для выполнСния Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° с участиСм дСскрипторов, связанных с ΠΏΠΎΡ€Ρ‚ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReadFile ΠΈ WriteFile со структурами OVERLAPPED (дСскрипторы событий Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ). Π”Π°Π»Π΅Π΅ опСрация Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° помСщаСтся Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΡ€Ρ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

ΠŸΠΎΡ‚ΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, находящСйся Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Π½Π΅ ΠΏΡƒΡ‚Π΅ΠΌ оТидания события, Π° ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetQueueCompletionStatus с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡ€Ρ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ (completion port). Когда Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ пробуТдаСтся, функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ присоСдинСнии ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ дСскриптора, Ρ‡ΡŒΡ опСрация Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ, ΠΈ этот ΠΊΠ»ΡŽΡ‡ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ количСство ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ фактичСского дСскриптора, связанного с Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ²ΡˆΠ΅ΠΉΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ.

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π» Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ запись. Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ Π»ΡŽΠ±Ρ‹ΠΌ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ»ΡŽΡ‡ ΠΌΠΎΠ³ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ дСскриптор, связанный с Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ²ΡˆΠ΅ΠΉΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ.

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» оТидания (time-out). 

BOOL GetQueuedCompletionStatus(HANDLE CompletionPort, LPDWORD lpNumberOfBytesTransferred, LPDWORD lpCompletionKey, LPOVERLAPPED *lpOverlapped, DWORD dwMilliseconds); 

Иногда ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ опСрация Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π»Π°ΡΡŒ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΡ€Ρ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. Π’ этом случаС ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ наступлСния ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ события, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 14.4 ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, atouMTCP, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π½Π° Web-сайтС. Для указания Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°ΡΡΡ опСрация Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΡ€Ρ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ младший Π±ΠΈΡ‚ дСскриптора события (hEvent) Π² структурС OVERLAPPED; Ρ‚ΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ наступлСния события для Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ являСтся довольно странным, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, хотя особо ΠΈ Π½Π΅ подчСркиваСтся.

ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° увСдомлСния ΠΏΠΎΡ€Ρ‚Ρƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² ΠΏΠΎΡ€Ρ‚ событиС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ вмСстС с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠΉΡΡ Π½Π΅Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetQueueCompletionStatus. Вся нСобходимая для этого информация прСдоставляСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ PostQueueCompletionStatus. 

BOOL PostQueuedCompletionStatus(HANDLE CompletionPort, DWORD dwNumberOfBytesTransferred, DWORD dwCompletionKey, LPOVERLAPPED lpOverlapped); 

Для пробуТдСния ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄Π°ΠΆΠ΅ Π² условиях отсутствия Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ²ΡˆΠΈΡ…ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΡΡƒΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² прСдоставлСнии Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ значСния ΠΊΠ»ΡŽΡ‡Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, –1. ΠžΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ значСния ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΈ эта ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΎ нСобходимости Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ.