
Опытный
 
Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск
Репутация: 33 Всего: 37
|
defines.hКод | #ifndef DEFINES_H_INCLUDED #define DEFINES_H_INCLUDED
#include <windows.h>
// Список состояний потоков typedef enum { NONE = 0, // Простой READER, // Работате читатель READER_FINISH, // Читатель закончил работу WRITER, // Работает писатель WRITER_FINISH // Писатель закончил работу } EStateThreads;
#endif // DEFINES_H_INCLUDED
|
reader.hКод | #ifndef READER_H_INCLUDED #define READER_H_INCLUDED
#include "defines.h"
// Параметры передаваемые "читателю" typedef struct { EStateThreads* state; // Состояние работы потоков const char* mapname; // Имя файловой проекции size_t mapsize; // Максимальная длина файловой проекции char** filelist; // Список обрабатываемых файлов size_t filecount; // Количество файлов в списке } TReaderBuffer;
void Reader(TReaderBuffer*);
#endif // READER_H_INCLUDED
|
reader.cКод | #include <stdio.h> #include <stdbool.h> #include "reader.h"
//----------------------------------------------// bool ReadFromFile(const char* filename, char* data, size_t size) { FILE* f = fopen(filename, "r");
if (f) { fread(data, size, 1, f);
fclose(f); }
return f; } //----------------------------------------------// void Reader(TReaderBuffer* buff) { // Открываем и связываемся с файлом проекции HANDLE hMapping = CreateFileMapping((HANDLE)MAXDWORD, NULL, PAGE_READWRITE, 0, buff->mapsize, buff->mapname); if (hMapping == NULL) { fprintf(stderr, "error in reader: file mapping not create ...\n"); *buff->state = READER_FINISH; return; }
char* data = (char*) MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (data == NULL) { fprintf(stderr, "error in reader: file mapping not view ...\n"); *buff->state = READER_FINISH; return; }
size_t i;
// Перебираем все файлы из списка for (i = 0; i < buff->filecount; ++i) { // Ждём пока не будет команды о начале считывания данных while (*buff->state != READER) { Sleep(1); }
fprintf(stdout, "reader->'%s' = ", buff->filelist[i]); // Если при считывании данных ршибки не произошло, то // передаём управление "писателю" if (ReadFromFile(buff->filelist[i], data, buff->mapsize)) { fprintf(stdout, "OK\n"); *buff->state = WRITER; } else { fprintf(stdout, "error\n"); } }
UnmapViewOfFile(data);
CloseHandle(hMapping);
// Мы закончили *buff->state = READER_FINISH; } //----------------------------------------------//
|
writer.hКод | #ifndef WRITER_H_INCLUDED #define WRITER_H_INCLUDED
#include "defines.h"
// Параметры передаваемые "писателю" typedef struct { EStateThreads* state; // Состояние работы потоков const char* mapname; // Имя файловой проекции size_t mapsize; // Максимальная длина файловой проекции const char* fileout; // Имя выходного файла } TWriterBuffer;
void Writer(TWriterBuffer*);
#endif // WRITER_H_INCLUDED
|
writer.cКод | #include <stdio.h> #include <stdbool.h> #include "writer.h"
//----------------------------------------------// void Writer(TWriterBuffer* buff) { FILE* f = fopen(buff->fileout, "w");
if (!f) { fprintf(stderr, "error in writer: file '%s' is not open ...\n", buff->fileout); *buff->state = WRITER_FINISH; return; }
// Открываем и связываемся с файлом проекции HANDLE hMapping = CreateFileMapping((HANDLE)MAXDWORD, NULL, PAGE_READONLY, 0, buff->mapsize, buff->mapname); if (hMapping == NULL) { fprintf(stderr, "error in writer: file mapping not create ...\n"); *buff->state = WRITER_FINISH; return; }
char* data = (char*) MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0);
if (data == NULL) { fprintf(stderr, "error in writer: file mapping not view ...\n"); *buff->state = WRITER_FINISH; return; }
bool finish = false; // Пока не будет сообщения о выходе while (!finish) { // Ждём передачи управления while ((*buff->state != WRITER) && (*buff->state != READER_FINISH)) { Sleep(1); }
fputs(data, f);
if (*buff->state == READER_FINISH) { finish = true; } else { *buff->state = READER; } }
UnmapViewOfFile(data);
CloseHandle(hMapping);
fclose(f);
// Мы закончили *buff->state = WRITER_FINISH; } //----------------------------------------------//
|
main.cКод | #include <windows.h> #include <conio.h> #include "defines.h" #include "reader.h" #include "writer.h"
#define COUNT_FILES (size_t)2 #define MAP_SIZE 1024 #define MAP_NAME "buffer"
int main() { // Список обрабатываемых файлов char* filelist[COUNT_FILES]= {"files/1.txt", "files/2.txt"}; // Состояние потоков EStateThreads state = NONE;
// Готовим данные для потоков TReaderBuffer rbuff = {&state, MAP_NAME, MAP_SIZE, filelist, COUNT_FILES}; TWriterBuffer wbuff = {&state, MAP_NAME, MAP_SIZE, "out.txt"};
// Инициализируем оба потока CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &Reader, &rbuff, 0, 0); CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) &Writer, &wbuff, 0, 0);
// Передаём управление "читателю" state = READER;
// Ждём завершения работы писателя while (state != WRITER_FINISH) { Sleep(1); }
system("PAUSE");
return 0; }
|
Присоединённый файл ( Кол-во скачиваний: 3 )
archive.7z 5,68 Kb
--------------------
Я знаю, что ничего не знаю© Сократ 
|