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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

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

Добрый вечер! вот задача: Дан файл содержащий текст произвольной длины. Найти контрольную сумму текста, как сумму кодов символов по модулю 256. Реализовать два потока: первый для чтения содержимого файла буфер длиной m символов, второй – для расчета контрольной суммы.
Вот что я написала:
Код:
/*
	подсчет контрольной суммы по тексту
*/

#include "stdafx.h"
#include "iostream"
#include "windows.h"
#include "time.h"
/*==================================================================================
					описание  данных и переменных
===================================================================================*/

	HANDLE hMutexRead;	  // Мьютекс "информация считана"
    HANDLE hMutexSum;// Мьютекс "сумма подсчитана"


	int sum=0;	//переменная накапливающая сумму
	FILE *file;	//файловая переменная
	char* file_name = "input.txt";	//имя файла
	std::string str;	//буфер
	int m=4;
	int control_sum=0;	//контрольная сумма


DWORD WINAPI reader(LPVOID param) // Функция потока чтения из файла
{
	int i;
	int scale=0;	//масштаб для массива
	WaitForSingleObject(hMutexSum,INFINITE);	//захват мьтекса "сумма подсчитана"
	while(! feof(file))	//до тех пор не конец файла читает и записываем
	{
		for(i=0;i<m;i++)
			fscanf(file,"%c",&str[i+scale]);
		scale+=m;	//увеличить масштаб
	}
	ReleaseMutex(hMutexRead);	//освободить мьютекс "информация считана"
	return 0;
}

DWORD WINAPI summator(LPVOID param)	//функция вычисления контрольной суммы
{
	int i;
	int count=str.length();
	WaitForSingleObject(hMutexRead,INFINITE);	//захват мьтекса "информация считана"	
	for (i=0;i<=count;i++)
	{
		sum+=int(str[i]);
	}
	ReleaseMutex(hMutexSum);	//освободить мьютекс "сумма подсчитана"	
	control_sum=sum%256;
	std::cout<<control_sum;
	return 0;
}

/*==================================================================================
			главная программа
==================================================================================*/
void main()
{
	file = fopen(file_name,"r");	//открытие файла для чтения 
/*==================================================================================
			создание мьютексов
==================================================================================*/
	hMutexRead = CreateMutex(NULL,false,NULL);
	hMutexSum = CreateMutex(NULL,false,NULL);

/*==================================================================================
			создание потоков
==================================================================================*/
	HANDLE HRead = CreateThread(NULL,0,reader,NULL,0,NULL);
	HANDLE HSum = CreateThread(NULL,0,summator,NULL,0,NULL);
	HANDLE hThread[2];
	hThread[0] = HRead;
	hThread[1] = HSum;

	//завершение потоков
	WaitForMultipleObjects(2,hThread,true,INFINITE);
	CloseHandle(HRead);
	CloseHandle(HSum);
}
Но программа не работает, помогите разобраться
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 06.04.2010, 19:12   #2
|{ot
Форумчанин
 
Аватар для |{ot
 
Регистрация: 09.03.2008
Сообщений: 127
По умолчанию

Изначально 2 мьютекса свободны и потоки "одновременно" начинают выполнение....
Попробуй так:
Код:
hMutexRead = CreateMutex(NULL,true,NULL);
|{ot вне форума Ответить с цитированием
Старый 06.04.2010, 19:26   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

виснет можете еще посмотреть что не так?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 06.04.2010, 20:26   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

вот исправила:
Код:
/*
	подсчет контрольной суммы по тексту
*/

#include "stdafx.h"
#include "iostream"
#include "windows.h"
#include "time.h"
/*==================================================================================
					описание  данных и переменных
===================================================================================*/

	HANDLE hMutexRead;	  // Мьютекс "информация считана"
    HANDLE hMutexSum;// Мьютекс "сумма подсчитана"


	int sum=0;	//переменная накапливающая сумму
	FILE *file;	//файловая переменная
	char* file_name = "input.txt";	//имя файла
	std::string str;	//буфер
	int m=4;
	int control_sum=0;	//контрольная сумма


DWORD WINAPI reader(LPVOID param) // Функция потока чтения из файла
{
	int i;
	int scale=0;	//масштаб для массива
	WaitForSingleObject(hMutexRead,INFINITE);	//захват мьтекса "сумма подсчитана"
	while(! feof(file))	//до тех пор не конец файла читает и записываем
	{
		for(i=0;i<m;i++)
		//	fscanf(file,"%c",&str[i+scale]);
		str[i+scale]=getc(file);
		scale+=m;	//увеличить масштаб
	}
	//str="qwew";
	ReleaseMutex(hMutexRead);	//освободить мьютекс "информация считана"
	return 0;
}

DWORD WINAPI summator(LPVOID param)	//функция вычисления контрольной суммы
{
	int i;
	int count=str.length();
	WaitForSingleObject(hMutexRead,INFINITE);	//захват мьтекса "информация считана"	
	for (i=0;i<=count;i++)
	{
		sum+=int(str[i]);
	}
	ReleaseMutex(hMutexSum);	//освободить мьютекс "сумма подсчитана"	
	control_sum=sum%256;
	std::cout<<control_sum;
	return 0;
}

/*==================================================================================
			главная программа
==================================================================================*/
void main()
{
	file = fopen(file_name,"r");	//открытие файла для чтения 

/*==================================================================================
			создание мьютексов
==================================================================================*/
	hMutexRead = CreateMutex(NULL,false,NULL);
	hMutexSum = CreateMutex(NULL,true,NULL);

/*==================================================================================
			создание потоков
==================================================================================*/
	HANDLE HRead = CreateThread(NULL,0,reader,NULL,0,NULL);
	HANDLE HSum = CreateThread(NULL,0,summator,NULL,0,NULL);
	HANDLE hThread[2];
	hThread[0] = HRead;
	hThread[1] = HSum;

	//завершение потоков
	WaitForMultipleObjects(2,hThread,true,INFINITE);
	CloseHandle(HRead);
	CloseHandle(HSum);
	getchar();
}
Но почему-то не хочет считывать из файла когда программно записываю строку все номально что исправить?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 07.04.2010, 12:04   #5
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

У меня программа вылетает на втором проходе строки
str[i+scale]=getc(file);
потому что по умолчанию строка содержит один нулевой символ, и, соответственно, буфер размером 1 байт. Проще сделать так:
str += getc(file);
буфер будет автоматически расширяться.


Кстати, функции reader() и summator() у тебя выполняются в случайном порядке, потому что новый поток запускается не сразу при его создании, а когда ось решит, что время пришло. На самом деле, формулировка самой задачи дурацкая - потоки тут вообще никаким боком. Можно сделать так:
Код:
	WaitForSingleObject(hMutexRead,INFINITE);
	HANDLE HRead = CreateThread(NULL,0,reader,NULL,0,NULL);
	WaitForSingleObject(hMutexRead,INFINITE);
	HANDLE HSum = CreateThread(NULL,0,summator,NULL,0,NULL);
а в самих функциях убрать захват мьютекса.

Последний раз редактировалось ds.Dante; 07.04.2010 в 12:24.
ds.Dante вне форума Ответить с цитированием
Старый 07.04.2010, 12:27   #6
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

спасибо за совет, приду домой буду пробовать
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование *.swf Романнн Мультимедиа в Delphi 14 02.04.2010 09:27
Использование WriteProcessMemory Ra88 Помощь студентам 0 31.01.2010 08:56
Использование toupper() Golovastik Общие вопросы C/C++ 2 02.09.2009 15:49
Использование ComboBox Василь Microsoft Office Excel 11 24.04.2009 17:16
Использование while и while do prikolist Общие вопросы C/C++ 20 06.04.2009 18:40