C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Использование класса CEvent / Классы. / Visual C++ .NET

Использование класса CEvent

Взаимоисключения

Данный объект поъож на критическую секцию, но может работать на уровнепотоков различных прочессов(приложений). Методы Locl и Unlock этогокласса работают так же, как и для критической секции. Единственное отличие заключается в том, что фукнция Lock не может иметь параметра.

Представлю конструктор класса:

CMutex
(
   BOOL bInitiallyOwn = false,
   LPCTSTE lpszName = NULL,
   LPSECURITY_ATTRINUTES lpsaAttribute = NULL
)

Первый параметр задаёт начальное состояние объекта, если true, то состояние - "сброшен". Последний параметр носит аналогичную природу, что и для потока. А вот второй параметр позволяет создавать именованный объект "взаимоисключение". При попытке создания ещё одного объекта с тем же именем будет генерироваться исключение типа CresourceWxception.

CEvent

Здесь ма рассмотрим пример программы использующая класс CEvent. Посредством нажатия кнопки запускается два потока. Оба потока пользуются общим ресурсом - переменной theApp.m_che. Для разделения доступа используются два объекта синхронизации, создаваемые посредством класса CEvent. Еще один объект синхронизации используется в вспомогательных целях для синхронизации окончания работы обоих потоков. Первый поток помещает в общий ресурс символ, а второй берет этот символ и печатает его в диалоговом окне. Как мы уже сказали, оба эти действия синхронизированы.

Модуль event.h

#pragma once

#ifndef __AFXWIN_H__
	#error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h"


class CeventApp : public CWinApp
{
public:
	CeventApp();

	public:
		char m_ch;
	virtual BOOL InitInstance();


	DECLARE_MESSAGE_MAP()
};

extern CeventApp theApp;

модуль event.cpp

#include "stdafx.h"
#include "event.h"
#include "eventDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CeventDlg * dlg;

BEGIN_MESSAGE_MAP(CeventApp, CWinApp)
	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()



CeventApp::CeventApp()
:m_ch(0)
{

}


CeventApp theApp;


BOOL CeventApp::InitInstance()
{
	InitCommonControls();

	CWinApp::InitInstance();

	dlg = new CeventDlg;
	m_pMainWnd = dlg;
	INT_PTR nResponse = dlg->DoModal();
	if (nResponse == IDOK)
	{

	}
	else if (nResponse == IDCANCEL)
	{

	}

	return FALSE;
}

модульeventDlh.h

#pragma once
#include "afxmt.h"

class CeventDlg : public CDialog
{
public:
	CeventDlg(CWnd* pParent = NULL);	
	enum { IDD = IDD_EVENT_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	


protected:
	HICON m_hIcon;

	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CEvent ev1;
	CEvent ev2;
	CEvent ev3;
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedOk();
	afx_msg void OnBnClickedCancel();
};

модуль eventDlg.cpp

#include "stdafx.h"
#include "event.h"
#include "eventDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

UINT thr1(LPVOID);
UINT thr2(LPVOID);
extern CeventDlg * dlg;


CeventDlg::CeventDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CeventDlg::IDD, pParent), ev1(), ev2(), ev3()
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CeventDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CeventDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
	ON_BN_CLICKED(IDOK, OnBnClickedOk)
	ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
END_MESSAGE_MAP()


BOOL CeventDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE);	
	SetIcon(m_hIcon, FALSE);	
	
	return TRUE;  
}

void CeventDlg::OnPaint() 
{
	CDialog::OnPaint();
}

HCURSOR CeventDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CeventDlg::OnBnClickedButton1()
{
	dlg->ev1.ResetEvent();
	dlg->ev2.ResetEvent();
	dlg->ev3.ResetEvent();
	AfxBeginThread(thr1, 0, THREAD_PRIORITY_NORMAL);
	AfxBeginThread(thr2, 0, THREAD_PRIORITY_NORMAL);
}

void CeventDlg::OnBnClickedOk()
{
	OnOK();
}

void CeventDlg::OnBnClickedCancel()
{
	OnCancel();
}

UINT thr1(LPVOID param)
{
	char * ch="Вывод строки";
	int i;
	for(i=0; i<strlen(ch); i++)
	{
		theApp.m_ch=ch[i];
		dlg->ev2.SetEvent();
		::WaitForSingleObject(dlg->ev1.m_hObject,INFINITE);
		dlg->ev1.ResetEvent();
	}
	dlg->ev3.SetEvent();
	return 0;
}

UINT thr2(LPVOID param)
{
	char s[2];
	s[1]=0;
	int i=10;
	CDC *dc = dlg->GetDC();
lo:
	::WaitForSingleObject(dlg->ev2.m_hObject,INFINITE);
	dlg->ev2.ResetEvent();
	s[0]=theApp.m_ch;
	dc->TextOut(i,10,s);
	dlg->ev1.SetEvent();
	i=i+15;
	if(::WaitForSingleObject(dlg->ev3.m_hObject,0)==WAIT_OBJECT_0)
	{
		dc->DeleteDC();
		return 0;
	}
	goto lo;
	return 0;
}