Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 2
Регистрация: 19.05.2016
Сообщений: 31

Программа производитель/потребитель

01.06.2017, 10:22. Показов 1791. Ответов 1

Студворк — интернет-сервис помощи студентам
По книге Джонсон М. Харт "Системное программирование в среде Windows" есть пример этой программы, но он написан на C.
Возникла проблема перевода кода на С++. Библиотеку #include "EvryThng.h" со всеми другими сопутствующими библиотеками подключил. Помогите код на С++ запустить.

Код программы
Кликните здесь для просмотра всего текста
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
/* Поддерживает два потока — производителя и потребителя. */
/* Производитель периодически создает буферные данные с контрольными */
/* суммами, или "блоки сообщений", отображаемые потребителем по запросу */
/* пользователя. */
 
#include "EvryThng.h"
#include <time.h>
//#include <Windows.h>
//#include <string>
//#include <time.h>
//#include <cstring>
//#include <iostream>
//#include <conio.h>
//#include <process.h>
#define DATA_SIZE 256
 
typedef struct msg_block_tag { /* Блок сообщения. */
    volatile DWORD f_ready, f_stop; /* Флаги готовности и прекращения сообщений. */
    volatile DWORD sequence; /* Порядковый номер блока сообщения. */
    volatile DWORD nCons, nLost;
    time_t timestamp;
    CRITICAL_SECTION mguard; /* Структура защиты блока сообщения. */
    DWORD checksum; /* Контрольная сумма содержимого сообщения. */
    DWORD data[DATA_SIZE]; /* Содержимое сообщения. */
} MSG_BLOCK;
 
/* Одиночный блок, подготовленный к заполнению новым сообщением. */
MSG_BLOCK mblock = { 0, 0, 0, 0, 0 };
 
DWORD WINAPI produce(void*);
DWORD WINAPI consume(void*);
void MessageFill(MSG_BLOCK*);
void MessageDisplay(MSG_BLOCK*);
 
DWORD _tmain(DWORD argc, LPTSTR argv[]) {
    DWORD Status, ThId;
    HANDLE produce_h, consume_h;
    /* Инициализировать критический участок блока сообщения. */
    InitializeCriticalSection(&mblock.mguard);
    /* Создать два потока. */
    produce_h = (HANDLE)_beginthreadex(NULL, 0, produce, NULL, 0, &ThId);
    consume_h = (HANDLE)_beginthreadex(NULL, 0, consume, NULL, 0, &ThId);
    /* Ожидать завершения потоков производителя и потребителя. */
    WaitForSingleObject(consume_h, INFINITE);
    WaitForSingleObject(produce_h, INFINITE);
    DeleteCriticalSection(&mblock.mguard);
    _tprintf(_T("Потоки производителя и потребителя завершили выполнение\n"));
    _tprintf(_T("Отправлено: %d, Получено: %d, Известные потери: %d\n"), mblock.sequence, mblock.nCons, mblock.nLost);
    return 0;
}
 
DWORD WINAPI produce(void *arg)
/* Поток производителя — создание новых сообщений через случайные */
/* интервалы времени. */
{
    srand((DWORD)time(NULL)); /* Создать начальное число для генератора случайных чисел. */
    while (!mblock.f_stop) {
        /* Случайная задержка. */
        Sleep(rand() / 100);
        /* Получить и заполнить буфер. */
        EnterCriticalSection(&mblock.mguard);
        __try {
            if (!mblock.f_stop) {
                mblock.f_ready = 0;
                MessageFill(&mblock);
                mblock.f_ready = 1;
                mblock.sequence++;
            }
        }
        __finally { LeaveCriticalSection(&mblock.mguard); }
    }
    return 0;
}
 
DWORD WINAPI consume(void *arg) {
    DWORD ShutDown = 0;
    CHAR command, extra;
    /* Принять ОЧЕРЕДНОЕ сообщение по запросу пользователя. */
    while (!ShutDown) { /* Единственный поток, получающий доступ к стандартным устройствам ввода/вывода. */
        _tprintf(_T("\n**Введите 'с' для приема; 's' для прекращения работы: "));
        _tscanf("%c%c", &command, &extra);
        if (command == 's') {
            EnterCriticalSection(&mblock.mguard);
            ShutDown = mblock.f_stop = 1;
            LeaveCriticalSection(&mblock.mguard);
        }
        else if (command == 'c') { /* Получить новый буфер для принимаемых сообщений. */
            EnterCriticalSection(&mblock.mguard);
            __try {
                if (mblock.f_ready == 0) _tprintf(_T("Новые сообщения отсутствуют. Повторите попытку.\n"));
                else {
                    MessageDisplay(&mblock);
                    mblock.nCons++;
                    mblock.nLost = mblock.sequence – mblock.nCons;
                    mblock.f_ready = 0; /* Новые сообщения отсутствуют. */
                }
            }
            __finally { LeaveCriticalSection(&mblock.mguard); }
        }
        else {
            tprintf(_T("Такая команда отсутствует. Повторите попытку.\n"));
        }
    }
    return 0;
}
 
void MessageFill(MSG_BLOCK *mblock) {
    /* Заполнить буфер сообщения содержимым, включая контрольную сумму и отметку времени. */
    DWORD i;
    mblock->checksum = 0;
    for (i = 0; i < DATA_SIZE; i++) {
        mblock->data[i] = rand();
        mblock->checksum ^= mblock->data[i];
    }
    mblock->timestamp = time(NULL);
    return;
}
 
void MessageDisplay(MSG_BLOCK *mblock) {
    /* Отобразить буфер сообщения, отметку времени и контрольную сумму. */
    DWORD i, tcheck = 0;
    for (i = 0; i < DATA_SIZE; i++) tcheck ^= mblock->data[i];
    _tprintf(_T("\nВремя генерации сообщения № %d: %s"), mblock->sequence, _tctime(&(mblock->timestamp)));
    _tprintf(_T("Первая и последняя записи: %х %х\n"), mblock->data[0], mblock->data[DATA_SIZE – 1]);
    if (tcheck == mblock->checksum) _tprintf(_T("УСПЕШНАЯ ОБРАБОТКА –>Контрольная сумма совпадает.\n"));
    else tprintf(_T("СБОЙ –>Несовпадение контрольной суммы. Сообщение запорчено.\n"));
    return;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.06.2017, 10:22
Ответы с готовыми решениями:

Производитель потребитель
Задание: написать программу, в которой реализуется следующее: запись рандомного числа в массив, получение данного числа из массива и...

Потребитель- производитель
Помогите пожалуйста в написании программы под ubuntu 11.04 сама задача(описание): http://sdmitri.ru/Erzeuger-Verbraucher-Problem

C++11 thread производитель-потребитель
Реализовал схему производитель-потребитель. Есть класс генератора последовательных целых чисел, ограниченных максимальным занчением, на...

1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
02.06.2017, 23:19
А что здесь такого, что не сможет работать в C++?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2017, 23:19
Помогаю со студенческими работами здесь

Производитель-Потребитель c собственным Монитором на мьютексах
Доброго времени суток! Решил значит изучить и разобраться в теме многопоточности и синхронизации процессов. В качестве очередного...

Алгоритм «производитель-потребитель» с использованием механизма семафоров
Реализовать алгоритм «производитель-потребитель» с использованием механизма семафоров. В качестве информации использовать строку текста....

Паттерн и задача Производитель/Потребитель (Produser/Consumer)
Хотелось бы понять, сам паттерн и задача это разные вещи? Или же это одно и тоже подразумевается? Хотелось бы какого-то содержательного...

Идиома "Производитель - потребитель"
Добрый вечер всем. Продолжаю изучать многопоточное программирование в С++ и одновременно сталкиваться с миллионом проблем:). В этот раз...

Поставщик-потребитель
Есть код, который читает текстовый файл и делает транслит в латиницу. Пытаюсь решить задачу через &quot;поставщик-потребитель&quot;...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru