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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Windows APIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 10

Автор А. Π›Π΅Π³Π°Π»ΠΎΠ²

 ~Thread() {

  CloseHandle(_handle);

 }

 void Resume() {

  ResumeThread(_handle);

 }

 void WaitForDeath() {

  WaitForSingleObject(_handle, 2000);

 }

private:

 HANDLE _handle;

 DWORD _tid; // thread id

};

Бинхронизация β€” это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΡΡ‚ΠΎΠ»ΡŒ интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ. Π”Π°Π²Π°ΠΉΡ‚Π΅, Π½Π°Ρ‡Π½Π΅ΠΌ со Π²Π·Π°ΠΈΠΌΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Класс Mutex β€” тонкая инкапсуляция API. Π’Ρ‹ внСдряСтС Mutexes (ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΈ) Π² ваш Активный ΠžΠ±ΡŠΠ΅ΠΊΡ‚, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΈΡ… Ρ‡Π΅Ρ€Π΅Π· Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° (Lock) β€” ΡƒΠΌΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСтся Π½Π° стСкС. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ, Π²ΠΎ врСмя обслуТивания, ваш ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ ΠΎΡ‚ Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Класс Lock β€” ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ УправлСния рСсурсами. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Lock Π²Π½ΡƒΡ‚Ρ€ΠΈ всСх ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² вашСго Активного ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ.

class Mutex {

 friend class Lock;

public:

 Mutex() {

  InitializeCriticalSection(&_critSection);

 }

 ~Mutex() {

  DeleteCriticalSection(&_critSection);

 }

private:

 void Acquire() {

  EnterCriticalSection(&_critSection);

 }

 void Release() {

  LeaveCriticalSection(&_critSection);

 }

 CRITICAL_SECTION _critSection;

};


class Lock {

public:

 // Acquire the state of the semaphore

 Lock(Mutex& mutex) : _mutex(mutex) {

  _mutex.Acquire();

 }

 // Release the state of the semaphore

 ~Lock() {

  _mutex.Release();

 }

 private:

  Mutex& _mutex;

};

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ β€” это сигнальноС устройство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Π’Ρ‹ внСдряСтС Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ (Event) Π² ваш Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π—Π°Ρ‚Π΅ΠΌ Π’Ρ‹ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚Π΅ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π² состояниС оТидания, ΠΏΠΎΠΊΠ° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ освободит Π΅Π³ΠΎ. НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ‡Ρ‚ΠΎ, Ссли ваш ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ события, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½. ИмСнно поэтому Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Release ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Flush.

class Event {

public:

 Event() {

  // start in non-signaled state (red light)

  // auto reset after every Wait

  _handle = CreateEvent(0, FALSE, FALSE, 0);

 }

 ~Event() {

  CloseHandle(_handle);

 }

 // put into signaled state

 void Release() {

  SetEvent(_handle);

 }

 void Wait() {

  // Wait until event is in signaled (green) state

  WaitForSingleObject(_handle, INFINITE);

 }

 operator HANDLE() { return _handle; }

private:

 HANDLE _handle;

};

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ эти классы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹, я ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ подсказку. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ страницС, которая ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΊΠ°ΠΊ класс ActiveObject ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Частотном Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ для асинхронной ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ дисплССв. Или, Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ Папки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ спокойно ΠΆΠ΄Π΅Ρ‚, отобраТая ΠΏΠ°ΠΏΠΊΠΈ, ΠΈ пробуТдаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° присходит ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΅Π΅ содСрТимого.

Π–Π°Π»ΡŒ, Ρ‡Ρ‚ΠΎ я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² являСтся простым. Однако, ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅, Ссли Π’Ρ‹ станСтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Ρ€Π΅ΠΊΠ»Π°ΠΌΠΈΡ€ΠΎΠ²Π°Π»: ActiveObject, Thread, Mutex, Lock ΠΈ Event. НСкоторыС ΠΈΠ· Π½ΠΈΡ… фактичСски доступны Π² MFC. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ρ‚Π°ΠΌ Π΅ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ CLock (Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ β€” это ЧАБЫ [CLock β€” ΠΈΠ³Ρ€Π° слов]?) дСструктор ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ управляСт, критичСской сСкциСй (ΠΎΠ½ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π΅Π½ ΠΈΠ·-Π·Π° Β«Π΄Π²ΡƒΡ…ΡˆΠ°Π³ΠΎΠ²ΠΎΠΉΒ» конструкции: Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Π΄Π²Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… шага β€” ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π±Ρ‹ Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄ΡƒΠΌΠ°Ρ‚ΡŒ). Π”Ρ€ΡƒΠ³ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅: MFC ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ‚ΠΎΠ½ΠΊΡƒΡŽ Ρ„Π°Π½Π΅Ρ€Ρƒ Π½Π°Π΄ API ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я прСдставил здСсь, Π°Π½Π°Π»ΠΎΠ³ΠΈ ΠΈΠ· языка программирования Java. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π’Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ свободу проСктирования ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° Π² языкС, Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ сСбС Π±Ρ‹Ρ‚ΡŒ изящными. Π˜Ρ… вСрсия ActiveObject называСтся Runnable, ΠΈ ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ run. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Java ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ встроСнный mutex ΠΈ всС, Ρ‡Ρ‚ΠΎ Π’Π°ΠΌ Π½Π°Π΄ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, β€” это ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ (ΠΈΠ»ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ) засинхронизированным. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ события Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ с оТиданиями подтвСрТдСниями Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ любого синхронизированного ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π’Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Java, Π’Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° C++ (ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π½Π°Ρ‚ΠΎΠΊΠΈ Java, Π½Π΅ освСдомлСнныС ΠΎ C++).

Π”Π°Π»Π΅Π΅: использованиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»Ρ Π·Π° ΠΏΠ°ΠΏΠΊΠ°ΠΌΠΈ.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ использованиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

Когда ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΡΡŽΡ‚ΡΡ ΠΏΠ°ΠΏΠΊΠΈ

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ А. И. Π›Π΅Π³Π°Π»ΠΎΠ²Π°

Англоязычный ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π» находится Π½Π° сСрвСрС ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Reliable Software

Π’Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ задались вопросом: ΠΊΠ°ΠΊΠΈΠΌ ΠΎΡ€Π°Π·ΠΎΠΌ ΠŸΡ€ΠΎΠ²ΠΎΠ΄Π½ΠΈΠΊ (Explorer) ΡƒΠ·Π½Π°Π΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ дСйствиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΎΠΊΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ Ρ„Π°ΠΉΠ» Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ внСшним ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ? Π‘ΠΎΠ»ΡŒΡˆΠ΅ этому ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡƒΠ΄ΠΈΠ²Π»ΡΡ‚ΡŒΡΡ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ использованиС нашСго Активного ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π° позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС ΠΈ Π΄Π°ΠΆΠ΅ большС. Π•ΡΡ‚ΡŒ нСсколько простых Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² API, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Ρƒ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ сообщила Π’Π°ΠΌ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ для Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΏΠ°ΠΏΠΎΠΊ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π’Ρ‹ устанавливаСтС Ρ‚Π°ΠΊΡƒΡŽ Π²Π°Ρ…Ρ‚Ρƒ, ваш ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ ΡΠΏΠ°Ρ‚ΡŒ, оТидая ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° событий. Ѐайловая систСма ΠΎΡ‚Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° событиС, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ Π²ΠΈΠ΄ измСнСния, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚Π΅.

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° исходных тСкстов прилоТСния FolderWatcher (zip Π°Ρ€Ρ…ΠΈΠ² 11K).

Π‘Π΅Π· дальнСйшСй суСты унаслСдуСм FolderWatcher ΠΈΠ· ActiveObject. Π—Π°Π΄Π°Π΄ΠΈΠΌ Π² качСствС источника увСдомлСния β€” событиС, Π° Π² качСствС ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° увСдомлСния β€” дСскриптор ΠΊ ΠΎΠΊΠ½Π°, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅. Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ΅ событиС установлСно Π² конструкторС FolderWatcher. Π’Π°ΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π² ΠΊΠΎΠ½Ρ†Π΅ конструктора.

class FolderWatcher : public ActiveObject {

public: FolderWatcher(char const* folder, HWND hwnd) : _notifySource (folder), _hwndNotifySink (hwnd) {

 strcpy(_folder, folder);

  _thread.Resume();

 }

 ~FolderWatcher() {

  Kill();

 }

private:

 void InitThread() {}

 void Loop();

 void FlushThread() {}

 FolderChangeEvent _notifySource;

 HWND _hwndNotifySink;

 char _folder[MAX_PATH];

};

ВсС дСйствия Π² ActiveObject происходят Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Loop. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ устанавливаСм "бСсконСчный" Ρ†ΠΈΠΊΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ событиС. Когда событиС происходит, ΠΌΡ‹ провСряСм Ρ„Π»Π°ΠΆΠΎΠΊ _isDying (ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ) ΠΈ посылаСм ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ сообщСниС WM_FOLDER_CHANGE ΠΎΠΊΠ½Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с увСдомлСниями. Π­Ρ‚ΠΎ β€” Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ сообщСниС Windows. Оно ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π½Π°ΠΌΠΈ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ увСдомлСния ΠΎ ΠΏΠ°ΠΏΠΊΠ΅ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ.

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

UINT const WM_FOLDER_CHANGE = WM_USER;


void FolderWatcher::Loop() {

 for (;;) {

  // Wait for change notification

  DWORD waitStatus = WaitForSingleObject(_notifySource, INFINITE);

  if (WAIT_OBJECT_0 == waitStatus) {

   // If folder changed

   if (_isDying) return;

   PostMessage(_hwndNotifySink, WM_FOLDER_CHANGE, 0, (LPARAM)_folder);

   // Continue change notification

   if (!_notifySource.ContinueNotification()) {

    // Error: Continuation failed

    return;

   }

  } else {

   // Error: Wait failed

   return;

  }

 }

}

Рассмотрим, Ρ‡Ρ‚ΠΎ происходит Π² ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° нашС ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ сообщСниС. ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° OnFolderChange. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ. Π’ ΠŸΡ€ΠΎΠ²ΠΎΠ΄Π½ΠΈΠΊΠ΅ (Explorer) ΠΎΠ½ Ρ€Π΅Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ содСрТимого ΠΏΠ°ΠΏΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ наблюдаСм. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ простоС ΠΎΠΊΠ½ΠΎ сообщСния. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ имя ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠΈ ΠΊΠ°ΠΊ LPARAM. Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ WPARAM ΠΈ LPARAM, Π² сообщСнии, опрСдСляСмом ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

ΠœΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ, ΠΠ°Π±Π»ΡŽΠ΄Π°Ρ‚Π΅Π»ΡŒ Папки β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°.

case WM_FOLDER_CHANGE:

 pCtrl->OnFolderChange(hwnd, (char const *)lParam);

 return 0;


void Controller::OnFolderChange(HWND hwnd, char const * folder) {

 MessageBox(hwnd, "Change Detected, "Folder Watcher", MB_SETFOREGROUND | MB_ICONEXCLAMATION | MB_OK);

}


class Controller {

public:

 Controller(HWND hwnd, CREATESTRUCT * pCreate);

 ~Controller();

 void OnFolderChange(HWND hwnd, char const *folder);

private: