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

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

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

 DWORD ic;

 nDone++;

 ic = (DWORD)(pOv->hEvent);

 CurPosIn.LowPart = OverLapIn[ic].Offset;

 CurPosIn.HighPart = OverLapIn[ic].OffsetHigh;

 if (CurPosIn.QuadPart < FileSize.QuadPart) {

  ReadFileEx(hInputFile, AsRec[ic], REC_SIZE, &OverLapIn[ic], ReadDone);

 }

 return;

}

Асинхронный Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄ сиспользованиСм Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ΠŸΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ асинхронного выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… СдинствСнного ΠΏΠΎΡ‚ΠΎΠΊΠ°, хотя для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ОБ создаСт собствСнныС ΠΏΠΎΡ‚ΠΎΠΊΠΈ. Π’ Ρ‚ΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ этого Ρ‚ΠΈΠΏΠ° часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ€Π°Π½Π½ΠΈΡ… ОБ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌ выполнСния асинхронных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… систСмах.

Однако Windows обСспСчиваСт ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ, поэтому становится Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ достиТСниС Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ эффСкта Π·Π° счСт выполнСния синхронных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ…, выполняСмых нСзависимо ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. Π Π°Π½Π΅Π΅ эти возмоТности ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ продСмонстрированы Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… сСрвСров ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ grepMT (Π³Π»Π°Π²Π° 7). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ простой способ выполнСния асинхронных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… 14.1 ΠΈ 14.2, ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ собствСнный дСскриптор Ρ„Π°ΠΉΠ»Π°, ΠΈ Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ Π±Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π² синхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΡƒΡŽ запись.

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ atouMT.с, которая находится Π½Π° Web-сайтС, содСрТатся ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… "Π»ΠΎΠ²ΡƒΡˆΠ΅ΠΊ", ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄ΠΆΠΈΠ΄Π°Ρ‚ΡŒ вас ΠΏΡ€ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ доступа ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Ρƒ. Π’ частности, всС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ дСскрипторы Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateHandle, Π° Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DuplicateHandle.

Π›ΠΈΡ‡Π½ΠΎ я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°ΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ„Π°ΠΉΠ»ΠΎΠ², Π° Π½Π΅ асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. ΠŸΠΎΡ‚ΠΎΠΊΠΈ Π»Π΅Π³Ρ‡Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΎΠ½ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

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

Π’Π°ΠΉΠΌΠ΅Ρ€Ρ‹ оТидания

Windows NT ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ оТидания (waitable timers), ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ядра, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅.

Π’Ρ‹ всСгда ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ собствСнный сигнал синхронизации, создав ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливаСт событиС Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ пробуТдСния послС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Sleep. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ serverNP (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 11.3) сСрвСр Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ для пСриодичСской ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ рассылки ΠΈΠΌΠ΅Π½ΠΈ своСго ΠΊΠ°Π½Π°Π»Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ оТидания ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ хотя ΠΈ нСсколько ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ, Π½ΠΎ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ выполнСния Π·Π°Π΄Π°Ρ‡ Π½Π° пСриодичСской основС ΠΈΠ»ΠΈ Π² соотвСтствии с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ расписаниСм. Π’ частности, Ρ‚Π°ΠΉΠΌΠ΅Ρ€ оТидания ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сигнал Π±Ρ‹Π» сгСнСрирован Π² строго ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ врСмя.

Π’Π°ΠΉΠΌΠ΅Ρ€ оТидания ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ (synchronization timer), Π»ΠΈΠ±ΠΎ сбрасываСмым Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡŽΡ‰ΠΈΠΌ (manual-reset notification timer) Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠΌ. Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ связываСтся с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ косвСнного Π²Ρ‹Π·ΠΎΠ²Π°, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ для синхронизации ΠΏΠΎ сбрасываСмому Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡŽΡ‰Π΅ΠΌΡƒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция оТидания.

Для Π½Π°Ρ‡Π°Π»Π° потрСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ дСскриптор Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ для этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CreateWaitableTimer. 

HANDLE CreateWaitableTimer(LPSECURITY_ATTRIBUTES lpTimerAttributes, BOOL bManualReset, LPCTSTR lpTimerName);

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, bManualReset, опрСдСляСт, Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ создан β€” ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ»ΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡŽΡ‰ΠΈΠΉ. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 14.3 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€, Π½ΠΎ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈ настройку ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π²Ρ‹ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡŽΡ‰ΠΈΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ сущСствуСт Ρ‚Π°ΠΊΠΆΠ΅ функция OpenWaitableTimer, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ имя, прСдоставляСмоС Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ.

ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ создаСтся Π² Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ состоянии, Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetWaitableTimer Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ пСриодичСски Π²Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ сигналами.

BOOL SetWaitableTimer(HANDLE hTimer, const LARGE_INTEGER *pDueTime, LONG IPeriod, PTIMERAPCROUTINE pfnCompletionRoutine, LPVOID lpArgToCompletionRoutine, BOOL fResume); 

hTimer β€” Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ дСскриптор Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, созданного с использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateWaitableTimer.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ pDueTime, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠΌΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π»ΠΈΠ±ΠΎ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ фактичСскиС значСния Π²Ρ‹Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ 100 наносСкунд, Π° ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ описываСтся структурой FILETIME. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΠ° FILETIME Π±Ρ‹Π»ΠΈ Π²Π²Π΅Π΄Π΅Π½Ρ‹ Π² Π³Π»Π°Π²Π΅ 3 ΠΈ ΡƒΠΆΠ΅ использовались Π½Π°ΠΌΠΈ Π² Π³Π»Π°Π²Π΅ 6 Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ timep (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 6.2).

Π’Π΅Π»ΠΈΡ‡ΠΈΠ½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° ΠΌΠ΅ΠΆΠ΄Ρƒ сигналами, указываСмая Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅, выраТаСтся Π² миллисСкундах. Если это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ установлСно Ρ€Π°Π²Π½Ρ‹ΠΌ 0, Ρ‚ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ пСрСводится Π² сигнальноС состояниС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… значСниях этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚Π°ΠΉΠΌΠ΅Ρ€ являСтся пСриодичСским ΠΈ срабатываСт пСриодичСски Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π΅Π³ΠΎ дСйствиС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CancelWaitableTimer. ΠžΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° Π½Π΅ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ.

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

Установив ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ пСрСвСсти ΠΏΠΎΡ‚ΠΎΠΊ Π² состояниС Π΄Π΅ΠΆΡƒΡ€Π½ΠΎΠ³ΠΎ оТидания ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SleepEx, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. Π’ случаС сбрасываСмого Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡŽΡ‰Π΅Π³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° слСдуСт ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° дСскриптора Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π² сигнальноС состояниС. ДСскриптор Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² сигнальном состоянии Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetWaitableTimer. Полная вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ 14.3, находящаяся Π½Π° Web-сайтС, прСдоставляСт Π²Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ собствСнныС экспСримСнты, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² сочСтании с ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° дСскриптора Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π² сигнальноС состояниС, Ρ‡Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π΄Π°Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ.

ПослСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, fResume, связан с Ρ€Π΅ΠΆΠΈΠΌΠ°ΠΌΠΈ энСргосбСрСТСния. Для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ этому вопросу ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ справочной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Ѐункция CancelWaitableTimer ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ дСйствия Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄ этим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetWaitableTimer, Π½ΠΎ ΠΏΡ€ΠΈ этом Π½Π΅ измСняСт сигнальноС состояниС Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Π§Ρ‚ΠΎΠ±Ρ‹ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Ρ€Π°Π· Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SetWaitableTimer.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: использованиС Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° оТидания

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 14.3 дСмонстрируСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° оТидания для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ пСриодичСских сигналов.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 14.3. TimeBeep: гСнСрация пСриодичСских сигналов 

/* Π“Π»Π°Π²Π° 14. TimeBeep.с. ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠ΅ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅.  */

/* ИспользованиС: TimeBeep ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ (Π² миллисСкундах). */


#include "EvryThng.h"

static BOOL WINAPI Handler(DWORD CntrlEvent);

static VOID APIENTRY Beeper(LPVOID, DWORD, DWORD);

volatile static BOOL Exit = FALSE;

HANDLE hTimer;


int _tmain(int argc, LPTSTR argv[]) {

 DWORD Count = 0, Period;

 LARGE_INTEGER DueTime;

 /* ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ наТатия ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш <Ctrl-c> для прСкращСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π‘ΠΌ. Π³Π»Π°Π²Ρƒ 4. */

 SetConsoleCtrlHandler(Handler, TRUE);

 Period = _ttoi(argv[1]) * 1000;

 DueTime.QuadPart = –(LONGLONG)Period * 10000;

 /* ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ DueTime ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»Π΅Π½ для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° оТидания ΠΈ задаСтся ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ оТидания измСряСтся Π² мс (10-3 с), a DueTime β€” Π² Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… ΠΏΠΎ 100 Π½c (10-7 с) для согласования с Ρ‚ΠΈΠΏΠΎΠΌ FILETIME. */