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

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

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

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

03.04.2013, 08:31. Просмотров 450. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2013, 08:31     C++ занесение структур находящихся в разных потоках, в общую очередь
Посмотрите здесь:

C++ Сеть и очередь структур
Объединить несколько разных структур в одну, не удаляя исходные C++
Реализовать классы для структур данных «стек» и «очередь» C++
Движение двух фигур в разных потоках C++
C++ В матрице выбрать n элементов в разных строках и разных столбцах так, чтобы их сумма была минимальной
C++ Подключение с помощью директивы #include нескольких функций, находящихся в разных файлах.
C++ Как представиь очередь, состоящую из структур, на статическом массиве?
C++ Передача структур разных классов
Создать массив структур для k видов продукции и общую стоимость выпуска всей продукции за год C++
C++ 2 цикла в разных потоках
C++ Получить перемешанный вывод при работе в разных потоках
можно как то сравнить возвращаемые значения этими функциями(разнопотоковыми)? функции на разных потоках C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
1701 / 1194 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
03.04.2013, 09:52     C++ занесение структур находящихся в разных потоках, в общую очередь #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
anmartex
...
1701 / 1194 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
03.04.2013, 09:58     C++ занесение структур находящихся в разных потоках, в общую очередь #3
Поправка, 63 строчка: InitializeCriticalSection(&cs);
Pavel1111
0 / 0 / 0
Регистрация: 18.06.2012
Сообщений: 9
03.04.2013, 11:21  [ТС]     C++ занесение структур находящихся в разных потоках, в общую очередь #4
Огромное человеческое спасибо!!!
Подскажите пожалуйста еще вот что: почему у меня не получается воспользоваться #include <windows.h> и
CRITICAL_SECTION cs;. Я кстати, хотел их применить но у меня компилятор выдает ошибку: error: too many arguments to function InitializeCriticalSection(&cs, 0). С Вашим кодом та же история. Что нужно сделать?
Компилятор МингВей.
anmartex
...
1701 / 1194 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
03.04.2013, 11:29     C++ занесение структур находящихся в разных потоках, в общую очередь #5
Цитата Сообщение от Pavel1111 Посмотреть сообщение
error: too many arguments to function InitializeCriticalSection(&cs, 0)
Много аргументов.
Цитата Сообщение от anmartex Посмотреть сообщение
Поправка, 63 строчка: InitializeCriticalSection(&cs);
Я сначала воспользовался функцией InitializeCriticalSectionAndSpinCount, в ней 2 аргумента, потом исправил на
InitializeCriticalSection (у неё всего 1), так вот, имя поменял, а число аргументов не изменил
Yandex
Объявления
03.04.2013, 11:29     C++ занесение структур находящихся в разных потоках, в общую очередь
Ответ Создать тему
Опции темы

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