Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Решение задач по С++, Очередь с приоритетами 
:(
    Опции темы
nurfet
Дата 2.11.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



Помогите пожалуйста с решением задачи, есть условие:

Необходимо реализовать программу в ввиде одного исполняемого файла под Win32 (console или GUI) с использованием С/С++. Программа должна моделировать взаимодействие серверной части и некоторого множества клиентских частей (n <= 10). Серверная часть предназначена для обработки некоторых абстрактных транзакций, поступающих от множества клиентов. Серверная и клиентские процедуры должны исполняться в отдельных потоках. Система должна быть однонаправленной, т.е. клиенты отправляют данные и не ждут ответа. Данные, поступающие от клиентов должны помещаться в очередь с учетом их приоритета. Серверная часть должна извлекать данные из очереди и помещать в файл записи о них в текстовом формате. 
Записи в log-файле должны отражать: 
-    время записи в log в системных тиках;
-    идентификатора клиента;
-    приоритет;
-    время формирования запроса в системных тиках.

Код

#include <functional>
#include <vector>
#include "queue.h"
#include "Except.h"
#include <fstream>
#include <iostream>
#include "ClientServer.h"
#include <boost/thread/thread.hpp>
#include <boost/thread/condition_variable.hpp>
#include <Windows.h>
using namespace std;

typedef struct tagTDATA {
    int cPriority;     //приоритет запроса 0 – 255 (0 – наивысший приоритет)
    DWORD dwTicks;     //время формирования запроса в системных тиках
    DWORD dwClientId;  //уникальный идентификатор клиента
    char *Data;        //абстрактные данные
} TDATA, *PTDATA;

DWORD startTickCount = GetTickCount();

PTDATA create_request()
{
    PTDATA ptr = new tagTDATA();
    char *chPt = "Client";
    ptr->cPriority =rand() % 255 - 1;
    ptr->dwTicks = GetTickCount() - startTickCount;
    ptr->dwClientId = 7;
    ptr->Data = chPt;
    return ptr;
}

void process(PTDATA req)
{
    cout << "Priority: " << req->cPriority  << endl
        << "System Tick: " << req->dwTicks << endl
        << "Client ID: " << req->dwClientId << endl
         << "Data: " << req->Data << endl << endl;
}

class request_queue 
{
public:
    void enqueue(PTDATA req)
    {
        bool notify = false;
        {
            boost::unique_lock<boost::mutex> lock (mtx);
            notify = queue.empty(); 
            queue.push(req); 
        }      
        if (notify)
            cv.notify_one();
    }

    PTDATA dequeue()
    {
        boost::unique_lock<boost::mutex> lock (mtx);
        while (queue.empty())
            cv.wait(lock);
        PTDATA req = queue.top();
        queue.pop();
        return req;
    }

private:
    boost::mutex mtx;
    boost::condition_variable cv;
    priority_queue<PTDATA, vector<PTDATA>, greater<PTDATA> > queue;

};

request_queue PQ;

void client_thread()
{
    int n = 10;
    while (n)
    {
        n--;
        PTDATA req = create_request();
        PQ.enqueue(req);
    }
}

void server_thread()
{
    while (PTDATA req = PQ.dequeue())
    {
        process(req);
    }
}

int main()
{
    boost::thread thr1(client_thread);
    boost::thread thr2(server_thread);

    thr1.join();
    thr2.join();
    return 0;
}

Вопрос в том, как вывести данные структуры по приоритетам, почему то все выводится в разнобой.


PM MAIL   Вверх
Леопольд
Дата 2.11.2011, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(nurfet @  2.11.2011,  15:03 Найти цитируемый пост)
Вопрос в том, как вывести данные структуры по приоритетам, почему то все выводится в разнобой.
Ты же не дожидаешься пока очередь полностью заполнится. Как только сервер что-то положил в очередь, сразу запускаешь клиента, который вытаскивает оттуда эти данные. Т.е. данные выбираются те что есть в данный момент. Многопоточное приложение местами непредсказуемо...


Это сообщение отредактировал(а) Леопольд - 2.11.2011, 18:41


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
DarthTon
Дата 9.11.2011, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: нет
Всего: 6



Цитата(nurfet @  2.11.2011,  15:03 Найти цитируемый пост)
Вопрос в том, как вывести данные структуры по приоритетам, почему то все выводится в разнобой.


std::priority_queue тебе в помощь. Только еще придется определить Comparison-класс для выстраивания объектов tagTDATA в порядке очереди.

Но вообще, я сам не так давно делал это задание и у меня где-то завалялась реализация.

Это сообщение отредактировал(а) DarthTon - 9.11.2011, 20:08
PM MAIL   Вверх
serjeka
Дата 21.6.2012, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 21.6.2012

Репутация: нет
Всего: нет



2DarthTon:


Доброго времени суток!
Вы сказали что у Вас есть реализация данного задания! не сложно ли Вам будет его мне скинуть?
PM MAIL   Вверх
DarthTon
Дата 22.6.2012, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: нет
Всего: 6



В связи с просьбами, выкладываю свои исходники.



Это сообщение отредактировал(а) DarthTon - 22.6.2012, 21:02

Присоединённый файл ( Кол-во скачиваний: 78 )
Присоединённый файл  QueueTest.rar 20,51 Kb
PM MAIL   Вверх
serjeka
Дата 26.6.2012, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 21.6.2012

Репутация: нет
Всего: нет



2 DarthTon

Мне выкидывает ошибку при сборке.

1>  QueueTest.cpp
1>c:\documents and settings\администратор\рабочий стол\queuetest\queuetest\queuetest.cpp(194): error C2668: abs: неоднозначный вызов перегруженной функции
1>          c:\program files\microsoft visual studio 10.0\vc\include\math.h(547): может быть "long double abs(long double)"
1>          c:\program files\microsoft visual studio 10.0\vc\include\math.h(499): или       "float abs(float)"
1>          c:\program files\microsoft visual studio 10.0\vc\include\math.h(495): или       "double abs(double)"
1>          c:\program files\microsoft visual studio 10.0\vc\include\stdlib.h(471): или       "__int64 abs(__int64)"
1>          c:\program files\microsoft visual studio 10.0\vc\include\stdlib.h(467): или       "long abs(long)"
1>          c:\program files\microsoft visual studio 10.0\vc\include\stdlib.h(362): или       "int abs(int)"
1>          при попытке сопоставить список аргументов "(DWORD)"
1>
1>СБОЙ построения.

вот участок кода:
 то что мне подчеркнуло я выделил...

 for(int i=0; i<255; i++)
                             td.Data[i] = (char)rand()%255;

                         td.dwTicks -= GetTickCount();
                         td.dwTicks = abs(td.dwTicks);

                         ClientQueue.push(td);

Есть идеи?

Это сообщение отредактировал(а) serjeka - 26.6.2012, 12:39
PM MAIL   Вверх
math64
Дата 26.6.2012, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Как я понял: 
Код
unsigned long dwTicks;

abs() к unsigned применять бессмысленно - потому для этого тип abs() и не перегружена.
По-видимому, нужно исправить так:
Код

                        long delta =  td.dwTicks - GetTickCount(); // промежиточное значение сохраняется в знаковой переменной
                         td.dwTicks = (unsigned long)abs(delta);



Это сообщение отредактировал(а) math64 - 26.6.2012, 13:03
PM   Вверх
serjeka
Дата 26.6.2012, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 21.6.2012

Репутация: нет
Всего: нет



2 math64

спасибо! сработало)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0750 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.