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

предлагаю людям класс "каждому потоку- своё окно" для тестирования многопоточных приложений. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Центр графа http://www.cyberforum.ru/cpp-beginners/thread380460.html
Дана матрица смежности. Найти максимальное расстояние в графе. Пол дня уже мучаюсь, искал в гугле, сам пытался, но ничего не получается... просто тупик... Код вылаживать не буду, так как он не правильный. Просто расскажу, как я хочу сделать. Беру первую вершину, и делаю ее текущей. Если существует ребро между текущей и другой вершиной, делаю ее текущей и иду дальше. При этом считаю все...
C++ задача со строками пожалуйста, помогите. Нужно написать программу , которая определит длину введенной строки L, и, если L>10, то удаляются все цифры. я так понял, что в строке должны быть и цифры и буквы http://www.cyberforum.ru/cpp-beginners/thread380453.html
Перехват запросов C++
Здравствуйте Форумчане, у меня возникла проблема, я хочу сделать что-то вроде веб-логгера который будет перехватывать запросы и т.д. Не подскажите ли Вы мне как это можно реализовать. Заранее спасибо.
C++ Ввод из файла символьного массива
Как ввести вот такой символьный массив из файла ? 2X11 X121 12X1 1112 2222 XXX2 X21X 1X2X
C++ Поменять местами каждые соседние слова http://www.cyberforum.ru/cpp-beginners/thread380419.html
Написать программу, которая считывает текст с клавиатуры и выводит его на экран, меняет местами каждые соседние слова (Borland MS-DOS)
C++ цикл с параметром доно число N >0. найти значение выражения: 1,1 - 1,2 + 1,3 - ... (N слагаемых, знаки чередуются) include <iostream> using namespace std; int n,i; double summa,t; int main() { подробнее

Показать сообщение отдельно
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,395

предлагаю людям класс "каждому потоку- своё окно" для тестирования многопоточных приложений. - C++

09.11.2011, 16:37. Просмотров 492. Ответов 3
Метки (Все метки)

Друзья! То есть если вы разрабатывает многопоточные приложения и закалебались смотреть, что тот или иной поток выводит, то этот класс для вас. Использовать его просто. Подключаете хидер и пишете:
C++
1
cout__<< "что-то";
и видите, что появилось окно, глде написано "что-то"
Если создадите ДРУГОЙ поток и напишите там:
C++
1
cout__<< "еще что-то";
То и увидите другое окно с еще чем-то.
Вот так и тестируйте на здоровье, каждый поток будет в своё окно выводить чё вам надо.

Там есть и недостаток- по закрытию какого-нибудь окна, поток, пишущий в него не закрывается. Другое дело, что пишет он в никуда. Кому надо-пишите свои оконые функции для искоренения этого недостатка

По окнам: их количество и размеры определяются в маросах. Если представлять окна в виде матрицы, то вы увидите на экране матрицу из окон 3 на 4 окна
Количество столбцов в макросе опредлелено, количество строк не более 3-х, запрограммировано.
Поэкспеременируйте.

По умолчанию создаются 12 потоков и соответствено 12 окон, куда потоки пишут TIDы и компьютерное время.
Вся эта что-то распространяется по лицензии GPL.

Вот сам хидер:
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#ifndef MYCOUT___H
#define MYCOUT___H
 
 
#include <iostream> 
#include <pthread.h> 
#include <windows.h>
#include <stdio.h>
#include <map>
using namespace std;
                      /////////////////////////////////////
                      //это что-то определяет координаты окон
                      /////////////////////////////////////
                      //////////и их количество////////////
 
#define skolko_v_rad 4
#define x_levii_verhni_ugol 100
#define y_levii_verhni_ugol 100
#define shirina_okna 250
#define visota__okna 200
#define rasstoinie_mezhdu_oknami_po_gor 20
#define rasstoinie_mezhdu_oknami_po_ver 20
                           //количечство потоков-окон
#define kol_vo_potokov 12
                      /////////////////////////////////////
                      //это что-то определяет координаты окон
                      /////////////////////////////////////
 
 
 
 
//КОму надо кропайте свои оконные процедуры                     
//LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
 
pthread_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER;
HWND hwnd [kol_vo_potokov];
//класс класс класс класс класс класс класс класс класс класс класс класс 
//класс класс класс класс класс класс класс класс класс класс класс класс 
//класс класс класс класс класс класс класс класс класс класс класс класс 
//класс класс класс класс класс класс класс класс класс класс класс класс 
class cout_ {
 public:
  cout_ () {chotchik_okon= 0;}
 ~cout_ () {}
 
  //главная функция, из-зак оторой вся эта бодяга затеяна
  ostream& operator<< (string);
 
 private:
 
  //Это вот что-то есть словарь, ключи- TIDi потоков-писаталей
  //значения- HWND окон                                     
  map <HANDLE, HWND> TIDi_i_okna;
 
  
  //Счётчик окон и функции, которые его инкременируют и возвращают,
  //зачем-то я их сделал дружественными                            
  int chotchik_okon;   
  friend int f_chotchik_okon (cout_& cout__){return cout__.chotchik_okon;}
  friend void in_chotchik_okon (cout_& cout__){++cout__.chotchik_okon;}
 
};
//класс класс класс класс класс класс класс класс класс класс класс класс 
//класс класс класс класс класс класс класс класс класс класс класс класс 
//класс класс класс класс класс класс класс класс класс класс класс класс 
//класс класс класс класс класс класс класс класс класс класс класс класс 
 
 
 
//Это будет функция потока, который создаёт окна.                             
//если выяснитс, что поток, которым мы собираемся чё-то писать, вообще впервые
//включился в эту бодягу, то необходимо создать для него окно.                
//за создание окна отвечает, опять, же- другой поток. НАзовём его X           
//причём, что интересно- этот X может создавать только одно окно              
//поскольку это необходимо делать в разные моменты времени, по мере надобости 
//ВЫвод: таких иксов может и должно быть много                                
//тупо: на каждый пишущий поток своё окно и свой поток, который это окно      
//создаст.                                                                    
//А вот его функция, она ничё не может возвернуть, поскольку кропает цикл     
//приёмки сообщений для окна                                                  
void* f_potoka_sozd_okna (void*);
 
                             //реализация
              //реализацияреализацияреализацияреализация
 
ostream& cout_::operator<< (string stroka) {                                  //
                                                                              //
  HANDLE TID_etogo_potoka= *(HANDLE*)(pthread_self().p);                      //
                                                                              //
                                                                              //
  //проверяем, а есть ли окно для этого потока?                               //
  //Допустим, такого окна нет, это значит, что поток впервые будет что-то     //
  //писать.                                                                   //
  //тогда надо такое окно создать                                             //
  //pthread_mutex_lock (&mutex);                                              //
  if (TIDi_i_okna.find(TID_etogo_potoka)== TIDi_i_okna.end()) {               //
                                                                              //
   //Окно должно создастья в другом потоке                                    //
   //Дело в том, что в один поток не может одновременно создавать окно и      //
   //что-то туда                                                              //
   //писать. Этот поток пишет в окно. Значит, создавать окно должен           //
   //ДРУГОЙ ПОТОК                                                             //
   //И нам понадобится HWND этого окна                                        //
   HWND* pHWND= new HWND;                                                     //
   *pHWND= 0;                                                                 //
   pthread_t thread_t_okna;                                                   //
   pthread_create(&thread_t_okna, NULL, f_potoka_sozd_okna, pHWND);           //
   //Всё, есть новый поток и окно для него.                                   //
   //Теперь надо всё это занести в TIDi_i_TIDi                                //
                                                                              //
   //Это важно, ибо дальнейшее что-то должно происходит тогда, когда окно уже   //
   //создано, то есть pHWND должно стать коррекнтым более или менее, хе-хе    //
   while (!(*pHWND));                                                         //
    TIDi_i_okna [TID_etogo_potoka]= *pHWND;                                   //
  }                                                                           //
                                                                              //
                    //ну вё, тут собсно записывание                           //
  char* temp= new char [stroka.size()+ 2];                                    //
  strcpy (temp, stroka.c_str());                                              //
  temp [stroka.size()]= 10;                                                   //
  temp [stroka.size()+ 1]= 0;                                                 //
  for (int j= 0; j< strlen (temp); j++) {                                     //
   SendMessage ((HWND)TIDi_i_okna [TID_etogo_potoka], WM_CHAR, temp [j], 1);  //
  }                                                                           //
  delete temp;                                                                              //
}                                                                             //
              //реализацияреализацияреализацияреализация
                             //реализация
           
 
 
                          //Создание объекта
                              cout_ cout__;
                          //Создание объекта
 
 
//создаём окно создаём окно создаём окно создаём окно создаём окно создаём окно 
void* f_potoka_sozd_okna (void* pHWND) {                                           
             
           //Для начала определим координаты окна и его размеры
           //ЭТО x и y -координата верехнего левого угла окна  
           int x, y;
           int temp= f_chotchik_okon (cout__);
           
           pthread_mutex_lock (&mutex); 
           if (f_chotchik_okon (cout__)< skolko_v_rad) {
            y= y_levii_verhni_ugol;  
            x= x_levii_verhni_ugol+  (shirina_okna+ \
               rasstoinie_mezhdu_oknami_po_gor)* \
               f_chotchik_okon (cout__);
            in_chotchik_okon (cout__);
           }   
           else if (f_chotchik_okon (cout__)< skolko_v_rad* 2) {
            y= y_levii_verhni_ugol+ visota__okna+ \
             rasstoinie_mezhdu_oknami_po_ver* (2- 1);
            x= x_levii_verhni_ugol;
            x= x_levii_verhni_ugol+  (shirina_okna+ \
               rasstoinie_mezhdu_oknami_po_gor)* \
               (f_chotchik_okon (cout__)- skolko_v_rad* (2- 1));
            in_chotchik_okon (cout__);
           }
           else if (f_chotchik_okon (cout__)< skolko_v_rad* 3) {
            y= y_levii_verhni_ugol+ (visota__okna+ \
               rasstoinie_mezhdu_oknami_po_ver)* (3- 1);
            x= x_levii_verhni_ugol;
            x= x_levii_verhni_ugol+  (shirina_okna+ \
               rasstoinie_mezhdu_oknami_po_gor)* \
               (f_chotchik_okon (cout__)- skolko_v_rad* (3- 1));
            in_chotchik_okon (cout__);
           }
 
           pthread_mutex_unlock (&mutex);
           //с координтами разобрались                                        //
                                                                              //
           MSG messages;                                                      //
           *(HWND*)pHWND  = CreateWindowEx (                                  //
           0,                                                                 //
           "Edit",                                                            //
           NULL,                                                              //
           WS_OVERLAPPEDWINDOW|ES_MULTILINE|WS_VSCROLL|ES_AUTOVSCROLL,        //
           //CW_USEDEFAULT,                                                   //
           x, y, shirina_okna, visota__okna,                                  //
           NULL,                                                              //
           NULL,                                                              //
           0,                                                                 //
           NULL                                                               //
           );                                                                 //
           ShowWindow (*(HWND*)pHWND, SW_SHOWDEFAULT);                        //
           UpdateWindow (*(HWND*)pHWND);                                      //
           //= hwnd;                                                          //
           temp= f_chotchik_okon (cout__);                                    //
                                                                              //
           while (GetMessage (&messages, NULL, 0, 0))    {                    //
            TranslateMessage(&messages);                                      //
            DispatchMessage(&messages);                                       //
           }                                                                  //
}                                                                             //
//создаём окно создаём окно создаём окно создаём окно создаём окно создаём окно 
//недостаток: при закрытии какого-нибудь окна поток, пишущий в это окно, не   //
//закрывается и он продолжает писать, но в никуда. Чтобы его закрыть по       //
//закрытию окна, пишите свои оконные функции                                  //
#endif
А вот пример как использовать:
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
#include <mycout__.h>
 
/////////////////////////////////////////////////////////////////////////////
//Это функция потока-писателя
void *task1 (void* po) { 
 
   //РАзберёмся с TIDами
   char buffer [256];
   pthread_t pthread_t_ = pthread_self();
   int TID= *(int*)(pthread_t_.p);
   itoa (TID, buffer, 16);
   int temp= strlen (buffer);
 
 
   time_t lt= time (NULL);
   
   while (1) { 
    Sleep (1000+ TID%1000);
    buffer [temp]= 0;
    lt = time(NULL);
    cout__<< string(strcat(strcat (buffer, "__"), ctime(&lt))) ;
   }
 
 
 return NULL;
} 
/////////////////////////////////////////////////////////////////////////////
 
 
int main(int argc, char *argv[]) { 
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 //Объявляем потоки
 pthread_t array_p [kol_vo_potokov];
 
 
 //создаём
 for (int i= 0; i< kol_vo_potokov; i++) {
  pthread_create(&array_p[i],NULL,task1, NULL); // Создаем  потоки. 
 }
 
 
 // Дополнительная обработка. 
 for (int i= 0; i< kol_vo_potokov; i++) {
  pthread_join(array_p[i],NULL); // Ожидание завершения 
 }
 getchar ();
 return (0) ; 
}
Тестируйте, результаты сюда, будем посмотреть. При комиляции ОБЯЗАТЕЛЬНО создавайте окно консоли, ибо только закрыв его, мы сожете убить поцесс. Ну или ещё какими-нибудь методами тпа ProcessExplorer, но ну его.

 Комментарий модератора 
В следующий раз вместе со "что-то" я выпишу еще и карточку.
Следите за речью
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 22:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru