Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 19.06.2010, 10:46   #1
session
Пользователь
 
Регистрация: 18.06.2010
Сообщений: 14
По умолчанию События

Задание: самостоятельно с использованием механизма событий добейтесь корректного выполнения программы (в каждой строке должны быть одинаковые числа, значения следующей строки должны быть больше на единицу чисел предыдущей строки):
есть потоки:
Код:
int a[5];
int num;
  
void Thread1( void* pParams )
{
	int i;
	while ( true )
	{
		for (i = 0; i < 5; i++ ) 
		{
			a[i] = num;
			
		}
		num++;
	}
}

void Thread2( void* pParams )
{
	num = 0;
	while( TRUE )
	{
		printf( "%d %d %d %d %d\n",a[ 0 ], a[ 1 ], 
			a[ 2 ], a[ 3 ], a[ 4 ] );
	}
}
В таком случае воспользуемся механизмом событий: поток «Thread 1» заполняет массив, вызывает событие hEvent1, на которое реагирует поток «Thread 2», выводящий массив на экран. Механизм событий реализуется следующим образом:

Код:
HANDLE hEvent1, hEvent2;
...
hEvent1 = CreateEvent( NULL, false, true, NULL );
hEvent2 = CreateEvent( NULL, false, false, NULL );
...
WaitForSingleObject( hEvent1, INFINITE );
// Код реагирования на событие
SetEvent( hEvent2 );
Функция CreateEvent() регистрирует новое событие в системе. Её третий аргумент определяет, вызывать данное событие сейчас или нет.
Функция WaitForSingleObject() устанавливает задержку дальнейшего выполнения кода потока до появления в системе определённого события. Второй аргумент – число миллисекунд, в течение которого происходит ожидание данного события. В случае если событие не появилось в течение заданного времени, выполнение кода программы продолжается. Задание: выяснить, что означает значение INFINITE?
Функция SetEvent() вызывает появлении в системе заданного события.

вот такое задание. даны фрагменты программы, нужно собрать одну, используя механизм событий.если возможно, объясните какую функцию в каком месте программы ставить

Последний раз редактировалось MaTBeu; 19.06.2010 в 21:11.
session вне форума
Старый 19.06.2010, 14:06   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Вместо бесконечного цикла в потоках лучше сделать ограниченное количество итераций (или условие выхода добавить). Допустим потоки будут циклически запускать друг друга, причём один в некоторый момент завершится, а другой будет ждать пока ему передадут управление.
Код:
#include <stdio.h>
#include <windows.h>

HANDLE hEvent1, hEvent2, hThread1, hThread2;
int a[5];
int num;

DWORD WINAPI Thread1( void* pParams )
{
    for (int k=0;k<20;k++)
    {
        if(WaitForSingleObject(hEvent1, 3000) == WAIT_TIMEOUT)
        //если нет возврата от 2-го потока более 3 сек, завершаем поток
        {
            printf("time out, odnako\n");
            ExitThread(0);
        }
        for (int i = 0; i < 5; i++ )
        a[i] = num;
        num++;
        ResetEvent(hEvent1);
        SetEvent(hEvent2);
    }
}

DWORD WINAPI Thread2( void* pParams )
{
    for (int k=0;k<10;k++)
    {
        WaitForSingleObject(hEvent2, INFINITE);//ожидаем до появления события
        printf( "%d %d %d %d %d\n",a[ 0 ], a[ 1 ], a[ 2 ], a[ 3 ], a[ 4 ] );
        ResetEvent(hEvent2);
        printf("wait...\n");
        SetEvent(hEvent1);
    }
}

int main(int argc, char *argv[])
{
    hThread1=CreateThread(NULL,0,Thread1,NULL,0,NULL);//создаём потоки
    hThread2=CreateThread(NULL,0,Thread2,NULL,0,NULL);
    hEvent1 = CreateEvent( NULL, false, true, NULL );//создаём события
    hEvent2 = CreateEvent( NULL, false, false, NULL );
    WaitForSingleObject(hThread1,INFINITE);//ждём конца потоков
    WaitForSingleObject(hThread2,INFINITE);
    system("PAUSE");
    return EXIT_SUCCESS;
}
eoln вне форума
Старый 21.06.2010, 17:16   #3
session
Пользователь
 
Регистрация: 18.06.2010
Сообщений: 14
По умолчанию

огромное вам спасибовы молодец
session вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
События в игре ZotaC Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 20.02.2010 20:32
C# события ,WinForm bondik Общие вопросы .NET 4 08.02.2010 20:24
События yarilo JavaScript, Ajax 3 28.01.2010 23:18
События DBGrid Sparky Компоненты Delphi 0 23.08.2009 20:26
События компонентов EdNovice Общие вопросы .NET 4 14.03.2009 10:32