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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2010, 16:26   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Объединение файлов

Добрый вечер! Дана задача:Даны два файла, содержащие упорядоченные последовательности чисел. Написать программу, выполняющую слияние этих файлов в один таким образом, чтобы выборку данных из файлов и формирование результирующего файла выполняли три разных потока. Каждый из потоков выборки данных может прочитать очередное значение из своего файла только тогда, когда поток формирования результата передал соответствующее число в файл. Поток формирования результата может выполнять обработку данных только тогда, когда оба потока выборки предоставили ему данные.
Вот что написала:
Код:
// file_join.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"
#include "iostream"
	
//=============================================================================================================
//				описание данных
//=============================================================================================================
	FILE *file_in1, *file_in2, *file_out;	//файловая переменная
	char* file_name_1 = "input1.txt";	//имя файла
	char* file_name_2 = "input2.txt";	//имя файла
	char* file_name_3 = "output.txt";	//имя файла
	HANDLE hEvent_1;	//событие считать из первого
	HANDLE hEvent_2;	//событие считать из второго
	HANDLE hEvent_3;	//событие записать в третий
	char in1,in2;	//для временного хранения

//=============================================================================================================
//			функции и процедуры
//=============================================================================================================
DWORD WINAPI read_one(void *data)
{	
	while(!feof(file_in1))
	{
		WaitForSingleObject(hEvent_1,INFINITE);	//дожидается наступления события взять из первого
		fscanf(file_in1,"%c",&in1);
		ResetEvent(hEvent_1);
		SetEvent(hEvent_2);
	}
	return 0;
}

DWORD WINAPI read_two(void *data)
{
	while(!feof(file_in2))
	{
		WaitForSingleObject(hEvent_2,INFINITE);	//дожидается наступления события взять из второго
		fscanf(file_in2,"%c",&in2);
		ResetEvent(hEvent_2);
		SetEvent(hEvent_3);
	}
	return 0;
}

DWORD WINAPI writer(void *data)
{
	WaitForSingleObject(hEvent_3,INFINITE);	//дожидается наступления события взять из второго
	fwrite(&in1, 1, 1, file_out);
	fwrite(&in2, 1, 1, file_out);
	ResetEvent(hEvent_3);
	SetEvent(hEvent_1);
	return 0;
}

//=============================================================================================================
//			главная программа
//=============================================================================================================
void main()
{
//=============================================================================================================
//			инициализация данных
//=============================================================================================================
	file_in1 = fopen(file_name_1,"r");	//открытие файла для чтения 
	file_in2 = fopen(file_name_2,"r");	//открытие файла для чтения 
	file_out = fopen(file_name_3,"w");	//открытие файла для чтения 
	

	HANDLE hThread_1;	//для первого потока


	HANDLE hThread_2;	//для второго потока


	HANDLE hThread_3;	//для третьего потока
	
	hEvent_1 = CreateEvent(NULL,true,true,NULL);	//событие произошло
	hEvent_2 = CreateEvent(NULL,true,false,NULL);	//событие произошло
	hEvent_3 = CreateEvent(NULL,true,false,NULL);	//событие произошло
	
//=============================================================================================================
//			создание поток 
//=============================================================================================================
	hThread_1=CreateThread(NULL,0,read_one,NULL,0,NULL);
	hThread_2=CreateThread(NULL,0,read_two,NULL,0,NULL);
	hThread_3=CreateThread(NULL,0,writer,NULL,0,NULL);

//=============================================================================================================
//			ожидание завершения
//=============================================================================================================
	WaitForSingleObject(hThread_1,INFINITE);
	WaitForSingleObject(hThread_2,INFINITE);
	WaitForSingleObject(hThread_3,INFINITE);

//=============================================================================================================
//			закрытие объектов
//=============================================================================================================
	CloseHandle(hThread_1);
	CloseHandle(hThread_2);
	CloseHandle(hThread_3);
	CloseHandle(hEvent_1);
	CloseHandle(hEvent_2);
	CloseHandle(hEvent_3);
	
	getchar();
}
Но прога уходит в вечное ожидание. Помогите исправить
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение файлов одинаковой структуры в один файл Tankiss Microsoft Office Excel 20 11.09.2013 17:25
Помогите - объединение файлов Gurza Microsoft Office Excel 13 11.07.2011 11:38
Объединение файлов Aleksey1989 Помощь студентам 3 25.04.2010 19:35
Объединение двух и более файлов Morphling Помощь студентам 5 10.02.2010 10:09
объединение файлов EXCEL в проекты redfield Microsoft Office Excel 3 25.12.2008 12:48