MessageBox(NULL, "Событие произошло!", "Информация",MB_OK);
}
else
{
cout<<"Set event\n";
SetEvent(event);
}
CloseHandle(event);
}
Приложение 2.
//Программа ExEv1.cpp
// Тип приложения Win32 Console
// Демонстрация использования события для синхронизации процессов.
// Данная программа ExEv1 после создания исполняемого файла
// запускается командой меню Пуск|Выполнить
// Она создает событие с именем "Ev1" и затем файл и записывает в него строку
// Выполнив операции с файлом, она выводит диалоговое окно "Сообщение",
// которое не следует закрывать до запуска другой программы ExEv2.cpp
// Программа ExEv2 запускается также из меню Пуск|Выполнить
// см. далее комментарии к программе ExEv2
#include <fcntl.h>
#include <io.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char *s = "Строка 1.";
HANDLE Event1;
int handle;
// создание события
Event1 = CreateEvent(NULL,FALSE,FALSE, "Ev1");
// операции создания и записи в файл
if ((handle = open("c:\\мои документы\\Myfile1.txt",
O_WRONLY | O_CREAT ))==-1)
{
MessageBox(NULL, "Файл создать не удалось", "Ошибка", MB_OK);
return -1;
}
write(handle, s, strlen(s)+1);
close(handle);
// Установка события
MessageBox(NULL, "Для установки события нажмите OK", "Сообщение", MB_OK);
SetEvent(Event1);
return 0;
}
// Программа ExEv2
// Тип приложения Win32 Console
// Программа, связанная с программой ExEv1 . Программа ExEv2 запускается из
// меню Пуск|Выполнить до закрытия окна "Сообщение".
// Она открывает созданное в ExEv1 событие "Ev1" и с помощью
// функции WaitForSingleObject() проверяет его состояние (сигнальное или не- // сигнальное)
// После нажатия кнопки "OK" программа ExEv1 функцией SetEvent()
// устанавливает событие "Ev1" в сигнальное состояние и после этого
// функция WaitForSingleObject()
// разрешает открытие файла, созданного в программе ExEv1,
// и добавление в него новой строки
// При окончании программа закрывает событие
// Примечание: Если после создания файла программой ExEv1 ему устанавливает-// ся атрибут "Только для чтения", то до запуска программы ExEv2 следует // снять этот атрибут
#include <windows.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <io.h>
int main(void)
{
char *s1 = "Строка 2.";
int handle1, res;
HANDLE h1;
// Открытие события
h1=OpenEvent(NULL, FALSE, "Ev1");
// Проверка состояния мьютекса
WaitForSingleObject(h1, INFINITE);
if ((handle1 = open("c:\\мои докумен ты\\Myfile1.txt",O_WRONLY|O_APPEND))==-1)
{
MessageBox(NULL, "Файл открыть не удалось", "Ошибка", MB_OK);
}
res = write(handle1, s1, strlen(s1)+1);
printf("\n Wrote %d symbols", res);
close(handle1);
printf("\n Press any key");
getchar();
// Закрытие события
CloseHandle(h1);
return 0;
}
Приложение 3
//Программа демонстрации работы мьютекса
//При запуске программа получает во владение мьютекс
//При повторном запуске программа не может получить мьютекс,
//пока не завершится работа первого экземпляра программы
// Тип приложения Win32, Console
#include <windows.h>
#include <iostream.h>
void main()
{
HANDLE mutex=CreateMutex(NULL, FALSE, "Mutex");//Создание мъютекса
cout<<"Test mutex\n";
cout.flush();
//Определение состояния мьютекса
WaitForSingleObject(mutex, INFINITE);
cout << "\n Mutex obtain!\n";
cout.flush();
MessageBox(NULL, "Программа владеет мьютексом", "МЬЮТЕКС", MB_OK);
//Освобождение мьютекса
ReleaseMutex(mutex);
CloseHandle(mutex);
}
Приложение 4
// Программа демонстрации использования семафоров для синхронизации потоков
// Основной поток создает семафор и устанавливает его в состояние нуль
// ("семафор закрыт"). Этот поток создает файл, записывает в него строку,
// закрывает файл и до освобождения семафора запускает новый поток,
// который должен открыть файл, прочитать из него строку символов и вывести // её на экран. После запуска нового потока и перевода его в состояние
// ожидания освобождения семафора основной поток переводит его в сигналь- // ное состояние,
// в результате второй поток получает возможность выполнить свою работу
// Тип приложения - Win32 Console, Multithread
#include <fcntl.h>
#include <io.h>
#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
char *s = "Hello!";
HANDLE semaphre1;
// функция, исполняемая в созданном потоке
void thread_code(void *threadno)
{
char s1[5];
int handle1;
DWORD a;
// Определение состояния семафора
a = WaitForSingleObject(semaphore1, INFINITE);
if (a == WAIT_OBJECT_0) { // Если семафор освобожден
// Открытие и чтение файла
handle1 = open("c:\\мои документы\\Myfile2.txt",O_RDONLY|O_BINARY) ;
printf("\n File open success!");
read(handle1, s1, strlen(s)+1);
close(handle1);
printf("\n\n s1==%s", s1 );
}
_endthread(); // Окончание работы второго потока
}
// функция создания второго потока
void start_thread(int i)
{
int thread_id;
#if defined(__WIN32__)
if (( thread_id = _beginthread(thread_code,4096,(void *)i)) ==
(unsigned long)-1)
#else
if ((thread_id = _beginthread(thread_code,4096,(void *)i)) == -1)
#endif
{
printf("Unable to create thread %d, errno = %d\n",i,errno);
return;
}
printf("\n Created thread %d, ID = %ld\n",i,thread_id);
}
int main(void)
{
int i =1;
int handle;
// Создание семафора
semaphore1 = CreateSemaphore(NULL,0,1, "Semr1");
// Создание и запись в файл
if ((handle = open("c:\\мои документы\\Myfile2.txt",
O_WRONLY | O_CREAT | O_BINARY))==-1)
{
MessageBox(NULL, "Файл создать не удалось", "Ошибка", MB_OK);
return -1;
}
write(handle, s, strlen(s)+1);
close(handle);
// Запуск второго потока
start_thread(i);
// Перевод семафора в сигнальное состояние
MessageBox(NULL, "Для освобождения семафора нажмите OK", "Сообщение", MB_OK);
ReleaseSemaphore(semaphore1,1,0);
// Завершение работы программы
printf("\n\n Press <Enter> for end program");
getchar();
return 0;
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.