Форум программистов, компьютерный форум CyberForum.ru

C++, задачка. Где же я мог накосячить? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Определить в двумерном массиве числа, равные наименьшим значениям элементов строк http://www.cyberforum.ru/cpp-beginners/thread747336.html
Текст задачи: Дана действительная матрица размера m×n. Определить числа b_1, …, b_m, равные соответственно наименьшим значениям элементов строк. Смог сделать лишь начало: // lab_4a.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> #define MAX_SIZE 100 using namespace std;
C++ Перевод числа из одной системы счисления в другой Здравствуйте. Нужна помощь, затрудняюсь в написании программы. Написать программу, которая переводит числа по основанию 8 в 4. Выполнить операцию деления. Добавлено через 1 час 36 минут На завтра зачет нужно получить, помогите, а сам недостаточно знаю язык. http://www.cyberforum.ru/cpp-beginners/thread747334.html
Получить расписание звонков на весь учебный день (for) C++
Здравствуйте, помогите с задачей, нужно срочно, завтра экзамен, а я очень плохо знаю циклы! на укр. *В учбовому закладі задається початок учбового дня, тривалість “пари” або уроку, тривалість звичайної і великої перерви (та їх “місце” в розкладі), кількість пар (уроків). Отримати розклад дзвінків на весь учбовий день.* на рус. *В учебном заведениизадаёться начало рабочего дня,...
C++ Перегрузка оператора *
Здрасте. Есть задача: Реализовать класс Matrix размерностью NxN, в которой хранятся числа типа float. Память под элементы выделять динамически. Перегрузить операции *, =. В функции main привести примеры реализации класса Matrix. Чтобы упростить себе жизнь, перегружаю * только для умножения на число ;) (хотя бы для начала) Немножко подчитав книжку, перешел к делу. Все, что на данный момент...
C++ Компилятор с поддержкой русского языка http://www.cyberforum.ru/cpp-beginners/thread747323.html
Использую MS Visual с++ 6.0, но он не поддерживает русского языка. Если в коде есть русские буквы - он заменяет их какими то непонятными символами. Подскажите какой другой компилятор выбрать, чтобы русскоязычные слова выводились нормально.
C++ как записать код задачи VS2010 Добрый вечер, я тут новенькая) дана дробь, наметки кода: #include "StdAfx.h" #include <iostream> #include <cmath> using namespace std; подробнее

Показать сообщение отдельно
Ranadaine
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 6

C++, задачка. Где же я мог накосячить? - C++

26.12.2012, 22:29. Просмотров 533. Ответов 11
Метки (Все метки)

Собственно, есть вот такая задачка:

Используя С++, Win32 API и STL корректно реализовать следующую задачу:

Откуда-то дано:

C++
1
2
3
4
5
6
7
8
9
10
11
12
class Request
{
};
 
// возвращает NULL если нужно завершить процесс, либо указатель на память,
// которую в дальнейшем требуется удалить
Request* GetRequest() throw(); 
 
// обрабатывает запрос, но память не удаляет
void ProcessRequest(Request* request) throw();
 
const int NumberOfThreads = 2;
Основной поток должен:
1) Запустить несколько рабочих потоков (NumberOfThreads).
2) Класть в одну очередь заданий задачи до тех пор, пока GetRequest() не вернёт NULL.
3) Корректно остановить рабочие потоки. Они должны доделать текущий ProcessRequest, если он имеется, и остановиться. Если имеются необработанные задания, не обращать на них внимания.
4) Завершить программу.
Рабочий поток должен:
1) Обрабатывать поступающие через очередь запросы с помощью ProcessRequest.
2) Завершиться, как только основной поток ему это скомандует.
Вызовы GetRequest() и ProcessRequest() могут работать долго.


Моё решение выглядело как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <windows.h>
#include <deque>
#include <iostream>
using namespace std;
 
// данные, имеющиеся извне
class Request{};
Request* GetRequest() throw(){}; //а это, всё-таки, явственное указание на отсутствие exception
void ProcessRequest(Request* request) throw(){};
const int NumberOfThreads = 2;
 
// дополнительные объекты и методы, используемые в программе
void Full_Process(); // полный цикл обработки Request'a (получение и обработка)
CRITICAL_SECTION req_queue_cs; // крит. секция, определяющая право доступа к очереди Request'ов
deque <Request*> req_queue; // собственно, очередь Request'ов
bool finalize_signal=false; // признак необходимости завершения потоков - обработчиков
 
int main(int argc, char const *argv[])
{   
    // инициализация критической секции и создание необходимого числа потоков-обработчиков
    InitializeCriticalSection(&req_queue_cs);
    HANDLE* threads = new HANDLE[NumberOfThreads];
    for (int i = 0; i < NumberOfThreads; ++i)
    {
        threads[i]=CreateThread(NULL,0, (LPTHREAD_START_ROUTINE) Full_Process, NULL, 0, NULL);
    }
    
    Request* req;
    // цикл генерации Request'ов
    while (true) {
            req=GetRequest();
            
            // условие выхода из цикла и подача обработчикам сигнала на завершение
            if (req==NULL) {
            finalize_signal=true;
            WaitForMultipleObjects(NumberOfThreads,threads,true,INFINITE);
            req_queue.clear();
            return 0;
            }
        // вход в крит. секцию и добавление Request'а в очередь
        EnterCriticalSection(&req_queue_cs);
        req_queue.push_back(req);
        LeaveCriticalSection(&req_queue_cs);
    }
}
 
// основная функция обработки
void Full_Process(){
    Request* temp;
    // рабочий цикл c условием выхода
    while (!finalize_signal) {
        temp=NULL;
        // попытка входа в крит. секцию
        if (TryEnterCriticalSection(&req_queue_cs)){
            // если очередь не пуста - выполнение действий над первым элементом, иначе - освобождение крит. секции
            if (req_queue.size()>0){
            temp=req_queue.front();
            req_queue.pop_front();
            LeaveCriticalSection(&req_queue_cs);
            // обработка Request'a
            ProcessRequest(temp);
            // удаление обработанного объекта не производится в связи с отсутствием такого указания в задании
            }
            else LeaveCriticalSection(&req_queue_cs);
        }
        else Sleep(1);
    }
    return;
}
Таки оно было признано недостаточно правильным. Где у меня основные ошибки?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 20:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru