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

Как сделать "Старт", "Пауза", Стоп"? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.97
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
26.12.2012, 11:11     Как сделать "Старт", "Пауза", Стоп"? #1
Доброго времени суток,
как сделать так, чтобы при нажатии на кнопку начиналось цикличное действие (рисование например) и продолжалось бы пока не будет нажата другая кнопка. Грубо говоря, как сделать "Старт", "Пауза", Стоп".
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2012, 11:11     Как сделать "Старт", "Пауза", Стоп"?
Посмотрите здесь:

Пауза при работе программы. C++
стоп-программа C++
Пауза FindFirstFile C++
C++ Вернуть на старт
C++ Старт потока с 2 параметрами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
06.01.2013, 00:37  [ТС]     Как сделать "Старт", "Пауза", Стоп"? #41
Цитата Сообщение от kravam Посмотреть сообщение
э, алё, а чё с моим решением?
Ещё раз спасибо за помощь, но ваш код реализовать у меня не получилось, много ошибок вылетало, пробовал в инете искать исправлять не получилось, да и хотел в форме делать, там проще.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
06.01.2013, 00:47     Как сделать "Старт", "Пауза", Стоп"? #42
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от kravam Посмотреть сообщение
э, алё, а чё с моим решением?
ниче
сам то проверял?
смесь WinApi и никсов
откуда в WinApi
pthread_cancel pthread_create........
и кто тебя учил прибивать поток снаружи
C++
1
2
3
4
//Убиваем на хрен поток, который пишет всякую херь
                  //но только если он создан                        
                  if (flag)
                    pthread_cancel(ThreadA);
ты вообще похож на странного заказчика
дайте мне с таймером
на тебе с таймером
это не то дай консоль
на консоль
а где таймер?
вот тебе решения на чистом WinApi ( если не тебе так другим пригодится)
с таймером ничего не виснет никаких циклов

Кликните здесь для просмотра всего текста
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
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
// TestWinApiTimer.cpp: определяет точку входа для приложения.
//
 
#include "stdafx.h"
#include "TestWinApiTimer.h"
#include <stdio.h>
 
 
#define MAX_LOADSTRING 100
 
// Глобальные переменные:
HINSTANCE hInst;                                // текущий экземпляр
char szTitle[MAX_LOADSTRING]="Test";                    // Текст строки заголовка
char szWindowClass[MAX_LOADSTRING]="ClassWndTest";          // имя класса главного окна
 
 
 
 
HWND wndButtonStart;
HWND wndButtonStop;
HWND wndButtonPause;
COLORREF colorRect;
int Inter=0;
 
 
// Отправить объявления функций, включенных в этот модуль кода:
WORD                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
void EnablDisabl(BOOL flag)
{
 EnableWindow(wndButtonStart,!flag);
 EnableWindow(wndButtonStop,flag);
 EnableWindow(wndButtonPause,flag);
}
void OnCreate(HWND wnd)
{
 
wndButtonStart=CreateWindow("button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 20, 80, 30, wnd, (HMENU)10001, hInst, NULL);
wndButtonStop=CreateWindow("button", "Stop", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 50, 80, 30, wnd, (HMENU)10002, hInst, NULL);
wndButtonPause=CreateWindow("button", "Pause", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 80, 80, 30, wnd, (HMENU)10003, hInst, NULL);
EnablDisabl(FALSE);
 
}
void OnStart(HWND wnd)
{
 SetTimer(wnd,1,100,NULL);
 EnablDisabl(TRUE);
}
void OnStop(HWND wnd)
{
 Inter=0; 
 KillTimer(wnd,1);
 EnablDisabl(FALSE);
}
 
void OnPause(HWND wnd)
{
 
  KillTimer(wnd,1);
  EnablDisabl(FALSE);
}
 
 
void OnPaint(HDC dc)
{
char buf[32];
    
sprintf(buf,"%d",Inter);
HPEN pen=CreatePen(PS_SOLID,5,colorRect);
HBRUSH brush =CreateSolidBrush(colorRect);
 
HGDIOBJ oldpen=SelectObject(dc,pen);
HGDIOBJ oldBrush=SelectObject(dc,brush);
Rectangle(dc,100,100,200,20);
TextOut(dc,110,60,buf,strlen(buf));
SelectObject(dc,oldBrush);
SelectObject(dc,oldpen);
DeleteObject(brush);
DeleteObject(pen);
}
COLORREF modifyColor(COLORREF color,int ofset)
{
ofset %=24;
return 0x00FFFFFF&((color<<ofset)|(color>>(24-ofset)));
}
 
 
void OnTimer(HWND wnd)
{
Inter++;
colorRect=modifyColor(RGB(0xFF,0xF0,0x0F),Inter);
 
InvalidateRect(wnd,NULL,FALSE);
}
 
 
 
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    
 
    // TODO: разместите код здесь.
    MSG msg;
    HACCEL hAccelTable;
 
     
    MyRegisterClass(hInstance);
 
    // Выполнить инициализацию приложения:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
 
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWINAPITIMER));
 
    // Цикл основного сообщения:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return (int) msg.wParam;
}
 
 
 
//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
//  КОММЕНТАРИИ:
//
//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
//    был совместим с системами Win32, не имеющими функции RegisterClassEx'
//    которая была добавлена в Windows 95. Вызов этой функции важен для того,
//    чтобы приложение получило "качественные" мелкие значки и установило связь
//    с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTWINAPITIMER));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_TESTWINAPITIMER);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
    return RegisterClassEx(&wcex);
}
 
//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
 
   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
 
//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND  - обработка меню приложения
//  WM_PAINT    -Закрасить главное окно
//  WM_DESTROY   - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        {
        case 10001:
            OnStart(hWnd);
            break;
        case 10002:
            OnStop(hWnd);
            break;
        case 10003:
            OnPause(hWnd);
            break;
        
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_CREATE: 
          OnCreate(hWnd);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        OnPaint(hdc);
        EndPaint(hWnd, &ps);
        break;
    case WM_TIMER:
         OnTimer(hWnd);
        break; 
 
 
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
 
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}


без таймера работа в главном цикле никто не ждет никаких сообщений
Кликните здесь для просмотра всего текста
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
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
// TestWinApiTimer.cpp: определяет точку входа для приложения.
//
 
#include "stdafx.h"
#include "TestWinApiTimer.h"
#include <stdio.h>
 
 
#define MAX_LOADSTRING 100
 
// Глобальные переменные:
HINSTANCE hInst;                                // текущий экземпляр
char szTitle[MAX_LOADSTRING]="Test";                    // Текст строки заголовка
char szWindowClass[MAX_LOADSTRING]="ClassWndTest";          // имя класса главного окна
 
 
 
 
HWND wndButtonStart;
HWND wndButtonStop;
HWND wndButtonPause;
COLORREF colorRect;
int Inter=0;
 
 
// Отправить объявления функций, включенных в этот модуль кода:
WORD                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
void EnablDisabl(BOOL flag)
{
 EnableWindow(wndButtonStart,!flag);
 EnableWindow(wndButtonStop,flag);
 EnableWindow(wndButtonPause,flag);
}
void OnCreate(HWND wnd)
{
 
wndButtonStart=CreateWindow("button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 20, 80, 30, wnd, (HMENU)10001, hInst, NULL);
wndButtonStop=CreateWindow("button", "Stop", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 50, 80, 30, wnd, (HMENU)10002, hInst, NULL);
wndButtonPause=CreateWindow("button", "Pause", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 80, 80, 30, wnd, (HMENU)10003, hInst, NULL);
EnablDisabl(FALSE);
 
}
void OnStart(HWND wnd)
{
 SetTimer(wnd,1,100,NULL);
 EnablDisabl(TRUE);
}
void OnStop(HWND wnd)
{
 Inter=0; 
 KillTimer(wnd,1);
 EnablDisabl(FALSE);
}
 
void OnPause(HWND wnd)
{
 
  KillTimer(wnd,1);
  EnablDisabl(FALSE);
}
 
 
void OnPaint(HDC dc)
{
char buf[32];
    
sprintf(buf,"%d",Inter);
HPEN pen=CreatePen(PS_SOLID,5,colorRect);
HBRUSH brush =CreateSolidBrush(colorRect);
 
HGDIOBJ oldpen=SelectObject(dc,pen);
HGDIOBJ oldBrush=SelectObject(dc,brush);
Rectangle(dc,100,100,200,20);
TextOut(dc,110,60,buf,strlen(buf));
SelectObject(dc,oldBrush);
SelectObject(dc,oldpen);
DeleteObject(brush);
DeleteObject(pen);
}
COLORREF modifyColor(COLORREF color,int ofset)
{
ofset %=24;
return 0x00FFFFFF&((color<<ofset)|(color>>(24-ofset)));
}
 
 
void OnTimer(HWND wnd)
{
Inter++;
colorRect=modifyColor(RGB(0xFF,0xF0,0x0F),Inter);
 
InvalidateRect(wnd,NULL,FALSE);
}
 
 
 
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    
 
    // TODO: разместите код здесь.
    MSG msg;
    HACCEL hAccelTable;
 
     
    MyRegisterClass(hInstance);
 
    // Выполнить инициализацию приложения:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
 
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWINAPITIMER));
 
    // Цикл основного сообщения:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return (int) msg.wParam;
}
 
 
 
//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
//  КОММЕНТАРИИ:
//
//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
//    был совместим с системами Win32, не имеющими функции RegisterClassEx'
//    которая была добавлена в Windows 95. Вызов этой функции важен для того,
//    чтобы приложение получило "качественные" мелкие значки и установило связь
//    с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTWINAPITIMER));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_TESTWINAPITIMER);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
    return RegisterClassEx(&wcex);
}
 
//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
 
   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
 
//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND  - обработка меню приложения
//  WM_PAINT    -Закрасить главное окно
//  WM_DESTROY   - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        {
        case 10001:
            OnStart(hWnd);
            break;
        case 10002:
            OnStop(hWnd);
            break;
        case 10003:
            OnPause(hWnd);
            break;
        
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_CREATE: 
          OnCreate(hWnd);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        OnPaint(hdc);
        EndPaint(hWnd, &ps);
        break;
    case WM_TIMER:
         OnTimer(hWnd);
        break; 
 
 
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
 
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}


поток созданный CreateThread
Кликните здесь для просмотра всего текста
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
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
// TestWinApiThread.cpp: определяет точку входа для приложения.
//
 
#include "stdafx.h"
#include "TestWinApiThread.h"
 
#include <stdio.h>
#include <Mmsystem.h>
#pragma comment(lib,"Winmm.lib")
 
#define MAX_LOADSTRING 100
 
// Глобальные переменные:
 
HINSTANCE hInst;                                // текущий экземпляр
char szTitle[MAX_LOADSTRING]="Test";                    // Текст строки заголовка
char szWindowClass[MAX_LOADSTRING]="ClassWndTest";          // имя класса главного окна
HWND hMainWnd;
HWND wndButtonStart;
HWND wndButtonStop;
HWND wndButtonPause;
COLORREF colorRect;
int Inter=0;
 
unsigned int oldtime=0;
BOOL flagThread=FALSE;
 
HANDLE hThread;
DWORD ThreadId;
// Отправить объявления функций, включенных в этот модуль кода:
WORD                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI fncthread(LPVOID param);
 
int Sys_Milliseconds (void)
{
    return timeGetTime()&0xffff;
}
 
void EnablDisabl(BOOL flag)
{
 EnableWindow(wndButtonStart,!flag);
 EnableWindow(wndButtonStop,flag);
 EnableWindow(wndButtonPause,flag);
}
COLORREF modifyColor(COLORREF color,int ofset)
{
ofset %=24;
return 0x00FFFFFF&((color<<ofset)|(color>>(24-ofset)));
}
 
 
 
 
void OnCreate(HWND wnd)
{
 
wndButtonStart=CreateWindow("button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 20, 80, 30, wnd, (HMENU)10001, hInst, NULL);
wndButtonStop=CreateWindow("button", "Stop", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 50, 80, 30, wnd, (HMENU)10002, hInst, NULL);
wndButtonPause=CreateWindow("button", "Pause", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 80, 80, 30, wnd, (HMENU)10003, hInst, NULL);
EnablDisabl(FALSE);
}
void OnStart(HWND wnd)
{
EnablDisabl(TRUE);
 hThread = CreateThread(0,0,fncthread,wnd,0,0);
 
}
void OnStop(HWND wnd)
{
  flagThread=FALSE;
EnablDisabl(FALSE);
 Inter=0; 
 
}
 
void OnPause(HWND wnd)
{
  flagThread=FALSE;
    EnablDisabl(FALSE);
 
}
 
 DWORD WINAPI fncthread(LPVOID param)
{
  
 unsigned int newtime;
  unsigned int time;
  HWND wnd;
    flagThread=TRUE;
     wnd=(HWND)param;
 while(flagThread)
  {
 
   newtime = Sys_Milliseconds ();
  time = newtime - oldtime;
    if(time>100)
    {
    
        Inter++;
        colorRect=modifyColor(RGB(0xFF,0xF0,0x0F),Inter);
        InvalidateRect(wnd,NULL,FALSE);
    
    oldtime=newtime;
    
    }
  }
  return 0;
 }
 
 
 
 
void OnPaint(HDC dc)
{
char buf[32];
    
sprintf(buf,"%d",Inter);
HPEN pen=CreatePen(PS_SOLID,5,colorRect);
HBRUSH brush =CreateSolidBrush(colorRect);
 
HGDIOBJ oldpen=SelectObject(dc,pen);
HGDIOBJ oldBrush=SelectObject(dc,brush);
Rectangle(dc,100,100,200,20);
TextOut(dc,110,60,buf,strlen(buf));
SelectObject(dc,oldBrush);
SelectObject(dc,oldpen);
DeleteObject(brush);
DeleteObject(pen);
}
 
 
 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    
    // TODO: разместите код здесь.
    MSG msg;
    HACCEL hAccelTable;
 
    MyRegisterClass(hInstance);
 
    // Выполнить инициализацию приложения:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
    
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWINAPITHREAD));
 
    // Цикл основного сообщения:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return (int) msg.wParam;
}
 
 
 
//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
//  КОММЕНТАРИИ:
//
//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
//    был совместим с системами Win32, не имеющими функции RegisterClassEx'
//    которая была добавлена в Windows 95. Вызов этой функции важен для того,
//    чтобы приложение получило "качественные" мелкие значки и установило связь
//    с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTWINAPITHREAD));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_TESTWINAPITHREAD);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
    return RegisterClassEx(&wcex);
}
 
//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
 
   hMainWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hMainWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hMainWnd, nCmdShow);
   UpdateWindow(hMainWnd);
 
   return TRUE;
}
 
//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND  - обработка меню приложения
//  WM_PAINT    -Закрасить главное окно
//  WM_DESTROY   - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        {
        case 10001:
            OnStart(hWnd);
            break;
        case 10002:
            OnStop(hWnd);
            break;
        case 10003:
            OnPause(hWnd);
            break;
        
        
        
        
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_CREATE: 
          OnCreate(hWnd);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        OnPaint(hdc);
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

поток созданный _beginthreadex
Кликните здесь для просмотра всего текста
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
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
// TstWinApiThread_beginthreadex.cpp: определяет точку входа для приложения.
//
 
#include "stdafx.h"
#include "TstWinApiThread_beginthreadex.h"
 
 
 
#include <stdio.h>
#include <Mmsystem.h>
#include <process.h> 
 
#pragma comment(lib,"Winmm.lib")
 
 
#define MAX_LOADSTRING 100
 
// Глобальные переменные:
 
 
HINSTANCE hInst;                                // текущий экземпляр
char szTitle[MAX_LOADSTRING]="Test";                    // Текст строки заголовка
char szWindowClass[MAX_LOADSTRING]="ClassWndTest";          // имя класса главного окна
HWND hMainWnd;
HWND wndButtonStart;
HWND wndButtonStop;
HWND wndButtonPause;
COLORREF colorRect;
int Inter=0;
 
HANDLE hThread;
unsigned int ThreadId;
unsigned int oldtime=0;
BOOL flagThread=FALSE;
 
 
 
 
// Отправить объявления функций, включенных в этот модуль кода:
WORD                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
unsigned __stdcall fncthread(void* ArgList);
 
int Sys_Milliseconds (void)
{
    return timeGetTime()&0xffff;
}
 
void EnablDisabl(BOOL flag)
{
 EnableWindow(wndButtonStart,!flag);
 EnableWindow(wndButtonStop,flag);
 EnableWindow(wndButtonPause,flag);
}
COLORREF modifyColor(COLORREF color,int ofset)
{
ofset %=24;
return 0x00FFFFFF&((color<<ofset)|(color>>(24-ofset)));
}
 
 
 
 
void OnCreate(HWND wnd)
{
 
wndButtonStart=CreateWindow("button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 20, 80, 30, wnd, (HMENU)10001, hInst, NULL);
wndButtonStop=CreateWindow("button", "Stop", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 50, 80, 30, wnd, (HMENU)10002, hInst, NULL);
wndButtonPause=CreateWindow("button", "Pause", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 80, 80, 30, wnd, (HMENU)10003, hInst, NULL);
EnablDisabl(FALSE);
}
void OnStart(HWND wnd)
{
EnablDisabl(TRUE);
hThread =(HANDLE)_beginthreadex(NULL, 0, fncthread, (void*)wnd, 0, &ThreadId);
 
 
}
void OnStop(HWND wnd)
{
  flagThread=FALSE;
EnablDisabl(FALSE);
 Inter=0; 
 
}
 
void OnPause(HWND wnd)
{
  flagThread=FALSE;
    EnablDisabl(FALSE);
 
}
 
unsigned __stdcall fncthread(void* ArgList)
{
  
 unsigned int newtime;
  unsigned int time;
  HWND wnd;
    flagThread=TRUE;
     wnd=(HWND)ArgList; 
    while(flagThread)
  {
 
   newtime = Sys_Milliseconds ();
  time = newtime - oldtime;
    if(time>100)
    {
    
        Inter++;
        colorRect=modifyColor(RGB(0xFF,0xF0,0x0F),Inter);
        InvalidateRect(wnd,NULL,FALSE);
    
    oldtime=newtime;
    
    }
  }
  _endthreadex( 0 );
  return 0;
 }
 
 
 
 
void OnPaint(HDC dc)
{
char buf[64];
    
sprintf(buf,"%d",Inter);
HPEN pen=CreatePen(PS_SOLID,5,colorRect);
HBRUSH brush =CreateSolidBrush(colorRect);
 
HGDIOBJ oldpen=SelectObject(dc,pen);
HGDIOBJ oldBrush=SelectObject(dc,brush);
Rectangle(dc,100,100,200,20);
TextOut(dc,110,60,buf,strlen(buf));
SelectObject(dc,oldBrush);
SelectObject(dc,oldpen);
DeleteObject(brush);
DeleteObject(pen);
}
 
 
 
 
 
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    
    // TODO: разместите код здесь.
    MSG msg;
    HACCEL hAccelTable;
 
    
    MyRegisterClass(hInstance);
 
    // Выполнить инициализацию приложения:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
 
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TSTWINAPITHREAD_BEGINTHREADEX));
 
    // Цикл основного сообщения:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return (int) msg.wParam;
}
 
 
 
//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
//  КОММЕНТАРИИ:
//
//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
//    был совместим с системами Win32, не имеющими функции RegisterClassEx'
//    которая была добавлена в Windows 95. Вызов этой функции важен для того,
//    чтобы приложение получило "качественные" мелкие значки и установило связь
//    с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TSTWINAPITHREAD_BEGINTHREADEX));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_TSTWINAPITHREAD_BEGINTHREADEX);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
    return RegisterClassEx(&wcex);
}
 
//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
 
   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
 
//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND  - обработка меню приложения
//  WM_PAINT    -Закрасить главное окно
//  WM_DESTROY   - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        {
        case 10001:
            OnStart(hWnd);
            break;
        case 10002:
            OnStop(hWnd);
            break;
        case 10003:
            OnPause(hWnd);
            break;
        
        
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_CREATE: 
          OnCreate(hWnd);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        OnPaint(hdc);
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

все работают примерно одинаково, у каждого свои недостатки
каждый решает сам для себя каким путем пойдет,в зависимости от задачи
сейчас какие будут вопросы?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
06.01.2013, 01:48     Как сделать "Старт", "Пауза", Стоп"? #43
Цитата Сообщение от ValeryS Посмотреть сообщение
ниче
сам то проверял?
смесь WinApi и никсов
откуда в WinApi
pthread_cancel pthread_create........
Это что, критика такая? Прикольно [удалено]. Так-то я проверял, да. Кто-то запрещал использовать сторонние библиотеки? Библиотека pthread, адаптированная под винду, представляешь себе бывает и такое. Теперешняя ситуация: челы старались, адаптировали pthread под винду. Тут приходит ValeryS и говорит: это всё фигня их адаптация потому что это фигня. Тебе уж если лень изучать или ставит библиотеку, так и скажи. Хаять инструмент, не зная его не как-то не того...

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Цитата Сообщение от ValeryS Посмотреть сообщение
и кто тебя учил прибивать поток снаружи
Именно так и именно научили. Это называется аннулирование асинхронного типа. Цитата из книжки:

"Для отмены выполнения некоторого потока по инициативе потока из того же
адресного пространства используется функция pthread__cancel (). Отменяемый поток
задается параметром thread."
Скучно с тобой становится
А если убивать не снаружи, то pthread_exit(), если чё.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Цитата Сообщение от ValeryS Посмотреть сообщение
ты вообще похож на странного заказчика
дайте мне с таймером
на тебе с таймером
это не то дай консоль
на консоль
а где таймер?
Всё верно, я там, куда ты меня послал не потянул СХОДУ (так-то я разобрался бы конечно со временем.), честно говорю Если ты не считаешь нужным давать мне простой вариант с таймером- не давай, мне-то что. Я для себя вывод сделал и ладно.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

А вопрос простой будет
TestWinApiTimer.h-то дашь? А то у меня нет...
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
06.01.2013, 02:25     Как сделать "Старт", "Пауза", Стоп"? #44
Цитата Сообщение от kravam Посмотреть сообщение
TestWinApiTimer.h-то дашь? А то у меня нет...
а кодить только по индийски можем?
ежу понятно что это создал волшебник и там лежит ссылка ресурсы
ну на возьми
TestWinApiTimer.h
Кликните здесь для просмотра всего текста

C++
1
2
#pragma once
#include "resource.h"

на
resource.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
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by TestWinApiTimer.rc
//
 
#define IDS_APP_TITLE           103
 
#define IDR_MAINFRAME           128
#define IDD_TESTWINAPITIMER_DIALOG  102
#define IDD_ABOUTBOX            103
#define IDM_ABOUT               104
#define IDM_EXIT                105
#define IDI_TESTWINAPITIMER         107
#define IDI_SMALL               108
#define IDC_TESTWINAPITIMER         109
#define IDC_MYICON              2
#ifndef IDC_STATIC
#define IDC_STATIC              -1
#endif
// Следующие стандартные значения для новых объектов
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
 
#define _APS_NO_MFC                 130
#define _APS_NEXT_RESOURCE_VALUE    129
#define _APS_NEXT_COMMAND_VALUE     32771
#define _APS_NEXT_CONTROL_VALUE     1000
#define _APS_NEXT_SYMED_VALUE       110
#endif
#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
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
//Описание ресурсов, созданное в Microsoft Visual C++.
//
#include "resource.h"
 
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Создано из ресурса TEXTINCLUDE 2.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
 
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
LANGUAGE 25, 1
#pragma code_page(1251)
 
/////////////////////////////////////////////////////////////////////////////
//
// Значок
//
 
// Значок с наименьшим значением идентификатора помещается первым, чтобы гарантировать использование
// идентичного значка приложения для всех систем.
 
IDI_TESTWINAPITIMER       ICON         "TestWinApiTimer.ico"
IDI_SMALL               ICON         "small.ico"
 
/////////////////////////////////////////////////////////////////////////////
//
// Меню
//
 
IDC_TESTWINAPITIMER MENU
BEGIN
    POPUP "&Файл"
    BEGIN
        MENUITEM "В&ыход",                IDM_EXIT
    END
    POPUP "&Справка"
    BEGIN
        MENUITEM "&О программе ...",           IDM_ABOUT
    END
END
 
 
/////////////////////////////////////////////////////////////////////////////
//
// Сочетание клавиш
//
 
IDC_TESTWINAPITIMER ACCELERATORS
BEGIN
    "?",            IDM_ABOUT,              ASCII,  ALT
    "/",            IDM_ABOUT,              ASCII,  ALT
END
 
 
/////////////////////////////////////////////////////////////////////////////
//
// Диалоговое окно
//
 
IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "О проекте TestWinApiTimer"
FONT 8, "MS Shell Dlg"
BEGIN
    ICON            IDR_MAINFRAME,IDC_STATIC,14,14,21,20
    LTEXT           "TestWinApiTimer, версия 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX
    LTEXT           "Copyright (C) 2013",IDC_STATIC,42,26,114,8
    DEFPUSHBUTTON   "ОК",IDOK,113,41,50,14,WS_GROUP
END
 
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
 
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_ABOUTBOX, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 163
        TOPMARGIN, 7
        BOTTOMMARGIN, 55
    END
END
#endif    // APSTUDIO_INVOKED
 
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
    "resource.h\0"
END
 
2 TEXTINCLUDE
BEGIN
    "#ifndef APSTUDIO_INVOKED\r\n"
    "#include ""targetver.h""\r\n"
    "#endif\r\n"
    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "#include ""windows.h""\r\n"
    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
    "\0"
END
 
3 TEXTINCLUDE
BEGIN
    "\r\n"
    "\0"
END
 
#endif    // APSTUDIO_INVOKED
 
/////////////////////////////////////////////////////////////////////////////
//
// Таблица строк
//
 
STRINGTABLE
BEGIN
   IDC_TESTWINAPITIMER   "TESTWINAPITIMER"
   IDS_APP_TITLE       "TestWinApiTimer"
END
 
#endif
/////////////////////////////////////////////////////////////////////////////
 
 
 
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Создано из ресурса TEXTINCLUDE 3.
//
 
/////////////////////////////////////////////////////////////////////////////
#endif    // не APSTUDIO_INVOKED

там еще "stdafx.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
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
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
//#include "stdafx.h"
#include "TestWinApiTimer.h"
#include <windows.h>
#include <stdio.h>
 
// Глобальные переменные:
HINSTANCE hInst;                                // текущий экземпляр
char szTitle[]="Test";                  // Текст строки заголовка
char szWindowClass[]="ClassWndTest";            // имя класса главного окна
 
 
 
 
HWND wndButtonStart;
HWND wndButtonStop;
HWND wndButtonPause;
COLORREF colorRect;
int Inter=0;
 
 
// Отправить объявления функций, включенных в этот модуль кода:
WORD                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
void EnablDisabl(BOOL flag)
{
 EnableWindow(wndButtonStart,!flag);
 EnableWindow(wndButtonStop,flag);
 EnableWindow(wndButtonPause,flag);
}
void OnCreate(HWND wnd)
{
 
wndButtonStart=CreateWindow("button", "Start", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 20, 80, 30, wnd, (HMENU)10001, hInst, NULL);
wndButtonStop=CreateWindow("button", "Stop", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 50, 80, 30, wnd, (HMENU)10002, hInst, NULL);
wndButtonPause=CreateWindow("button", "Pause", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
 10, 80, 80, 30, wnd, (HMENU)10003, hInst, NULL);
EnablDisabl(FALSE);
 
}
void OnStart(HWND wnd)
{
 SetTimer(wnd,1,100,NULL);
 EnablDisabl(TRUE);
}
void OnStop(HWND wnd)
{
 Inter=0; 
 KillTimer(wnd,1);
 EnablDisabl(FALSE);
}
 
void OnPause(HWND wnd)
{
 
  KillTimer(wnd,1);
  EnablDisabl(FALSE);
}
 
 
void OnPaint(HDC dc)
{
char buf[32];
    
sprintf(buf,"%d",Inter);
HPEN pen=CreatePen(PS_SOLID,5,colorRect);
HBRUSH brush =CreateSolidBrush(colorRect);
 
HGDIOBJ oldpen=SelectObject(dc,pen);
HGDIOBJ oldBrush=SelectObject(dc,brush);
Rectangle(dc,100,100,200,20);
TextOut(dc,110,60,buf,strlen(buf));
SelectObject(dc,oldBrush);
SelectObject(dc,oldpen);
DeleteObject(brush);
DeleteObject(pen);
}
COLORREF modifyColor(COLORREF color,int ofset)
{
ofset %=24;
return 0x00FFFFFF&((color<<ofset)|(color>>(24-ofset)));
}
 
 
void OnTimer(HWND wnd)
{
Inter++;
colorRect=modifyColor(RGB(0xFF,0xF0,0x0F),Inter);
 
InvalidateRect(wnd,NULL,FALSE);
}
 
 
 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    
 
    // TODO: разместите код здесь.
    MSG msg;
    HACCEL hAccelTable;
 
     
    MyRegisterClass(hInstance);
 
    // Выполнить инициализацию приложения:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
 
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWINAPITIMER));
 
    // Цикл основного сообщения:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
 
    return (int) msg.wParam;
}
 
 
 
//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
//  КОММЕНТАРИИ:
//
//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
//    был совместим с системами Win32, не имеющими функции RegisterClassEx'
//    которая была добавлена в Windows 95. Вызов этой функции важен для того,
//    чтобы приложение получило "качественные" мелкие значки и установило связь
//    с ними.
//
WORD MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TESTWINAPITIMER));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_TESTWINAPITIMER);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
    return RegisterClassEx(&wcex);
}
 
//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
 
   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
 
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
 
//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND  - обработка меню приложения
//  WM_PAINT    -Закрасить главное окно
//  WM_DESTROY   - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
 
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        {
        case 10001:
            OnStart(hWnd);
            break;
        case 10002:
            OnStop(hWnd);
            break;
        case 10003:
            OnPause(hWnd);
            break;
        
        
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_CREATE: 
          OnCreate(hWnd);
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        OnPaint(hdc);
        EndPaint(hWnd, &ps);
        break;
    case WM_TIMER:
         OnTimer(hWnd);
        break; 
 
 
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
 
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}


иконки тоже скинуть?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
06.01.2013, 03:33     Как сделать "Старт", "Пауза", Стоп"? #45
Цитата Сообщение от ValeryS Посмотреть сообщение
ежу понятно что это создал волшебник и там лежит ссылка ресурсы
Говори прямо где лежит ссылка на ресурсы и при чём тут TestWinApiTimer.h; или вообще молчи, скинул и скинул.

Добавлено через 57 минут
Так, то есть я понимаю так (по первому коду): создаётся таймер, и через каждые 100 миллисекунд он посылает окну сообщения. То есть окно каждые 100 миллисекунд эти сообщения должным образом обрабатывает. В частности, вызывает функцию которая совершает нужные нам действия. (прорисовывает чё нам надо).
Что ж, соглашусь, мне такого в голову не приходило. Действительно, один поток. Ты бы на пальцах объяснил мне всё это дело, нормально было бы и не надо было никуда отсылать. Другой разговор был бы совсем.
Иметь ввиду такой приём иметь, несомненно, стоит.

А теперь по коду:
Неважный вопрос: наверное, можно было бы вместо обработки сообщения создать функцию обратного вызова и четвёртым параметром передавать её SetTimer, я бы так и сделал.

А теперь тот самый ДРУГОЙ разговор. Смотри.

C++
1
2
3
4
5
6
7
8
9
void  OnTimer(HWND wnd)
{
Inter++;
colorRect=modifyColor(RGB(0xFF,0xF0,0x0F),Inter);
 
InvalidateRect(wnd,NULL,FALSE);
Sleep (10000);
 
}
И всё, твоя программа встряла. И окно не перерисовывается и вообще.
Так что ты сколько угодно можешь говорить, что:
Цитата Сообщение от ValeryS Посмотреть сообщение
с таймером ничего не виснет никаких циклов
мы же с тобой оба понимаем, что это неправда.

Другие коды не смотрел, но УВЕРЕН, если они однопоточные, дела обстоят точно также. Задержка в потоке означает задержку в программе.

А в двупоточной программе этого никогда не будет. Привет.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
06.01.2013, 14:58     Как сделать "Старт", "Пауза", Стоп"? #46
Сами виноваты человек написал вам что у него Builder, а вы ему Dev и WinApi пихаете...я уже не говорю про pthread и консоль...

Добавлено через 3 минуты
Цитата Сообщение от kravam Посмотреть сообщение
Да с IDE тебе не повезло. Bilder это вообще по-моему не знаю что а первая тоже какой-о эксклюзив.
Ага в Dev повезло ...

Как раз Builder куда лучше Dev ...
А главное если использовать потоки то не нужно извращаться с WinApi для синхронизации.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
06.01.2013, 15:36     Как сделать "Старт", "Пауза", Стоп"? #47
Цитата Сообщение от kravam Посмотреть сообщение
И всё, твоя программа встряла. И окно не перерисовывается и вообще.
Без фанатизма
Я же сказал, у каждого метода свои недостатки
тяжеловесы, или чтение с порта в отдельный поток, а рассчитать положение фигурки на экране нафиг не нужен

Цитата Сообщение от kravam Посмотреть сообщение
А в двупоточной программе этого никогда не будет.
там свои проблемы синхронизация, одновременный доступ
Цитата Сообщение от Avazart Посмотреть сообщение
не нужно извращаться с WinApi для синхронизации.
прям таки совсем не нужно?
Автомат все за тебя не сделает
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
06.01.2013, 15:51     Как сделать "Старт", "Пауза", Стоп"? #48
Цитата Сообщение от ValeryS Посмотреть сообщение
прям таки совсем не нужно?
Автомат все за тебя не сделает
Конечно... ( если конечно не учитывать тот факт что VCL - обвертка WinApi )

boost и pthread тоже обвертки, но для синхронизации с "окнами" как я понимаю там ничего не предусмотрено ( ибо никак оно не связано с окнами ) по этому пришлось бы опять же прибегнуть к WinApi.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
06.01.2013, 16:03     Как сделать "Старт", "Пауза", Стоп"? #49
Цитата Сообщение от Avazart Посмотреть сообщение
Как раз Builder куда лучше Dev ...
сказать всё, что угодно можно.
Dev-Cpp прост, простота заключается в его минимализме. По умолчанию использует компилятор gcc, компилятор легко (ЛЕГКО изменить); русскоязычный опять же. Есть исходники.
Как видишь, мне понадобилось подключить библиотеку pthread- я подключил, всё просто. Хочешь другую библиотеку подключи.

Цитата Сообщение от Avazart Посмотреть сообщение
А главное если использовать потоки то не нужно извращаться с WinApi для синхронизации.
Давай всё-таки слова не будем говорить разные, а? Я имею ввиду "извращаться"
Вообще я тебя так понял:
Использование WinApi для синхронизации потоков- извращение по определению
Использование <чего-то другого, несомненно крутого, билдера там что ли> для синхронизации потоков- это круто потому что это круто
Думай что говоришь.

+++++++++++++++++++++++++++++++++++++++

Я не использую WinApi для создания потоков по причине которая реально ЕСТЬ. А не потому что это "извращение"

Добавлено через 4 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
pthread тоже обвертки, но для синхронизации с "окнами" как я понимаю там ничего не предусмотрено
как прикажешь тебя понимать- ничего не предусмотрено? Вообще предусмотрена синхронизация потоков и ещё какая синхронизация. С помощью мьютексов, семафоров, условных переменных. Второй раз за эту тему говорю- хоть глазами-то пробегись по мануалу какому-нибудь прежде чем что-то утверждать
Я так-то стараюсь инструменты нормальные подобрать для работы, если чё.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
06.01.2013, 16:32     Как сделать "Старт", "Пауза", Стоп"? #50
Цитата Сообщение от kravam Посмотреть сообщение
Dev-Cpp прост, простота заключается в его минимализме.
Dev-C++ — свободная интегрированная среда разработки приложений для языков программирования C/C++. В дистрибутив входит компилятор MinGW. Сам Dev-C++ написан на Delphi. Распространяется согласно GPL.
Проект поддерживается SourceForge. Основатель проекта Колин Лаплас, компания Bloodshed Software.
Одно время был доступен Linux-порт, однако на настоящее время актуализирована только Windows-версия.
На настоящий момент не разрабатывается, вместо него активно разрабатывается порт интерфейса Dev-C++ на wxWidgets — wxDev-C++.
http://ru.wikipedia.org/wiki/Dev-C%2B%2B


Цитата Сообщение от kravam Посмотреть сообщение
Использование WinApi для синхронизации потоков- извращение по определению
Конечно, как и писать в С++ в Си стиле... ибо в WinApi нет классов... код попросту не удобен...

Цитата Сообщение от kravam Посмотреть сообщение
как прикажешь тебя понимать- ничего не предусмотрено? Вообще предусмотрена синхронизация потоков и ещё какая синхронизация. С помощью мьютексов, семафоров, условных переменных. Второй раз за эту тему говорю- хоть глазами-то пробегись по мануалу какому-нибудь прежде чем что-то утверждать
Я так-то стараюсь инструменты нормальные подобрать для работы, если чё.
А ты читай сам внимательнее что я писал... Не boost не pthread не привязаны к среде и ёё "окнам".
Поэтому с тут будет многоБукоВ с мьютексов, семафорами...
условных переменных.
А это вообще что такое ?
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
06.01.2013, 17:52     Как сделать "Старт", "Пауза", Стоп"? #51
Пример с таймером привел, теперь приведу простой пример с двумя потоками TThread
Вложения
Тип файла: rar TThread Рисование на канве.rar (178.5 Кб, 26 просмотров)
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
06.01.2013, 18:30     Как сделать "Старт", "Пауза", Стоп"? #52
Цитата Сообщение от Avazart Посмотреть сообщение
На настоящий момент не разрабатывается
Это я и сам знаю, ты бы уж меня спросил за Dev-Cpp, я бы тебе весь расклад сделал
Во-первых, то, что оно не разрабатывается, это не плохо и не хорошо, это никак. Чему там разрабатываться? Есть готовый продукт, авторы не намерены вносить изменений, это их дела. Хотят вешают на него примочки, не хотят не вешают. Ещё раз, минимализм- вот свойство Dev-Cpp, кому нравится- пожалуйста. По скачке МОЖНО скачать Dev-Cpp, без компилятора и впихнуть туда свой компилятор, какой захочешь, что я и сделал.
По умолчанию с DEv-Cpp идёт версия gcc 3.4.2, это нехорошо, конечно, но более или менее опытный чел обратит на это внимание СРАЗУ. А новичку для "Hello, word" и так сойдёт
Не без косяков, конечно, но где их нет? А сырцы Dev-Cpp открыты, (в отличие от других хороших IDE) вот я их правил
Предлагаю людям как усовершенствовать IDE Dev-Cpp 4.9.9.2

Цитата Сообщение от Avazart Посмотреть сообщение
wxDev-C++
не советую никому использовать, ибо главное, что там есть- это формошлёпство далеко не на уровне. Как видишь, всё честно.

Цитата Сообщение от Avazart Посмотреть сообщение
Конечно, как и писать в С++ в Си стиле... ибо в WinApi нет классов... код попросту не удобен...
это уже более конкретно. Одна из причин, по которой я и использую pthread; Кстати в C++ классы есть если чё. Он и назывался так изначально "C с классами".

Цитата Сообщение от Avazart Посмотреть сообщение
А ты читай сам внимательнее что я писал... Не boost не pthread не привязаны к среде и ёё "окнам".
Поэтому с тут будет многоБукоВ с мьютексов, семафорами...
не больше чем надо, уверяю тебя. Ты попробуй сперва потом говори. Необязательно читать всё. Синхронизация с помощью мьютексов, к примеру. Возьми, прочти, выноси суждение по СИНТАКСИСУ, насколько он неудобен, ибо щас речь о нём, как я понял. А то невежеством попахивает.

Цитата Сообщение от Avazart Посмотреть сообщение
А это вообще что такое ?
один из способов синхронизации. Читаем, изучаем.
Вообще я, например, щас изучаю C# но я стараюсь невежества своего не показывать. Если, к примеру там есть какая-нибудь, сущность то я не бегу на форум и не возмущаюсь- как же так, в С++ этого нет и ничего, обходимся. За неудобство в чём-то платим удобством. Одно из достоинств (внимание- термины!) ИЗУЧЕНИЯ pthread (не самой библиотеки, а её изучения)- если вдруг придётся работать с линуксом, с ноля изучать многопоточность не надо будет. Вот двух зайцев я и убил.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
06.01.2013, 19:53     Как сделать "Старт", "Пауза", Стоп"? #53
Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
ИЗУЧЕНИЯ pthread (не самой библиотеки, а её изучения)- если вдруг придётся работать с линуксом, с ноля изучать многопоточность не надо будет. Вот двух зайцев я и убил.
А если не придется, то зря потраченное время и изврат...

Другое дело boost...
Добавлено через 9 минут
Цитата Сообщение от kravam Посмотреть сообщение
один из способов синхронизации. Читаем, изучаем.
Речь о Condition Variable ?

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Он и назывался так изначально "C с классами".
Это когда то давно...

Цитата Сообщение от kravam Посмотреть сообщение
По умолчанию с DEv-Cpp идёт версия gcc 3.4.2, это нехорошо, конечно, но более или менее опытный чел обратит на это внимание СРАЗУ. А новичку для "Hello, word" и так сойдёт
Новичек может использовать CodeBlocks или другую легкую IDE.

Цитата Сообщение от kravam Посмотреть сообщение
Не без косяков, конечно, но где их нет? А сырцы Dev-Cpp открыты, (в отличие от других хороших IDE) вот я их правил
Можно конечно тратить время на правку сорcов IDE, и на
Цитата Сообщение от kravam Посмотреть сообщение
Синхронизация с помощью мьютексов
с WinApi окнами...

Но зачем ?

Учитывая, то что ТС изначально сказал что у него стоит Builder, совет использовать DEv как то ...

Но что тут говорить ? Просто сравните количество написаного когда ...
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
06.01.2013, 20:03  [ТС]     Как сделать "Старт", "Пауза", Стоп"? #54
Цитата Сообщение от Avazart Посмотреть сообщение
Пример с таймером привел, теперь приведу простой пример с двумя потоками TThread
Пытался запустить у себя, пишет, что
E2209 Unable to open include file 'System.Classes.hpp'
также Vcl.Controls.hpp
Vcl.StdCtrls.hpp
Vcl.Forms.hpp

Что посоветуете?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
06.01.2013, 20:54     Как сделать "Старт", "Пауза", Стоп"? #55
Цитата Сообщение от Avazart Посмотреть сообщение
А если не придется, то зря потраченное время и изврат...
а я рискну. И да, мы же вроде договорились словами не бросаться?

Цитата Сообщение от Avazart Посмотреть сообщение
Речь о Condition Variable ?
там другой термин используется
Условная переменная имеет тип pthread_cond_t.

Цитата Сообщение от Avazart Посмотреть сообщение
Это когда то давно...
Название изменилась суть осталась. Третий раз ставлю на вид- к чему слова говорить? Давно- не давно... Чё за трольчатина? Отвечайте прямо- в C++ классов нету что ли, по вашему?

Цитата Сообщение от Avazart Посмотреть сообщение
Новичек может использовать CodeBlocks или другую легкую IDE.
Ну так-то у нас демократия, кто что хочет тот пусть то и использует. Но, наверное не совсем правильно говорить об CodeBloks в этом разговоре, не упомянув о её особенностях (плюсах/надостатках)? Или чисто эрудицией хотим блеснуть?

Цитата Сообщение от Avazart Посмотреть сообщение
Можно конечно тратить время на правку сорcов IDE, и на
"тратить время"- толсто, слишком толсто. Я могу с тем же успехом сказать, что не считаю это время потраченным. Могу сказать, что нет набажных IDE и в свете этого факта возможность править сырцы- благо, но вам же хочется просто поговорить, да?

"тратить время", "потраченное время", "изврат", "извращение"... Позорище.

Цитата Сообщение от Avazart Посмотреть сообщение
Но что тут говорить ? Просто сравните количество написаного когда ...
сравнил и что?
Вот моё:
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
#include <pthread.h> 
 
//++++++++++++++++++++++++++++++++++++++++++++
 
//функция потока
void *task2(void *X);
 
//ЭТО для объявления потоков всё
void* status; 
pthread_t ThreadA; // Объявляем потоки. 
bool flag= false;
 
//Это два вызова в коде
pthread_create(&ThreadA,NULL,task2,NULL); 
pthread_cancel(ThreadA); 
 
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//Функция- деструктор потока, выполняется при его анулировании
void routine  (void* x) {
 SetWindowText (hwndEdit,"всё, я спёкся");
 flag= false;
}
 
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                   //Функция потока
void *task2(void *X) { 
 
 int x;
 void* arg= &x;
 pthread_cleanup_push (&routine, arg); 
 int OldState,OldType; 
// // Разрешено аннулирование асинхронного типа. 
 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &OldState); 
 pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS,&OldType); 
 
 //Тут выполняемые действия; тоже к pthread не имеют отношения 
 
 pthread_cleanup_pop (false); 
 
 return NULL; 
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Всё, что касается потоков.
44 строчки

А у тебя как я понял два файла, TMyThread.cpp и TMyThread.h в одном 64 строчки, в другом 24, 20- строк убираем на комменты ну и что остаётся?

А весь остальной код он (создание окон, оконная процедура и прочее) имеет отношение к недостаткам или достоинствам pthread как свинья к апельсинам. Создание окон можно охренительно автоматизировать и то что я этого не делаю, так это ко мне вопросы, почему я этого не делаю.

Но при чём тут pthread или Dev-Cpp? Ни при чём.

Цитата Сообщение от Avazart Посмотреть сообщение
совет использовать DEv как то ...
не боги горшки обжигают. Поставит Dev-Cpp и будет работать и спасибо ещё мне потом скажет.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
06.01.2013, 22:07     Как сделать "Старт", "Пауза", Стоп"? #56
Цитата Сообщение от kravam Посмотреть сообщение
Всё, что касается потоков.
44 строчки
Ёу ... где в коде обещенная синхронизация с окном ?
Цитата Сообщение от kravam Посмотреть сообщение
А у тебя как я понял два файла, TMyThread.cpp и TMyThread.h в одном 64 строчки, в другом 24, 20- строк убираем на комменты ну и что остаётся?
Я говорил про написанный код руками ... ( класс наследник от TThread создается автоматически средой ) я лишь добавил пару поле и свой расширенный конструктор и собственно тело потока...
И при чем не было необходимости что-то вносить в код окна для синхронизации...

Добавлено через 57 секунд
Цитата Сообщение от kravam Посмотреть сообщение
не боги горшки обжигают. Поставит Dev-Cpp и будет работать и спасибо ещё мне потом скажет.
Лично я когда то ставил - почти сразу снес...

Цитата Сообщение от kravam Посмотреть сообщение
Только имей ввиду что ТАК оконные приложения не пишутся, это просто чтобы знать что и как работает. Так пист это вчерашний день. Оконные приложения пишутся с помощью конструктора форм, где все кнопки не прописываешь вручную, а кидаешь на форму мышкой. Если серьёзно настроен на это, то советую обратиться к языку C#; тут вот моя тема:
необходимо разобраться со всем этим благолепием, которое предоставляет студия MSVS
Я лично отошёл от (С++сногоконструктора форм) и обратился к C# и по моему не ошибся. В конце концов никто не запрещает интерфейс реализовывать на С# (я так понял, это его сильная сторона; все вот эти кнопки), а функционал на C+
С++ и CLR это изврат как по мне, жаль не обратил на это пост внимание ( может бы просто дальше не спорил бы)

C++
1
2
3
4
5
6
7
8
9
10
11
12
                //Функция потока
void *task2(void *X) { 
// ...
 pthread_cleanup_push (&routine, arg); 
 int OldState,OldType; 
// // Разрешено аннулирование асинхронного типа. 
// ...               
 while (true) {
   //...
  SetWindowText (hwndEdit, temp); /* !!! */
  Sleep (100);
 }
Все бы хорошо если бы нужно было SetWindowText(), а не GDI - ф-ции которые нуждаются в синхронизации как я писал выше...

И то что товарисЧ писал про то что поток плохо прибивать снаружи - думаю правда
( хотя не уверен в работе pthread, но думаю он вызывает TerminatedThread() что плохо )
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
06.01.2013, 22:57     Как сделать "Старт", "Пауза", Стоп"? #57
Цитата Сообщение от Avazart Посмотреть сообщение
Ёу ... где в коде обещенная синхронизация с окном ?
базара нет, если я где-то сказал, что будет синхронизация с потоком окна- покажи мне это. В любом случае я сказал это (если сказал)- зря. Потому, что синхронизации с использованием в ЧАСТНОСТИ средств синхронизации в этой задачи не надо. И её у меня нет. Всё просто, тыкается на кнопку- поток запускается. Тыкается на другую- останавливается. Оконный поток и вспомогательный не имеют разделяемых ресурсов. Были бы- была бы синхронизация несомненно.
Ну то есть грубо говоря- потоки работают синхронно без специальных средств синхронизации. Ибо отношение друг у другу имеют небольшое, прямо скажем- один запускается выключается из другого. Всё на этом.

Цитата Сообщение от Avazart Посмотреть сообщение
Я говорил про написанный код руками ... ( класс наследник от TThread создается автоматически средой ) я лишь добавил пару поле и свой расширенный конструктор и собственно тело потока...
И при чем не было необходимости что-то вносить в код окна для синхронизации...
ну то на то и вышло. У тебя нет синхронизации и у меня нет. Но у меня-то нет осмысленно, а у тебя потому, что билдер не написал синхронизацию.
Впрочем прикола ради- ты бы показал, что ли, что ты писал руками. Может заценю в натуре брошу всё и перейду на билдер.

Цитата Сообщение от Avazart Посмотреть сообщение
С++ и CLR это изврат как по мне, жаль не обратил на это пост внимание ( может бы просто дальше не спорил бы)
ну вот видишь

Цитата Сообщение от Avazart Посмотреть сообщение
Все бы хорошо если бы нужно было SetWindowText(), а не GDI - ф-ции которые нуждаются в синхронизации как я писал выше...
Вот когда будут GDI-функции, тогда и будем разоваривать. И синхронизация будет и всё на свете. Я решал задачу про обедающих философов и накропал её графическое решение, вот уж где есть разгуляться синхронизации.
А щас ты уж поверь на слово, что она в pthread есть.

Цитата Сообщение от Avazart Посмотреть сообщение
И то что товарисЧ писал про то что поток плохо прибивать снаружи - думаю правда
( хотя не уверен в работе pthread, но думаю он вызывает TerminatedThread() что плохо )
да он сказал не подумав, а ты повторяешь.

В pthread для корректного завершения потока предусмотрено:
асинхронное аннулирование- ну это немедленно (то есть не корректное, а так себе)
отсроченное- в потоке, который надо аннулировать, программистом определяются места в коде, где можно сделать аннулирование. Это ты уж сам определяй- ага, аннулировать можно только в этой точке.

Наконец, если аннулирование асинхронное, то предусмотрена функция типа деструктора класса, которая перед убиением потока совершает нужные действия. У меня в коде вот она:
C++
1
2
 pthread_cleanup_push (&routine, arg); 
 pthread_cleanup_pop (false);
Вызывается когда убиваем поток

Чё ещё придумать для безопасного убиения потока извне, я хз.
Наконец, внеси ясность в вопрос- чё, в билдере потоки что ли извне не убиваются?
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
07.01.2013, 00:14     Как сделать "Старт", "Пауза", Стоп"? #58
Цитата Сообщение от kravam Посмотреть сообщение
базара нет, если я где-то сказал, что будет синхронизация с потоком окна- покажи мне это.
Цитата Сообщение от kravam Посмотреть сообщение
Вот когда будут GDI-функции, тогда и будем разоваривать. И синхронизация будет и всё на свете.
Вообще то я говорил про именно синхронизацию и именно при перерисовке... да и TC просил именно рисование т.е. GDI ( собственно GDI было и в его примерах если вы не заметил )

Так что с базара не съежай...

Цитата Сообщение от kravam Посмотреть сообщение
ну то на то и вышло. У тебя нет синхронизации и у меня нет. Но у меня-то нет осмысленно, а у тебя потому, что билдер не написал синхронизацию.
У меня осмысленно есть синхронизация и есть собственно рисование ...
C++
1
2
3
Form1->Canvas->Lock();
// ... рисование
Form1->Canvas->Unlock();
Цитата Сообщение от kravam Посмотреть сообщение
да он сказал не подумав, а ты повторяешь.
В pthread для корректного завершения потока предусмотрено:
асинхронное аннулирование- ну это немедленно (то есть не корректное, а так себе)
Да собственно речь как раз и шла о не корректном завершении, и я писал же о
хотя не уверен в работе pthread, но думаю он вызывает TerminatedThread() что плохо
Добавлено через 18 минут
Цитата Сообщение от kravam Посмотреть сообщение
Впрочем прикола ради- ты бы показал, что ли, что ты писал руками. Может заценю в натуре брошу всё и перейду на билдер.
Ок ...

TMyThread.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
//---------------------------------------------------------------------------
#ifndef TMyThreadH
#define TMyThreadH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
//---------------------------------------------------------------------------
class TMyThread : public TThread
{
private:
    TRect Rect;  /* Добавил  Область в котрой бегает кривая*/
    TPoint P1;    /* Добавил   начальная точка*/
    TPoint P2;    /* Добавил  конечная точка */
    TColor Color; /* Добавил  цвет кривой*/
 
protected:
    void __fastcall Execute(); 
    void __fastcall Paint();  /* Добавил  только что бы показать  как пользоваться Synchronize() */
public:
    __fastcall TMyThread(bool CreateSuspended);
    __fastcall TMyThread(bool CreateSuspended,TPoint P,TRect Rect,TColor Color); /* Добавил  */
};
//---------------------------------------------------------------------------
#endif
Итого 4 строчки полей и 1 строчка конструктора

TMyThread.cpp
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "TMyThread.h"
#include "Unit1.h"
#include <time.h> /* Добавил для рандома */
 
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended)
    : TThread(CreateSuspended)
{
}
//--------------------------Далее мой  конструтор с инитом полей ------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended,TPoint P,TRect Rect,TColor Color)
    : TThread(CreateSuspended)
{       
    this->Rect= Rect;  
    this->P1= P;  // Начальная точка  
    this->Color= Color; 
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{  // вписал тело потока
    while(!Terminated) // если поток не останавливаем
     {      // не хитрый рандом
         srand(P1.x+P1.y+time(0)); 
         P2.x= rand()%Rect.Width()+Rect.Left;
         P2.y= rand()%Rect.Height()+Rect.Top;
         Sleep(100); // ЖдемС имитируя грамосткие вычисления ...
                  /* Далее рисование с синхронизацией */
         // Synchronize(&Paint);  что бы показать  Synchronize()
         Form1->Canvas->Lock(); // блокирование канвы
         try    
            {     // рисование
                Form1->Canvas->MoveTo(P1.x,P1.y); // рисуем от  СюДва
                Form1->Canvas->Pen->Width= 5; // толщина линии
                Form1->Canvas->Pen->Color= Color; // Цвет линии
                Form1->Canvas->LineTo(P2.x,P2.y); // до СеЛи
            }
         __finally //  полюбЭ разблокируем  
            {
                 Form1->Canvas->Unlock();
            }
 
         P1= P2; // конец последней точки становится началом
     }
}
//--------------------Это можно не писать если не юзать Synchronize() -----------------
void __fastcall TMyThread::Paint()
{
    // Альтернатива   Canvas->Lock() / Canvas->Unlock();
    Form1->Canvas->MoveTo(P1.x,P1.y);
    Form1->Canvas->Pen->Width= 5;
    Form1->Canvas->Pen->Color= Color;
    Form1->Canvas->LineTo(P2.x,P2.y);
}
//---------------------------------------------------------------------------
Тут конечно строк по более но и задумка куда по более вашей ...
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
07.01.2013, 00:40     Как сделать "Старт", "Пауза", Стоп"? #59
Цитата Сообщение от Avazart Посмотреть сообщение
Вообще то я говорил про именно синхронизацию и именно при перерисовке... да и TC просил именно рисование т.е. GDI ( собственно GDI было и в его примерах если вы не заметил )
Так что с базара не съежай...

Ни чего подобного. ТС просил не именно рисование, а цикличное действие, что я и сделал- печать. А рисование было "например", если ты не заметил; ТС-овский код не смотрел ни разу, работал по запросу.
Цитата Сообщение от Shpion007 Посмотреть сообщение
Доброго времени суток,
как сделать так, чтобы при нажатии на кнопку начиналось цикличное действие (рисование например) и продолжалось бы пока не будет нажата другая кнопка. Грубо говоря, как сделать "Старт", "Пауза", Стоп".
А у меня "например" печать. А проще потому что, чем рисование. Пример он всегда прост. Всё, пусть теперь лепит вместо печати рисование и синхронизирует при необходимости.
А вообще необходимость синхронизации определяется не используемыми функциями, (в частности GDI), а тем, есть или нет у потоков разделяемые ресурсы. Ситуация: один поток рисует в одном окне, а другой владеет другим окном. И всё. Хоть 100 GDI-функций используй. Вся синхронизация будет заключаться в пуске и остановке одного потока из другого.

Если уж предъявы кидать мне- у меня и паузы не предусмотрено. Сам пусть лепит, базу дал. Такой вот я.

А на слабО меня брать не надо- смогу я синхронизировать или нет потоки если буду использовать GDI. Смогу, хочешь верь, хочешь нет. Просто я с GDI не дружу, если на то пошло. Графику лепил используя OpenGL. Давай я тебе скину проект, как мне кидал ValeryS, ты же не будешь в нём разбираться?

Цитата Сообщение от Avazart Посмотреть сообщение
У меня осмысленно есть синхронизация и есть собственно рисование ...
ну есть и есть, молодец, чё могу сказать.

Давай по размеру кода

Цитата Сообщение от Avazart Посмотреть сообщение
Итого 4 строчки полей и 1 строчка конструктора
чё-т у меня глаз наверное замылился, я только в
TMyThread.h

23 строчки насчитал и ниже портянка не слабая.
В общем, заканчиваем холиварить. В веру свою нам друг друга не обратить, я чувствую.

Добавлено через 6 минут
Цитата Сообщение от Avazart Посмотреть сообщение
ут конечно строк по более но и задумка куда по более вашей ...
Ну хорошо. Пусть у тебя будет два потока в приложении- основной и вспомогательный. Подгони под меня (у меня же проще)- убери из вспомогательного потока рисование и оставь отладочную печать на консоль. Ну то есть: поток запустился, написал "Hello, word" и отработал. Пободаемся.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2013, 01:14     Как сделать "Старт", "Пауза", Стоп"?
Еще ссылки по теме:

Как создать старт приложения на определенной кнопки клавиатуры C++
C++ Threads или как запрограммировать кнопку Старт и Стоп C++
C++ Стоп после нажатия на Enter

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
07.01.2013, 01:14     Как сделать "Старт", "Пауза", Стоп"? #60
Цитата Сообщение от kravam Посмотреть сообщение
чё-т у меня глаз наверное замылился, я только в
TMyThread.h
23 строчки насчитал и ниже портянка не слабая.
В общем, заканчиваем холиварить. В веру свою нам друг друга не обратить, я чувствую.
Ручками 4-ре ...
Собственно это шаблон класса ...
Цитата Сообщение от kravam Посмотреть сообщение
Просто я с GDI не дружу,
Все понятно ...

Цитата Сообщение от kravam Посмотреть сообщение
А вообще необходимость синхронизации определяется не используемыми функциями, (в частности GDI), а тем, есть или нет у потоков разделяемые ресурсы. Ситуация: один поток рисует в одном окне, а другой владеет другим окном. И всё. Хоть 100 GDI-функций используй. Вся синхронизация будет заключаться в пуске и остановке одного потока из другого.
А GDI -ф-ции обращаются не к разделяемому ресурсу - окну программы, сообщения от которого обрабатываются в оконной процедуре в основном потоке ?

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Ну хорошо. Пусть у тебя будет два потока в приложении- основной и вспомогательный. Подгони под меня (у меня же проще)- убери из вспомогательного потока рисование и оставь отладочную печать на консоль. Ну то есть: поток запустился, написал "Hello, word" и отработал. Пободаемся.
Какую консоль ты о чем ? приложение оконное изначально было ( напоминаю если ты об этом уже забыл )
Цитата Сообщение от Shpion007 Посмотреть сообщение
как сделать так, чтобы при нажатии на кнопку начиналось цикличное действие (рисование например) и продолжалось бы пока не будет нажата другая кнопка. Грубо говоря, как сделать "Старт", "Пауза", Стоп".
Добавлено через 11 минут
Цитата Сообщение от kravam Посмотреть сообщение
Ну то есть: поток запустился, написал "Hello, word" и отработал. Пободаемся.
Это даже не интересно ... тут и без TThread обойтись можно ... ( CreateThread() + крит секция )
Yandex
Объявления
07.01.2013, 01:14     Как сделать "Старт", "Пауза", Стоп"?
Ответ Создать тему
Опции темы

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