Добрый вечер! Дана задача:Даны два файла, содержащие упорядоченные последовательности чисел. Написать программу, выполняющую слияние этих файлов в один таким образом, чтобы выборку данных из файлов и формирование результирующего файла выполняли три разных потока. Каждый из потоков выборки данных может прочитать очередное значение из своего файла только тогда, когда поток формирования результата передал соответствующее число в файл. Поток формирования результата может выполнять обработку данных только тогда, когда оба потока выборки предоставили ему данные.
Вот что написала:
Код:
// 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();
}
Но прога уходит в вечное ожидание. Помогите исправить