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

Задача "Производители-Потребители", реализация с помощью Events и циклического буфера - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ альтернатива Turbo Cи для Win 7 (x64) http://www.cyberforum.ru/cpp/thread371065.html
Всем привет. У меня такой вопрос: есть ли современная альтернатива Turbo С под Windows ? такая я же не большая по объему. Чтоб Visual C++ не ставить.
C++ Подскажите! Привет! Учился на программиста в универе, окончил в 2005 году. После универа ушел в 1С и писал только на 1С, другие языки не использовал. В универе изучал Pascal, C (в 2001 году), Delphi, Fortran. Паскаль и С изучал в ДОС-среде. После 6 лет возникло желание написать простенькую игру 2D на С. Идея есть, алгоритм смогу реализовать. Не следил за развитием платформ для программирования на С. Толком... http://www.cyberforum.ru/cpp/thread370891.html
Программно создать Базу Данных C++
Здравствуйте! Я пытаюсь освоить работу с базами данных через ODBC. Но совершенно неясно как программно создать базу данных через этот интерфейс. Подскажите полалуйста какой-нибудь простейший пример с программным созданием базы данных.
помогите найти подходящую оболочку под C++ C++
Привет всем ! Проконсультируйте пожалуйста меня по поводу оболочек под C++ Дело в том, что я знаком с MetaTrader4 и с оболочкой под язык MQL4 (программа называется Metaeditor.exe), в которой я недавно закончил писать Тестера для подборки параметров к торговому роботу, - дело здесь в том, что данный тестер работает медленно (как мне кажется), и с помощью специального алгоритма расчета...
C++ Motion Detector (OpenCV) http://www.cyberforum.ru/cpp/thread370648.html
Всем привет! =) Только начал разбираться с OpenCV. Хочу попробовать камеру распознавать движение. Детектор движения должен реализоваться на C++ при помощи библиотеки OpenCV. Но возникла одна проблемка. Вот, собственно код: #include "v_motion_detector.h" #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/video/tracking.hpp> const double VMotionDetector::MOTION_THRESHOLD = 10;...
C++ Задача обедающих философов при помощи событий (events) Здравствуйте. Очень нужна помощь с сабжем. Самостоятельно ничего не вышло - не пойму как это вообще выглядеть должно. Посему, кому не трудно, поделитесь кодом. Добавлено через 23 часа 43 минуты Ну пожалуйста :( Добавлено через 6 часов 36 минут Попытался реализовать так, как понимаю. Ошибок нет, но работает как-то... не так. Помогите исправить недокод, пожалуйста. #include "stdafx.h" подробнее

Показать сообщение отдельно
sergeyotro
0 / 0 / 0
Регистрация: 08.10.2011
Сообщений: 13
23.10.2011, 22:28  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
использую блокируемую очередь.
Спасибо за подсказку. Надеюсь я её правильно понял.

Вот код изменённой программы, работает правильно. Надеюсь, кому-нибудь пригодится.
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream>
#include <conio.h>
#include <windows.h>
#define MAX_PRODUCERS 6
#define SIZE_BUF 25
//#define READ_OUTPUT
 
using namespace std;
 
DWORD uThrProdID[MAX_PRODUCERS], uThrConsID;
 
HANDLE hEventWrite, hEventRead, hEventBuf;
HANDLE hThrProdArray[MAX_PRODUCERS], hThrCons;
 
void ProducerThread(char name[11]);
void ConsumerThread(void *pParams);
 
int cycleBuf[SIZE_BUF];
int tail = 0;
int head = 0;
int count = 0;
 
void FlushBuf(void);
void PutChar(int sym);
int GetChar(void);
 
FILE *fw;
 
#ifdef READ_OUTPUT
FILE *fr;
#endif
 
int main()
{
    fw = fopen("bufw.txt", "w");
#ifdef READ_OUTPUT
    fr = fopen("bufr.txt", "w");
#endif
    FlushBuf();
 
    hEventWrite = CreateEvent(NULL, FALSE, FALSE, NULL);
    hEventBuf = CreateEvent(NULL, FALSE, TRUE, NULL);
    hEventRead = CreateEvent(NULL, FALSE, TRUE, NULL);
 
    for ( int i = 0; i < MAX_PRODUCERS; i++ )
    {
        char* prod = new char[11];
        sprintf(prod, "Producer %d", i+1);
        hThrProdArray[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ProducerThread, prod, 0, &uThrProdID[i]);
    }
 
    hThrCons = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ConsumerThread, NULL, 0, &uThrConsID);
 
    getch();
 
    fclose(fw);
#ifdef READ_OUTPUT
    fclose(fr);
#endif
 
    CloseHandle(hEventBuf);
    CloseHandle(hEventRead);
    CloseHandle(hEventWrite);
 
    for ( int i = 0; i < MAX_PRODUCERS; i++ )
        CloseHandle(hThrProdArray[i]);
 
    CloseHandle(hThrCons);
    return 0;
}
 
void ProducerThread(char name[11])
{
    while(1)
    {
        WaitForSingleObject(hEventRead, INFINITE);
        Sleep(rand()%500);
        if (count < SIZE_BUF)
        {
            for ( int i = 0; i < 3; i++ )
            {
                PutChar(name[9]);
                putc(name[9], fw);
            }
            putc(13, fw);
        }
        cout <<  name << ": There are " << count << " symbols in buf" << endl << endl;
        SetEvent(hEventWrite);
    }
}
 
void ConsumerThread(void *pParams)
{
    WaitForSingleObject(hEventWrite, INFINITE);
    while(1)
    {
        Sleep(rand()%50);
        if (count == 0)
        {
            SetEvent(hEventRead);
            WaitForSingleObject(hEventWrite, INFINITE);
        }
#ifdef READ_OUTPUT
        putc(GetChar(), fr);
#else
        GetChar();
#endif
        cout << "Consumer: I've read one symbol. There are " << count << " symbols in buf now. " << endl << endl;
        SetEvent(hEventRead);
    }
}
 
void FlushBuf(void)
{
    tail = 0;
    head = 0;
    count = 0;
}
 
void PutChar(int sym)
{
    WaitForSingleObject(hEventBuf, INFINITE);
    if (count < SIZE_BUF)
    {
        cycleBuf[tail] = sym;
        count++;
        tail++;
        if (tail == SIZE_BUF) tail = 0;
    }
    SetEvent(hEventBuf);
}
 
int GetChar(void)
{
    int sym = 0;
    if (count > 0)
    {
        sym = cycleBuf[head];
        count--;
        head++;
        if (head == SIZE_BUF) head = 0;
    }
    return sym;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru