С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.97
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
#1

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

26.12.2012, 11:11. Просмотров 5885. Ответов 71
Метки нет (Все метки)

Доброго времени суток,
как сделать так, чтобы при нажатии на кнопку начиналось цикличное действие (рисование например) и продолжалось бы пока не будет нажата другая кнопка. Грубо говоря, как сделать "Старт", "Пауза", Стоп".
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2012, 11:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать "Старт", "Пауза", Стоп"? (C++):

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

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

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата" - C++
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в программе ввести в массив данные и...

71
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,152
Записей в блоге: 17
05.01.2013, 18:04 #31
Цитата Сообщение от Shpion007 Посмотреть сообщение
хоть и рисуем на форме то нет никаких глюков.
Странно так как "окно" как было разделяемым ресурсом так им и осталось...
0
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
05.01.2013, 18:11  [ТС] #32
Цитата Сообщение от Avazart Посмотреть сообщение
Странно так как "окно" как было разделяемым ресурсом так им и осталось...
А чего тут спорить, проверь простейший пример, хоть мною пред ставленый, он не совсем изящный, т.к составлялся исключительно для проверки.
0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,152
Записей в блоге: 17
05.01.2013, 18:21 #33
Такие вещи нельзя проверить так как не знаешь когда произойдет сбой...
То что якобы работает не отменяет необходимости синхронизации между потоками...

Добавлено через 5 минут
Но возможно, я ошибаюсь насчет рисования в WinApi ....

В любом случае тут в потоке нет необходимости...
0
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
05.01.2013, 18:27  [ТС] #34
Цитата Сообщение от Avazart Посмотреть сообщение
В любом случае тут в потоке нет необходимости...
Возможно, но как решить эту задачу я не знал, и это (показанное мною) решение первое работающее что мне предложили и что удалось реализовать, возможно, оно не самое лучшее, но оно рабочее, предложите другой вариант, возможно он лучше.
0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,152
Записей в блоге: 17
05.01.2013, 18:42 #35
В таймере рисовать ...

(либо в потоке c синхронизацией через Syncronize() или c Canvas->Lock() если есть кроме рисования грамостские расчеты)

Да и только что заметил что у вас в коде утечка памяти...
0
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
05.01.2013, 18:54  [ТС] #36
Цитата Сообщение от Avazart Посмотреть сообщение
если есть кроме рисования грамостские расчеты)
Да и только что заметил что у вас в коде утечка памяти...
Расчёты очень громоздкие, миллионы вычислений с комплексными числами предшествуют одному шагу рисования.

А что за утечка?
0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,152
Записей в блоге: 17
05.01.2013, 19:10 #37
Цитата Сообщение от Shpion007 Посмотреть сообщение
Расчёты очень громоздкие, миллионы вычислений с комплексными числами предшествуют одному шагу рисования.
Время расчета которых больше времени операций прорисовки
Цитата Сообщение от Shpion007 Посмотреть сообщение
А что за утечка?
Контекст устройства не освобождается...

Насчет WinApi нашел такое :

Вопрос:
The question is: are WinAPI functions thread-safe or NO? I mean: can I call them from different threads without any
synchronization such as critical sections or others?

Functions such as TextOut, DrawText from gdi32.lib and user32.lib, OR others from others libraries.
Ответ:
GDI functions are not thread-safe, and moreover, many are thread-affine. Almost anything that takes an HWND and/or an HDC must be called on the same thread where that HWND or HDC was created (SendMessage, PostMessage and similar are notable exceptions). HBITMAPs, HICONs and such could be passed between threads, but should be manipulated by one thread at a time.

Most other functions - those that don't deal with GDI or window management - are indeed thread-safe.
http://social.msdn.microsoft.com/For...-5bbf8902033f/
0
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
05.01.2013, 20:10  [ТС] #38
Цитата Сообщение от Avazart Посмотреть сообщение
В таймере рисовать ...
А можно пример небольшой, схему принципиальную?
0
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,152
Записей в блоге: 17
05.01.2013, 20:54 #39
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
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
Timer1->Enabled= false;
Timer1->Interval= 200;
}
//---------------------------------------------------------------------------
int i=0;
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    HDC hDC = GetDC(Handle);
 
    MoveToEx(hDC, i%500,i%500, NULL);
    LineTo(hDC, i%500, Height/2);
    TextOutA(hDC, i%500, i%500, "Number of raster fonts: ", 24);
 
    ReleaseDC(Handle,hDC); /* !!! */
 
    i++;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled= !Timer1->Enabled;
}
//--------------------------------------------------------------------------
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
05.01.2013, 22:18 #40
Цитата Сообщение от Shpion007 Посмотреть сообщение
решение первое работающее
э, алё, а чё с моим решением?
Как сделать "Старт", "Пауза", Стоп"?
0
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
06.01.2013, 00:37  [ТС] #41
Цитата Сообщение от kravam Посмотреть сообщение
э, алё, а чё с моим решением?
Ещё раз спасибо за помощь, но ваш код реализовать у меня не получилось, много ошибок вылетало, пробовал в инете искать исправлять не получилось, да и хотел в форме делать, там проще.
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,245
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;
}

все работают примерно одинаково, у каждого свои недостатки
каждый решает сам для себя каким путем пойдет,в зависимости от задачи
сейчас какие будут вопросы?
1
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
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-то дашь? А то у меня нет...
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,245
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;
}


иконки тоже скинуть?
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
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 Посмотреть сообщение
с таймером ничего не виснет никаких циклов
мы же с тобой оба понимаем, что это неправда.

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

А в двупоточной программе этого никогда не будет. Привет.
0
06.01.2013, 03:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2013, 03:33
Привет! Вот еще темы с ответами:

Структура «Преподаватель» с полями "ФИО", "стаж", "категория", "нагрузка" - C++
Функция - расчёт зарплаты по нагрузке и оплате часа для определенной категории. Категория Оплата часа Вторая 150 Первая 200 ...

по строкам.замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно - C++
замените в слове сочетание &quot;му&quot; на &quot;а&quot; , а букву &quot;ы&quot; на &quot;ца&quot;. очень нужно Добавлено через 21 час 4 минуты неужели никто не знает...

Реализовать структуру "Анкета" с полями "Фамилия", "Пол" и "Адрес" - C++
Здравствуйте. Проходим тему Структуры, не могу понять, как определить количество, само задание: #include &lt;iostream&gt; #include...

Создать иерархию классов "Фирма", "Бухгалтер", "Сотрудник", "Зарплата" - C++
Само по себе понятие &quot;зарплата&quot; не особенно конкретное: оно включает и почасовую, и ставочную зарплату, и комиссионные, и процент с продаж....


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

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