Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
1 / 1 / 1
Регистрация: 06.09.2015
Сообщений: 81
1

Имитация очереди печати на принтер

04.02.2016, 12:13. Показов 5555. Ответов 2
Метки нет (Все метки)

Есть задача:
Разработать приложение, имитирующее очередь печати принтера. Должны быть клиенты, посылающие запросы на принтер, у каждого из которых есть свой приоритет. Каждый новый клиент попадает в очередь в зависимости от своего приоритета. Необходимо сохранять статистику печати (пользователь, время) в отдельной очереди. Предусмотреть вывод статистики на экран.

Начал делать реализацию очереди печати принтера. Клиентов и статистику пока опускаем.
Очередь делал на основе двусвязного списка.
При отладке возникает проблема: Первый элемент в очередь добавляется без проблем. А при добавлении 2-го, 3-го возникает проблема - опять добавляется 1-й элемент. То есть при наличии 2-х элементов в очереди anton и dima, 2 раза выводится anton.
Ошибка где то в методе add, nкните плиз!!!. Собственно вот код:

header
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
class pqueue
{
private:
    struct Element{
        char* workstation_name;  // imya komputera
        int rank;    // rang komputera, kotoriy opredelayet pologenie v ocherdi
        Element* next;
        Element* prev;
    };
    Element* _head;
    Element* _tail;
    int max_size;    // maks razmer ocheredi
    int current_size; // tekushiy razmer ocheredi
public:
    pqueue();
    bool isfull();  // proverka na to zapolnena li ochered
    void add(char* name, int rating); // dobavlenie elementa v ochered
    void* getElementByIndex(int index);
    void getqueue();  // pechat ocheredi
    void* extractElement(); // izvlechenie elementa iz nachala ocheredi
    ~pqueue();
};


cpp
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include "pqueue.h"
#include "string.h"
#include <iostream>
 
using namespace std;
 
//Konstruktor po umolchaniu  
pqueue::pqueue() : current_size(0), _head(nullptr), _tail(nullptr), max_size(10)
{
}
// Proverka zapolnena li ochered do konca
bool pqueue::isfull()
{
    return current_size == max_size;
}
// vozvrat elementa ocheredi po indexu
void* pqueue::getElementByIndex(int index)
{
    Element* result = _head;
    for (int i = 1; i<current_size; i++)
    {
        result = result->next;
    }
    return result;
}
// pechat elementov ocheredi
void pqueue::getqueue()
{
    for (int i = 0; i < current_size; i++)
    {
        Element* current = (Element*)getElementByIndex(i);
        cout << current->workstation_name << endl;
    }
}
// dobavlenie elementov v ochered v zavisimosti ot ranga
// chem bolche znachenie ranga  tem blige k nachalu ocheredi rasopologaetsya element
void pqueue::add(char* name, int rating)
{
    if (isfull()) { return; }
    if (current_size == 0)
    {
        Element* newElement = new Element;
        newElement->rank = rating;
        newElement->next = nullptr;
        newElement->prev = nullptr;
        _head = _tail = newElement;
        int nameLenght = strlen(name) + 1;
        newElement->workstation_name = new char[nameLenght];
        strcpy_s(newElement->workstation_name, nameLenght, name);
        ++current_size;
        return;
    }
    if (current_size > 0)
    {
        Element* newElement = new Element;
        newElement->rank = rating;
        newElement->next = nullptr;
        newElement->prev = nullptr;
        int nameLenght = strlen(name) + 1;
        newElement->workstation_name = new char[nameLenght];
        strcpy_s(newElement->workstation_name, nameLenght, name);
        if (newElement->rank <= _tail->rank)
        {
            _tail->next = newElement;
            newElement->prev = _tail;
            newElement->next = nullptr;
            _tail = newElement;
            ++current_size;
            return;
        }
        if (newElement->rank > _head->rank)
        {
            _head->prev = newElement;
            newElement->next = _head;
            newElement->prev = nullptr;
            _head = newElement;
            ++current_size;
            return;
        }
        if (newElement->rank <= _head->rank&&newElement->rank > _tail->rank)
        {
            Element* current;
            Element* prev;
            for (int i = current_size - 1; i > 0; i--)
            {
                current = (Element*)getElementByIndex(i);
                prev = (Element*)getElementByIndex(i - 1);
                if (newElement->rank > current->rank&&newElement->rank <= prev->rank)
                {
                    newElement->next = current;
                    current->prev = newElement;
                    newElement->prev = prev;
                    prev->next = newElement;
                }
                break;
            }
            return;
        }
    }
 
    ++current_size;
 
}
 
void* pqueue::extractElement()  // izvlekaet element iz nachala ocheredi
{
    Element* current = _head;
    _head = current->next;
    _head->prev = nullptr;
    --current_size;
    return current;
}
 
 
pqueue::~pqueue()
{
    if (_head == nullptr) {
        return;
    }
    Element* current = _head;
    Element* next = _head->next;
    while (current != nullptr)
    {
        next = current->next;
        delete current;
        current = next;
    }
    _head = _tail = nullptr;
    current_size = 0;
}


main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "pqueue.h"
#include <iostream>
#include<string.h>
 
using namespace std;
 
int main()
{
    pqueue first;
    first.add("anton", 10);
    first.add("dima",8);
    first.getqueue();
    system("pause");
    return 0;
}


Добавлено через 21 час 27 минут
Всем спасибо!
Ошибку нашел сам . В методе getElementByIndex(int index) цикл бегал до current_size а должен был до index.
Невнимательность ((((((
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2016, 12:13
Ответы с готовыми решениями:

Не печатает принтер Epson CX7300 - ошибка очереди печати
Здравствуйте!!! Такая проблема: принтер Epson CX7300, установочный диск рассчитан на ХР, на...

Постоянно останавливается диспетчер очереди печати при отправке на сетевой принтер
Ошибка стала появлятся после отключения принтера от компа. При отправке печати на принтер вылезает...

Принтер HP Laser Jet p1005. При отправке на печать падает служба "Диспетчер очереди печати"
Здравствуйте! Я столкнулся со одной проблемой. При отправке на печать падает служба &quot;Диспетчер...

Фабрика печати Epson или лазерный принтер для ч/б печати
Здравствуйте! Нужен практичный принтер с (!)дешёвой стоимостью печати. Печатаю в основном...

2
Эксперт С++
3210 / 1737 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
04.02.2016, 14:44 2
Цитата Сообщение от degvelo Посмотреть сообщение
Очередь делал на основе двусвязного списка.
А std::priority_queue отменили что ли?
0
1 / 1 / 1
Регистрация: 06.09.2015
Сообщений: 81
04.02.2016, 14:53  [ТС] 3
Не отменили. Важно было самому написать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.02.2016, 14:53

Попытке печати создается очередь печати и пропадает. принтер молчит. подключен по сети
конкретно проблема с принтером mfp_m132a. он подключен напрямую к виндовс хп через усб и печать...

Есть ли у кого-нибудь готовый скрипт для очистки очереди печати в windows 10, а еще лучше с перезагрузкой службы печати?
Добрый день, Есть ли у кого-нибудь готовый скрипт для очистки очереди печати в windows 10, а еще...

Зависают очереди печати
Привет всем! Никак не могу нагуглить решение проблемы. Дано: 1. Компьютер с Windows-7-x64. В...

Перехват очереди печати
код моей проги: uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.