Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Александровна
Статус: Академик
Рейтинг: 7906
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2636
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2302
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1663
Дата выхода:05.05.2011, 09:30
Администратор рассылки:Киселёва Алёна aka Verena (Профессор)
Подписчиков / экспертов:318 / 181
Вопросов / ответов:1 / 1

Вопрос № 183001: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: 1)Имеется массив элементов типа Complex в виде структуры struct Numbers { int count = 0;//количество имеющихся элементов в массиве Complex numbers[100];


Вопрос № 183001:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
1)Имеется массив элементов типа Complex в виде структуры
struct Numbers
{
int count = 0;//количество имеющихся элементов в массиве
Complex numbers[100];
} cmp = {0};
Главный поток программы (функция main()) создает вторичный поток, передав в него указатель на структуру cmp.
Вторичный поток запоминает значение из поля count, открывает файл и затем в цикле, если значение count изменилось, то записывает последний элемент массива
Numbers в файл. Так продолжается до тех пор, пока count не достигнет некоторого максимального значения, после этого поток закрывает файл и завершается;
Далее главный поток организует цикл ввода дат следующим образом:
- инициализируется временная переменная tmp типа Complex (ввод с клавиатуры);
- с помощью функции SuspendThread() приостанавливается поток;
- значение временной переменной заносится в массив
cmp.numbers[cmp.c ount] = tmp;
cmp.count++;
- с помощью функции ResumeTread() поток запускается на выполнение;
Так продолжается до тех пор, пока count не достигнет некоторого максимального значения.


2)Тоже задание, только требуется синхронизировать потоки с помощью одного из следующих методов синхронизации:
- критическая секция;
- Mutex;
- событие;
- семафоры.

Использовать VisualStudio 2008. Желательно оформить каждое задание в отдельном проекте.

Отправлен: 30.04.2011, 08:59
Вопрос задал: BVSV (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Плутон (1-й класс) :
Здравствуйте, BVSV!

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <math.h>

#define filename "data.txt"

using namespace std;

struct Complex
{
double re; //вещественная часть
double im; //мнимая часть
};

DWORD WINAPI ThreadFunc(LPVOID);
//int WriteFileComplex(char * fname, Complex * buffer, int count); //запись из массива в файл
//void WriteComplex(void);
int ReadDate(char * fname, Complex * buffer, int count);

int n = 5;

struct Numbers
{
int count;//количество имеющихся элементов в массиве
Complex numbers[100];
} cmp = {0};




int _tmain(int argc, _TCHAR* argv[])
{
DWORD threadId;
HANDLE thread = CreateThread(NULL, NULL,ThreadFunc,&cmp,0,&threadId);
while(cmp.count < n)
{
Complex tmp;
cout<<"Enter Re: ";
cin>>tmp. re;
cout<<"Enter Im: ";
cin>>tmp.im;
SuspendThread(thread);
cmp.numbers[cmp.count] = tmp;
cmp.count ++;
ResumeThread(thread);
}


return 0;
}

DWORD WINAPI ThreadFunc(LPVOID data)
{
Numbers* cmp = (Numbers*)data;
int count = cmp->count;

OFSTRUCT ofs;
HFILE file = OpenFile(filename,&ofs,OF_CREATE);

DWORD written;

while(count < n)
{
if(cmp->count != count)
{
count = cmp->count;
WriteFile((HANDLE)file,(Complex*)&(cmp->numbers[count-1]),sizeof(Complex),&written,NULL);
//cout<<"Write in file";
}

}
CloseHandle((HANDLE)file);

return 0;
}



2)


#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <math.h>
#define filename "data.txt" ;
using namespace std;

struct Complex

{

double re; //действительная часть

double im; //мнимая часть

};

int ReadDate(char * fname, Complex * buffer, int count);

DWORD WINAPI ThreadFunc(LPVOID);

struct Numbers
{
int count;//количество имеющихся элементов в массиве
Complex numbers[100];
} cmp = {0};

//HANDLE lockWrite,lockRead;
HANDLE lockMutex;
int n = 5;

int _tmain(int argc, _TCHAR* argv[])
{

DWORD threadId;
HANDLE thread = CreateThread(NULL, NULL,ThreadFunc,&cmp,0,&threadId);

//lockWrite = CreateMutex(NULL,false,"lockWrite");
//lockRead = CreateMutex(NULL,false,"lockRead");
lockMutex = CreateMutex(NULL,false,"lockMutex");

while(cmp.count < n)
{
Complex tmp;
cout<<"Enter Re: ";
cin>>tmp.re;
cout<<"Enter Im: ";
cin>>tmp.im;

Wai tForSingleObject(lockMutex,INFINITE);
cmp.numbers[cmp.count] = tmp;
cmp.count ++;
ReleaseMutex(lockMutex);

}
//подождать окончания потока
WaitForSingleObject(thread, INFINITE);

Complex* buff = new Complex[n];

int u = ReadDate(filename,buff,n);
cout<<"Read "<<u+1<<" numbers";

CloseHandle(lockMutex);
CloseHandle(thread);

getchar();
return 0;
}


DWORD WINAPI ThreadFunc(LPVOID data)
{

Numbers* cmp = (Numbers*)data;
int count = cmp->count;

//OFSTRUCT ofs;
HANDLE file = CreateFile(filename,GENERIC_WRITE,0,NULL,CREATE_NEW,NULL,NULL);
//HFILE file = OpenFile(filename,&ofs,OF_CREATE);
DWORD written;

while(count < n)
{
if(cmp->count != count)
{
count = cmp->count;
WaitForSingleObject(lockMutex,INFINITE);
WriteFile((HANDLE)file,(Complex*)&(cmp->numbers[count-1]),sizeof (Complex),&written,NULL);
ReleaseMutex(lockMutex);
}
Sleep(2);
}
CloseHandle((HANDLE)file);



retur n 0;
}



int ReadDate(char * fname, Complex * buffer, int count)
{
OFSTRUCT ofs;
HFILE file = OpenFile(fname,&ofs,OF_READ);
//CreateFile(filename,GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL);
DWORD read;
ReadFile((HANDLE)file,buffer,sizeof(Complex)*count,&read,NULL);
CloseHandle((HANDLE)file);

return read/sizeof(Complex);
}

Ответ отправил: Плутон (1-й класс)
Ответ отправлен: 04.05.2011, 16:21
Номер ответа: 266958

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 266958 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное