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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Pavel1111
0 / 0 / 0
Регистрация: 18.06.2012
Сообщений: 9
#1

C++ занесение структур находящихся в разных потоках, в общую очередь - C++

03.04.2013, 08:31. Просмотров 464. Ответов 4
Метки нет (Все метки)

Весь код приводить не стал, надеюсь идея будет понятна. Я циклом создал потоки а теперь, нужно структуры (Clien), которые в этих потоках создались засунуть в очередь. Как это сделать??? а то у меня вообще никаких идей нет..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
......
void MThread( void* pParams ) {
    TDATA Client;
};
......
 
int main() {
.....
priority_queue<TDATA, vector<TDATA>, TDATA_comparison> TDATA_queue;
    
    for ( int i = 0; i < 5; i++ ) {
        _beginthread(MThread, 0, NULL);
        
        TDATA_queue.push(Client);   //вот с помощю push я и должен все мои структуры внести в очередь
    }
......
}
Добавлено через 41 минуту
а можно в поток передать указатель на очередь?

Добавлено через 4 часа 52 минуты
Я врое разобрался, но вот неприятность, фаил в который должно была вывести текстовая информация почиму то пустой, гляньте пожалуйста код!!! Очень нужно сегодня отдать...
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
#include <iostream>
#include <string>
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <time.h>
 
using namespace std;
 
struct BYTE {   //приоритет запроса 0 – 255 (в нашем случае случайная величина)
    int priority;
    BYTE (int x = rand() % 255) : priority(x){}
};
 
struct DWORD {   //время формирования запроса и уникальный идентификатор клиента (в нашем случае не повторяемая случайная величина)
    string t;
    double start;
    static int quantity;
    int id;
    DWORD () {
        const time_t seconds = time(NULL);
        t = ctime(&seconds);
 
        start = clock();   //старт отсчета времени, для оценки продолжительности выполнения запос-отчет
 
        quantity += 1;
        id = quantity;
    }
};
int DWORD::quantity = 0;
 
typedef struct tagTDATA {
    BYTE cPriority; //приоритет запроса 0 – 255 (0 – наивысший приоритет)
    DWORD dwTicks; //время формирования запроса в системных тиках (Абсолютное значение времени, когда клиент добавляет запись в очередь)
    DWORD dwClientId; //уникальный идентификатор клиента
    char Data[255]; //абстрактные данные
} TDATA, *PTDATA;
 
class TDATA_comparison {
    public:
        bool operator() (const TDATA &lhs, const TDATA &rhs) const {
            return (lhs.cPriority.priority > rhs.cPriority.priority);
        }
};
 
typedef struct {
    priority_queue<TDATA, vector<TDATA>, TDATA_comparison> TDATA_queue;
} Pgueue;
 
void MThread( void* params ) {
    Pgueue * ptr = (Pgueue *)params;
    TDATA Client;
    ptr->TDATA_queue.push(Client);
};
 
int main() {    
    cout << "Enter n (1 - 10): ";
    int n;
    
    for (cin >> n; n < 1 || n > 10; cin >> n) {
        if (!cin) {
            cin.clear();
            cin.sync();
        }
        cout << "Try again  (1 - 10): ";
    }
    
    Pgueue params;
    
    for ( int i = 0; i < n; i++ ) {
        _beginthread(MThread, 0, (void*)&params);
    }
 
    FILE *fp;
 
    if((fp = fopen("log.txt", "w")) == NULL) {
        cout << "Can not create file log.txt";
        exit(1);
    }
 
    while(!params.TDATA_queue.empty()) {
        TDATA Client = params.TDATA_queue.top();
        const time_t timer = time(NULL);
        double end;
        end = clock();
 
        fprintf(fp, "Time of the request: %s", Client.dwTicks.t.c_str());
        fprintf(fp, "id: %d\n", Client.dwClientId.id);
        fprintf(fp, "priority: %d\n", Client.cPriority.priority);
        fprintf(fp, "time output to a log: %s", ctime(&timer));
        fprintf(fp, "processing time: %.3f second\n\n", (end - Client.dwTicks.start) / ((double) CLOCKS_PER_SEC));
        params.TDATA_queue.pop();
    }
 
    fclose(fp);
 
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2013, 08:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос C++ занесение структур находящихся в разных потоках, в общую очередь (C++):

2 цикла в разных потоках - C++
Здравствуйте! Научите! Как правильно делать &quot;что-то&quot; в отдельном фоновом потоке в C++. Пожалуйста код! К примеру: void...

Движение двух фигур в разных потоках - C++
Привет всем!всех с новым годом!и снова я к вам с моими проблемами) короче пишу игрушку в консоле,столкнулся впервые с...

Получить перемешанный вывод при работе в разных потоках - C++
В общем то, дело такое: о потоках до сего дня не знал, да и сейчас ничего не понимаю. Пишу, значит, код, как на харбе, чтобы убедиться, что...

можно как то сравнить возвращаемые значения этими функциями(разнопотоковыми)? функции на разных потоках - C++
можно как то сравнить возвращаемые значения этими функциями? и например если(они равны) {то завершить круг цикла и перейти к следующему}...

Сеть и очередь структур - C++
Всем привет. Пишу клиент-серверное приложение, в качестве пакета данных у меня 4 int числа, в виде структуры. struct message { ...

Подключение с помощью директивы #include нескольких функций, находящихся в разных файлах. - C++
Здравствуйте, уважаемые программисты. Помогите, пожалуйста, разобраться в такой ситуации: есть несколько функций, каждая из которых...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
anmartex
...
1705 / 1198 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
03.04.2013, 09:52 #2
Цитата Сообщение от Pavel1111 Посмотреть сообщение
фаил в который должно была вывести текстовая информация почиму то пустой
Не всегда :
Кликните здесь для просмотра всего текста
log.txt:
Код
Time of the request: Wed Apr 03 14:31:52 2013
id: 2
priority: 41
time output to a log: Wed Apr 03 14:31:52 2013
processing time: 0.000 second

Time of the request: Wed Apr 03 14:31:52 2013
id: 6
priority: 41
time output to a log: Wed Apr 03 14:31:52 2013
processing time: 0.000 second

Time of the request: Wed Apr 03 14:31:52 2013
id: 14
priority: 41
time output to a log: Wed Apr 03 14:31:52 2013
processing time: 0.000 second

Time of the request: Wed Apr 03 14:31:52 2013
id: 20
priority: 41
time output to a log: Wed Apr 03 14:31:52 2013
processing time: 0.000 second

Time of the request: Wed Apr 03 14:31:52 2013
id: 18
priority: 41
time output to a log: Wed Apr 03 14:31:52 2013
processing time: 0.000 second

Time of the request: Wed Apr 03 14:31:52 2013
id: 12
priority: 41
time output to a log: Wed Apr 03 14:31:52 2013
processing time: 0.000 second

Time of the request: Wed Apr 03 14:31:52 2013
id: 16
priority: 41
time output to a log: Wed Apr 03 14:31:52 2013
processing time: 0.000 second

Time of the request: Wed Apr 03 14:31:52 2013
id: 10
priority: 41
time output to a log: Wed Apr 03 14:31:52 2013
processing time: 0.000 second

Time of the request: Wed Apr 03 14:31:52 2013
id: 4
priority: 41
time output to a log: Wed Apr 03 14:31:52 2013
processing time: 0.000 second

Time of the request: Wed Apr 03 14:31:52 2013
id: 8
priority: 41
time output to a log: Wed Apr 03 14:31:52 2013
processing time: 0.000 second


Pavel1111, вы так лихо выполняете push в потоке без синхронизации, это и становится причиной такого поведения Если будите вводить 1, то всё будет работать.

Добавлено через 12 минут
А вот так будет всегда выполняться:
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
#include <iostream>
#include <string>
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <time.h>
 
#include <windows.h>
CRITICAL_SECTION cs;
 
using namespace std;
 
struct MYBYTE {   //приоритет запроса 0 – 255 (в нашем случае случайная величина)
    int priority;
    MYBYTE (int x = rand() % 255) : priority(x){}
};
 
struct MYDWORD {   //время формирования запроса и уникальный идентификатор клиента (в нашем случае не повторяемая случайная величина)
    string t;
    double start;
    static int quantity;
    int id;
    MYDWORD () {
        const time_t seconds = time(NULL);
        t = ctime(&seconds);
 
        start = clock();   //старт отсчета времени, для оценки продолжительности выполнения запос-отчет
 
        quantity += 1;
        id = quantity;
    }
};
int MYDWORD::quantity = 0;
 
typedef struct tagTDATA {
    MYBYTE cPriority; //приоритет запроса 0 – 255 (0 – наивысший приоритет)
    MYDWORD dwTicks; //время формирования запроса в системных тиках (Абсолютное значение времени, когда клиент добавляет запись в очередь)
    MYDWORD dwClientId; //уникальный идентификатор клиента
    char Data[255]; //абстрактные данные
} TDATA, *PTDATA;
 
class TDATA_comparison {
    public:
        bool operator() (const TDATA &lhs, const TDATA &rhs) const {
            return (lhs.cPriority.priority > rhs.cPriority.priority);
        }
};
 
typedef struct {
    priority_queue<TDATA, vector<TDATA>, TDATA_comparison> TDATA_queue;
} Pgueue;
 
void MThread( void* params ) {
    Pgueue * ptr = (Pgueue *)params;
    TDATA Client;
    EnterCriticalSection(&cs);
    ptr->TDATA_queue.push(Client);
    LeaveCriticalSection(&cs);
};
 
int main() {
    InitializeCriticalSection(&cs, 0);
    srand(time(NULL));
    cout << "Enter n (1 - 10): ";
    int n;
 
    for (cin >> n; n < 1 || n > 10; cin >> n) {
        if (!cin) {
            cin.clear();
            cin.sync();
        }
        cout << "Try again  (1 - 10): ";
    }
 
    Pgueue params;
 
    for ( int i = 0; i < n; i++ ) {
        _beginthread(MThread, 0, (void*)&params);
    }
 
    FILE *fp;
 
    if((fp = fopen("log.txt", "w")) == NULL) {
        cout << "Can not create file log.txt";
        exit(1);
    }
 
    while(!params.TDATA_queue.empty()) {
        TDATA Client = params.TDATA_queue.top();
        const time_t timer = time(NULL);
        double end;
        end = clock();
 
        fprintf(fp, "Time of the request: %s", Client.dwTicks.t.c_str());
        fprintf(fp, "id: %d\n", Client.dwClientId.id);
        fprintf(fp, "priority: %d\n", Client.cPriority.priority);
        fprintf(fp, "time output to a log: %s", ctime(&timer));
        fprintf(fp, "processing time: %.3f second\n\n", (end - Client.dwTicks.start) / ((double) CLOCKS_PER_SEC));
        params.TDATA_queue.pop();
    }
 
    fclose(fp);
 
    DeleteCriticalSection(&cs);
 
    return 0;
}
Бинарник + исходник: program.7z
0
anmartex
...
1705 / 1198 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
03.04.2013, 09:58 #3
Поправка, 63 строчка: InitializeCriticalSection(&cs);
0
Pavel1111
0 / 0 / 0
Регистрация: 18.06.2012
Сообщений: 9
03.04.2013, 11:21  [ТС] #4
Огромное человеческое спасибо!!!
Подскажите пожалуйста еще вот что: почему у меня не получается воспользоваться #include <windows.h> и
CRITICAL_SECTION cs;. Я кстати, хотел их применить но у меня компилятор выдает ошибку: error: too many arguments to function InitializeCriticalSection(&cs, 0). С Вашим кодом та же история. Что нужно сделать?
Компилятор МингВей.
0
anmartex
...
1705 / 1198 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
03.04.2013, 11:29 #5
Цитата Сообщение от Pavel1111 Посмотреть сообщение
error: too many arguments to function InitializeCriticalSection(&cs, 0)
Много аргументов.
Цитата Сообщение от anmartex Посмотреть сообщение
Поправка, 63 строчка: InitializeCriticalSection(&cs);
Я сначала воспользовался функцией InitializeCriticalSectionAndSpinCount, в ней 2 аргумента, потом исправил на
InitializeCriticalSection (у неё всего 1), так вот, имя поменял, а число аргументов не изменил
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2013, 11:29
Привет! Вот еще темы с ответами:

Как представиь очередь, состоящую из структур, на статическом массиве? - C++
из условия задачи: Разработать программу, реализующую алгоритм очереди (20 элементов). Задача решается в двух вариантах: статическом (на...

Реализовать классы для структур данных «стек» и «очередь» - C++
дали такое задание, не понимаю что делать.. Реализовать классы для структур данных «стек» и «очередь». Следует реализовать...

Создать массив структур для k видов продукции и общую стоимость выпуска всей продукции за год - C++
Дано: Код продукции, название продукции, выпуск в каждом из 4 кварталов. Создать массив структур для k видов продукции и общую стоимость...

Передача структур разных классов - C++
Доброго времени суток. Сложилась такая проблема: В метод одного класса нужно передать структуру другого класса. CmatrixDial.h ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.04.2013, 11:29
Ответ Создать тему
Опции темы

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