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

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

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

ΠŸΠ΅Ρ€ΡŒΡ ΠΈ кисти Π²Π½ΡƒΡ‚Ρ€ΠΈ классов

РисованиС ΠΏΠ΅Ρ€ΡŒΡΠΌΠΈ ΠΈ Ρ€Π°ΡΠΊΡ€Π°ΡˆΠΈΠ²Π°Π½ΠΈΠ΅ кистями

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

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

Подобно Тивописцу, Π’Ρ‹ Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚Π΅ΡΡŒ Π² ΠΏΠ΅Ρ€ΡŒΡΡ… ΠΈ кистях, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡˆΠ΅Π΄Π΅Π²Ρ€ Π½Π° вашСм холстС. Когда Π’Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Canvas::Line ΠΈΠ»ΠΈ Canvas::Rectangle, Windows ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ установки ΠΏΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ½ΠΈΠΈ, ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ установки кисти, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹.

Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сопоставляСтся с Π₯олстом, нСльзя Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Π³ΠΎ послС окончания Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π­Ρ‚ΠΎ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ обСспСчитС Ρ‚Π°ΠΊΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° языкС C++. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ‡ΡŒΠΈ конструкторы ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚, Π° дСструкторы (Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ автоматичСски, ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ области дСйствия) ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (см. страницу Β«Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ рСсурсами» для Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ знакомства с этой ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΆΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ HDC (дСскрипторы контСкстов устройств) Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² ΠΈΡ… конструкторах. Однако, Π²Π·Π°ΠΌΠ΅Π½ этого, Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Canvas. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Β«Π₯олст» ΠΌΠΎΠΆΠ΅Ρ‚ автоматичСски ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΊ HDC.

class StockObject {

public:

 StockObject(HDC hdc, int type) : _hdc(hdc) {

  _hObjOld = SelectObject(_hdc, GetStockObject(type));

 }

~StockObject () {

 SelectObject(_hdc, _hObjOld);

 }

private:

 HGDIOBJ _hObjOld;

 HDC _hdc;

};

Windows ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€ΡŒΠ΅Π² ΠΈ кистСй. Если Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…, Ρ‚ΠΎ достаточно ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€ΡŒΡ ΠΈ кисти ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ холсту Π½Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя.

class WhitePen : public StockObject {

public:

 WhitePen(HDC hdc): StockObject(hdc, WHITE_PEN) {}

};


// example

void Controller::Paint(HWND hwnd) {

 PaintCanvas canvas(hwnd);

 WhitePen pen(canvas);

 canvas.Line(0, 10, 100, 10);

 // destructor of WhitePen

 // destructor of PaintCanvas

}

Если ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ использованиС нСсколько ΠΏΠ΅Ρ€ΡŒΠ΅Π², ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² Windows, Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΡ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π½Π΅Π΄Ρ€ΠΈΠ² ΠΈΡ… Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ View) ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ PenHolder, для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ присоСдинСния ΠΊ Π₯олсту.

class Pen {

public:

 Pen(COLORREF color) {

  _hPen = CreatePen(PS_SOLID, 0, color);

 }

 ~Pen() {

  DeleteObject(_hpen);

 }

 operator HPEN() {

  return _hPen;

 }

private:

 HPEN _hPen;

};


class PenHolder {

public:

 PenHolder(HDC hdc, HPEN hPen) : _hdc (hdc) {

  _hPenOld = (HPEN)SelectObject (_hdc, hPen);

 }

 ~PenHolder() {

  SelectObject(_hdc, _hPenOld);

 }

private:

 HDC _hdc;

 HPEN _hPenOld;

};


class View {

public:

 View() : _penGreen (RGB (0, 255, 128)) {}

 void Paint(Canvas& canvas) {

  PenHolder holder(canvas, _penGreen);

  canvas.Line(0, 10, 100, 10);

  // destructor of PenHolder

 }

private:

 Pen _penGreen;

};

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ссли ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° нуТдаСтся Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ†Π²Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΠ΅Ρ€ΡŒΡΡ…, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ всСх Ρ†Π²Π΅Ρ‚ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π°Ρ‚ΡŒΡΡ, Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΠ΅Ρ€ΡŒΡ. Когда Π’Ρ‹ опрСдСляСтС автоматичСский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ColorPen, Π΅Π³ΠΎ конструктор создаСт ΠΈ присоСдиняСт ΠΏΠ΅Ρ€ΠΎ. Когда, Π² ΠΊΠΎΠ½Ρ†Π΅ области дСйствия, вызываСтся дСструктор, ΠΎΠ½ отсоСдиняСт ΠΏΠ΅Ρ€ΠΎ ΠΈ удаляСт Π΅Π³ΠΎ.

class ColorPen {

public:

 ColorPen(HDC hdc, COLORREF color) : _hdc (hdc) {

  _hPen = CreatePen(PS_SOLID, 0, color);

  _hPenOld = (HPEN)SelectObject(_hdc, _hPen);

 }

 ~ColorPen() {

   SelectObject(_hdc, _hPenOld);

   DeleteObject(_hPen);

 }

private:

 HDC _hdc;

 HPEN _hPen;

 HPEN _hPenOld;

};

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ способом Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с кистями (кистСй, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Windows, Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС, Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€ΡŒΠ΅Π²). Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π½ΠΈΠΆΠ΅ даСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ColorBrush.

class ColorBrush {

public:

 ColorBrush(HDC hdc, COLORREF color) : _hdc (hdc) {

  _hBrush = CreateSolidBrush(color);

  _hBrushOld = (HBRUSH)SelectObject(_hdc, _hBrush);

 }

 ~ColorBrush() {

  SelectObject(_hdc, _hBrushOld);

  DeleteObject(_hBrush);

 }

private:

 HDC _hdc;

 HBRUSH _hBrush;

 HBRUSH _hBrushOld;

};

Как всСгда, ΠΌΡ‹ пощряСм Π’Π°ΡˆΠΈ собствСнныС экспСримСнты.

Π”Π°Π»Π΅Π΅: ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ иная Ρ‚Π΅ΠΌΠ° β€” Β«ΠŸΠΎΡ‚ΠΎΠΊΠΈΒ».

Классовая ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

ИспользованиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

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

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

ΠœΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹Ρ… аспСктов программирования. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, для Π½Π΅Π΅ Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ простой Π½Π°Π±ΠΎΡ€ абстракций ΠΈ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅. Π’ ОО ΠΌΠΈΡ€Π΅, СстСствСнным Π°Π½Π°Π»ΠΎΠ³ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ, чисто ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠΉ абстракциСй, слуТит «Активный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Β». Активный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ асинхронно выполняСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ всСм Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ (Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ) Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ интСрфСйс Активного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° доступСн внСшним Π°Π³Π΅Π½Ρ‚Π°ΠΌ (Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ основному ΠΏΠΎΡ‚ΠΎΠΊΡƒ, ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, нСсущСму сообщСния Windows). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ состояниСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ эта манипуляция осущСствляСтся ΠΈΠ· ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π₯отя, Ρ€Π΅ΠΆΠΈΠΌ управлСния ΠΏΡ€ΠΈ этом сильно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½.

Активный ΠžΠ±ΡŠΠ΅ΠΊΡ‚ сформирован ΠΊΠ°ΠΊ каркас ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ActiveObject. ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса, ΠΊΠ°ΠΊ прСдполагаСтся, обСспСчиваСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ для чистых Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² InitThread, Run ΠΈ Flush (Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ написаниС дСструктора).

class ActiveObject {

public:

 ActiveObject();

 virtual ~ActiveObject() {}

 void Kill();

protected:

 virtual void InitThread() = 0;

 virtual void Run() = 0; virtual void FlushThread() = 0;

 static DWORD WINAPI ThreadEntry(void *pArg);

 int _isDying;

 Thread _thread;

};

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ класса ActiveObject ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, пСрСдавая Π΅ΠΌΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ прСдполагаСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ "this" Π½Π° сСбя. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠ± использовании "this" Π΄ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ создаСтся Π² Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ состоянии. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, сто конструктор ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ _thread.Resume() Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ.

// The constructor of the derived class

// should call

// _thread.Resume ();

// at the end of construction

ActiveObject::ActiveObject() : _isDying (0),

#pragma warning(disable: 4355) // 'this' used before initialized

 _thread(ThreadEntry, this)

#pragma warning(default: 4355)

{ }

ΠœΠ΅Ρ‚ΠΎΠ΄ Kill Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ FlushThread β€” это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ· любого состояния оТидания ΠΈ Π΄Π°Π΅Ρ‚ Π΅ΠΌΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ _isDying для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ„Π»Π°ΠΆΠΊΠ°.

void ActiveObject::Kill() {

 _isDying++;

 FlushThread();

 // Let's make sure it's gone

 _thread.WaitForDeath();

}

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅ΠΌ каркас для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ThreadEntry (это β€” статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ класса ActiveObject, поэтому ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ соглашСниС ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°Ρ…, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ API). Π­Ρ‚Π° функция выполняСтся ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΎΡ‚ систСмы являСтся Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ конструктору ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° β€” это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ "this" Активного ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π°. API ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ void-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, поэтому ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ явноС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ указатСля Π½Π° ActiveObject. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ ΠΎΠ²Π»Π°Π΄Π΅Π²Π°Π΅ΠΌ Активным ΠžΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ чистый Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ InitThread, Π΄Π΅Π»Π°Ρ‚ΡŒ всС спСцифичСскиС для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ приготовлСния, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ основной Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Run. РСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Run оставлСна ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ каркаса.

DWORD WINAPI ActiveObject::ThreadEntry(void* pArg) {

 ActiveObject* pActive = (ActiveObject*)pArg;

 pActive->InitThread();

 pActive->Run();

 return 0;

}

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Thread β€” это тонкая инкапсуляция API. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ„Π»Π°ΠΆΠΎΠΊ CREATE_SUSPENDED, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‚ΡŒ Π½Π΅ Π½Π°Ρ‡Π½Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΌΡ‹ Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ конструированиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ActiveObject.

class Thread {

public:

 Thread(DWORD(WINAPI* pFun)(void* arg), void* pArg) {

  _handle = CreateThread(

   0, // Security attributes

   0, // Stack size

   pFun, pArg, CREATE_SUSPENDED, &_tid);

 }

 ~Thread() {

  CloseHandle(_handle);

 }

 void Resume() {