Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/78: Рейтинг темы: голосов - 78, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток,
как сделать так, чтобы при нажатии на кнопку начиналось цикличное действие (рисование например) и продолжалось бы пока не будет нажата другая кнопка. Грубо говоря, как сделать "Старт", "Пауза", Стоп".
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2012, 11:11
Ответы с готовыми решениями:

C++ Threads или как запрограммировать кнопку Старт и Стоп
Погуглил нечего не нашёл на эту тему..

нужно сделать кнопки старт и пауза для движущихся фигур
пауза нормально работает. но после паузы нажимаешь на старт фигуры не продолжают движение по...

В билдеровском MediaPlayer-е кнопка стоп работает как пауза?
Ребята, кто-нибудь сталкивался с такой проблемой, в билдеровском медиаплеере кнопка стоп, работает...

Одна форма, кнопки старт и стоп. Как остановить?
Одна форма с двумя кнопками. Старт - начало некоторого длинного по времени алгоритма, который можно...

Через интерфейсе (GUI) сделать кнопку стоп, старт, пауза
Здравствуйте ,есть проблема ,преподаватель дал задание ,что бы через интерфейсе (GUI) сделать...

71
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
26.12.2012, 11:15 2
объявите глобальную переменную
C++
1
bool end=false;
в обработчик кнопки старт:
C++
1
2
3
end=false;
while(!end)
{...}
кнопка стоп:
C++
1
end=true;
пауза так же как и стоп, только, в кнопке стоп вам надо сделать что-то еще, смотря что вам надо(ну например вы записываете в файл), а в паузе этого не надо делать (надо цель знать)
0
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
26.12.2012, 11:33  [ТС] 3
Цитата Сообщение от Tiva Посмотреть сообщение
объявите глобальную переменную
C++
1
bool end=false;
в обработчик кнопки старт:
C++
1
2
3
end=false;
while(!end)
{...}
кнопка стоп:
C++
1
end=true;
пауза так же как и стоп, только, в кнопке стоп вам надо сделать что-то еще, смотря что вам надо(ну например вы записываете в файл), а в паузе этого не надо делать (надо цель знать)
Сделал, не получается, ведь, действительно, программа постоянно выполняет тело цикла, и как бы "зависает", т.е. выполняет тело, но нажать на другие кнопки не получается.
0
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
26.12.2012, 13:04 4
Цитата Сообщение от Shpion007 Посмотреть сообщение
Сделал, не получается, ведь, действительно, программа постоянно выполняет тело цикла, и как бы "зависает", т.е. выполняет тело, но нажать на другие кнопки не получается.
Вам необходимо запускать своё "действие" в потоке. И кнопками старт\стоп запускать или прерывать выполнение потока.

boost::thread
CreateThread
выбирайте что-то из этого
первое довольно простое(по крайней мере в изложении и представлении программисту, ну это с моей точки зрения)
второе стандартное и неудобное, зато не надо париться с установкой буста

без многопоточности пожалуй не обойтись
0
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
27.12.2012, 22:13  [ТС] 5
Цитата Сообщение от Tiva Посмотреть сообщение
Вам необходимо запускать своё "действие" в потоке. И кнопками старт\стоп запускать или прерывать выполнение потока.
boost::thread
CreateThread
выбирайте что-то из этого
первое довольно простое(по крайней мере в изложении и представлении программисту, ну это с моей точки зрения)
второе стандартное и неудобное, зато не надо париться с установкой буста
без многопоточности пожалуй не обойтись
А как это реализовать?

Добавлено через 23 часа 21 минуту
Хоть намекните как сделать.

Добавлено через 1 час 26 минут
Неужели никто не может помочь?
0
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
27.12.2012, 22:30 6
Цитата Сообщение от Shpion007 Посмотреть сообщение
А как это реализовать?

Добавлено через 23 часа 21 минуту
Хоть намекните как сделать.

Добавлено через 1 час 26 минут
Неужели никто не может помочь?
http://bit.ly/Ubclw4
даже не благодари

открываешь например википедию, смотришь пример кода для многопоточности. только из этого примера все становится довольно понятно(ну я понял)
потом ищешь документацию на русском(или читаешь на английском на сайте буста) на буст. ищешь главу thread. и читаешь, и подстраиваешь под свой код.

как скачать boost есть в инете. если скачать, скомпилировать и правильно установить буст у тебя не получается, как вариант, скачай embarcadero rad studio xe, это с++ билдер, у него буст встроен по умолчанию.
0
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
27.12.2012, 23:29  [ТС] 7
Цитата Сообщение от Tiva Посмотреть сообщение
http://bit.ly/Ubclw4
даже не благодари

открываешь например википедию, смотришь пример кода для многопоточности. только из этого примера все становится довольно понятно(ну я понял)
потом ищешь документацию на русском(или читаешь на английском на сайте буста) на буст. ищешь главу thread. и читаешь, и подстраиваешь под свой код.

как скачать boost есть в инете. если скачать, скомпилировать и правильно установить буст у тебя не получается, как вариант, скачай embarcadero rad studio xe, это с++ билдер, у него буст встроен по умолчанию.
Все равно поблагодарю,
теме не менее не выходит, у меня установлена Embarcadero RAD Studio, я посмотрел примеры, но ничего не выходит, вот например, простейший код который нашёл, так у меня на треть секунды появляется окно и пропадает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <boost/thread.hpp> 
#include <iostream> 
 
void wait(int seconds) 
{ 
  boost::this_thread::sleep(boost::posix_time::seconds(seconds)); 
} 
 
void thread() 
{ 
  for (int i = 0; i < 5; ++i) 
  { 
    wait(1); 
    std::cout << i << std::endl; 
  } 
} 
 
int main() 
{ 
  boost::thread t(thread); 
  t.join(); 
}
или вот:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <boost/thread/thread.hpp>
#include <iostream>
 
using namespace std; 
 
void hello_world() 
{
  cout << "Здравствуй мир, я - thread!" << endl;
}
 
int main(int argc, char* argv[]) 
{
  // запустить новый поток, вызывающий функцию "hello_world"
  boost::thread my_thread(&hello_world);
  // ждем завершения потока
  my_thread.join();
 
  return 0;
}
0
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
27.12.2012, 23:34 8
я когда-то сильно читал документацию на буст-тред, но уже все забыл.
там много нюансов, всякие мютексы, прерывания и прочее прочее.
честно, я дальше не знаю как быть, но то что вам надо - это многопоточность 100%.

на ноуте были в закладках ссылки на русскую документацию бусттред, скинуть могу только завтра. там все довольно подробно написано. поищите сами, я в свое время тоже же нашел )
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
27.12.2012, 23:59 9
Можно использовать библиотеку pthread, если у тебя компилятор gcc, то скорее всего она туда уже встроена, инфа есть на русском в сети, а код твой последний потому не работает, что надо посмотреть прикреплённую тему к форуму.
А вообще задачу нахрапом не решить. И сдаётся мне, не решить ещё очень долго.
0
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
28.12.2012, 00:21  [ТС] 10
Цитата Сообщение от kravam Посмотреть сообщение
Можно использовать библиотеку pthread, если у тебя компилятор gcc, то скорее всего она туда уже встроена, инфа есть на русском в сети, а код твой последний потому не работает, что надо посмотреть прикреплённую тему к форуму.
А вообще задачу нахрапом не решить. И сдаётся мне, не решить ещё очень долго.
Компилятор у меня Embarcadero RAD Studio 2010, также есть Borland C++Builder 6, желательно, с ними реализовать. А что за тему посмотреть надо, и действительно ли эта задача так сложна?
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
28.12.2012, 01:37 11
С формошлёпством я мало знаком, не знаю, как там это всё реализовано, врать не буду. Это тебе надо не здесь, а в другом форуме спросить там, где изучают эту среду. Если скажут, что нужно многопоточное прграммирование, значит так тому и быть.

И хотя там и надо-то два потока всего создать там кода с гулькин нос, но всё равно это надо знать.

Завтра попробую показать как это будет на WinApi

Вкратце если- всейми эими кнопками управляет ОДИН поток. Если какая-то кнопка займёт его навсегда (бесконечный цикл), ты на остальные хоть занажимайся, толку не будет.
Поэтому и нужны два потока как минимум, там тебе объяснили уже.

Да с IDE тебе не повезло. Bilder это вообще по-моему не знаю что а первая тоже какой-о эксклюзив.
1
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
28.12.2012, 02:41  [ТС] 12
Цитата Сообщение от kravam Посмотреть сообщение
С формошлёпством я мало знаком, не знаю, как там это всё реализовано, врать не буду. Это тебе надо не здесь, а в другом форуме спросить там, где изучают эту среду. Если скажут, что нужно многопоточное прграммирование, значит так тому и быть.

И хотя там и надо-то два потока всего создать там кода с гулькин нос, но всё равно это надо знать.

Завтра попробую показать как это будет на WinApi

Вкратце если- всейми эими кнопками управляет ОДИН поток. Если какая-то кнопка займёт его навсегда (бесконечный цикл), ты на остальные хоть занажимайся, толку не будет.
Поэтому и нужны два потока как минимум, там тебе объяснили уже.

Да с IDE тебе не повезло. Bilder это вообще по-моему не знаю что а первая тоже какой-о эксклюзив.
А какую среду посоветуете?
Буду ждать примера.

Добавлено через 8 минут
Цитата Сообщение от kravam Посмотреть сообщение
если у тебя компилятор gcc, то скорее всего она туда уже встроена
Скачал, установил Dev C++ 4.9.9.2 пишет, что мол нет буста "2 C:\Dev-Cpp\main.cpp boost/thread/thread.hpp: No such file or directory."
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
28.12.2012, 05:36 13
компилить с опциями:
-lpthread -mwindows

короче создаётся окошко с двумя кнопками. Жмёшь на одну кнопку и начинается твой вечный цикл, в окошко пишется всякая херь. Как выйти из этого цикла? Уже было отвечено. Надо создать его в отдельном потоке и когда надо, поток убивать. Что у меня и делается. Цикл создаётся в отдельном потоке.

Так, ну а когда жмёшь на вторую кнопку, созданный поток с циклом убивается, иначе никак.
Ищи компилятор gcc, библиотеку pthread и вперёд. Если серьёзно настроен подскажу ресурсы.

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
#include <windows.h>
#include <pthread.h> 
#include <stdio.h> 
 
#define ButtonID 1
#define ButtonID_ 2
 
#define EditID 2
 
//оконная процедура
LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//функция потока
void *task2(void *X);
 
//ЭТО для объявления отоков всё
void* status; 
pthread_t ThreadA; // Объявляем потоки. 
bool flag= false;
 
 
char ClassName       []= "SimpleWinClass";
char AppName         []= "Our First Window";
char ButtonClassName []= "button";
char ButtonText      []= "My  Button";
char EditClassName   []= "edit";
 
HINSTANCE hInstance;
LPSTR CommandLine;
HWND hwndButton;
HWND hwndEdit;
char buffer [512];
                                      //+
                                      //+
                                      //+
                                      //+
                                      //+
                                      //+
//Главная функция, создаёт окно
int WINAPI WinMain (HINSTANCE hInst,
                    HINSTANCE hPrevInst,
                    LPSTR CmdLine,
                    int CmdShow)
 
{
 hInstance= hInst;
 CommandLine= CmdLine;
 //структуры
 WNDCLASSEX wc;
 MSG msg;
 HWND hwnd;
 
 //инициализация;
 wc.cbSize= sizeof (WNDCLASSEX);
 wc.style= CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc= WndProc;
 wc.cbClsExtra= 0;
 wc.cbWndExtra= 0;
 wc.hInstance= hInst;
 wc.hbrBackground= (HBRUSH)(COLOR_BTNFACE+1);
 wc.lpszMenuName= NULL;
 wc.lpszClassName= ClassName;
 wc.hIcon= LoadIcon (NULL,IDI_APPLICATION);
 wc.hIconSm= wc.hIcon;
 wc.hCursor= LoadCursor (NULL,IDC_ARROW);
 
 
 RegisterClassEx (&wc);
 
 hwnd= CreateWindowEx (WS_EX_CLIENTEDGE, ClassName,AppName,\
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
           CW_USEDEFAULT,300,200,NULL,NULL,\
           hInst,NULL);
 
 ShowWindow (hwnd,SW_SHOWNORMAL);
 UpdateWindow (hwnd);
 
 
 
 while (true) {
   if (!GetMessage (&msg,NULL,0,0))
     break;
    TranslateMessage (&msg);
    DispatchMessage  (&msg);
 }
 return msg.wParam;
}
                                      //+
                                      //+
                                      //+
                                      //+
                                      //+
                                      //+
 
//+++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++
//Оконная процедура                              
LRESULT CALLBACK WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  
  if (uMsg==WM_DESTROY) 
      PostQuitMessage (0);
  else if (uMsg==WM_CREATE) {
      
      //СОздадим одно поле редактирования
      hwndEdit=   CreateWindowEx (WS_EX_CLIENTEDGE, EditClassName,NULL,\
      WS_CHILD + WS_VISIBLE + WS_BORDER + ES_LEFT +ES_AUTOHSCROLL,\
      50,35,200,25,hWnd,(HMENU)EditID,hInstance,NULL);
      
      SetFocus (hwndEdit);
      
      //И две кнопки
      hwndButton= CreateWindowEx (0, ButtonClassName,ButtonText,\
      WS_CHILD + WS_VISIBLE + BS_DEFPUSHBUTTON,\
      75,70,140,25,hWnd,(HMENU)ButtonID,hInstance,NULL);
 
 
      hwndButton= CreateWindowEx (0, ButtonClassName,ButtonText,\
      WS_CHILD + WS_VISIBLE + BS_DEFPUSHBUTTON,\
      75,100,140,25,hWnd,(HMENU)ButtonID_,hInstance,NULL);
 
 
  }
  else if (uMsg==WM_COMMAND) {
      WPARAM eax= wParam%0xffff;
      if (lParam) {
            if (eax==ButtonID) {
                eax= wParam/0Xffff;
                if (eax==BN_CLICKED) {
                   //Если нажимаем на вехнюю кнопку, то               
                   //создаём отдельный поток                          
                   //Создаём один раз, для этого используем флаг flag 
                   //когда поток аннулируется можно снова создат будет
                   if (!flag) {
                    pthread_create(&ThreadA,NULL,task2,NULL); 
                    flag= true;
                   }
                }
            }
            else if (eax==ButtonID_) {
                eax= wParam/0Xffff;
                if (eax==BN_CLICKED) {
                  //Убиваем на хрен поток, который пишет всякую херь
                  //но только если он создан                        
                  if (flag)
                  pthread_cancel(ThreadA); 
                }
            }
      }
             
  }
  else 
      return DefWindowProc (hWnd,uMsg,wParam,lParam );      
  return 0;
}
 
 
 
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//Функция- дестуктор потока, выполняется при его анулировании
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); 
 
 char temp []=  "пишем всякую херь";
 char temp_ []= "пишем всякую херь";
 
 int i= 0;
 
 //Вот твой вечный цикл                         
 //ОН работает пока другой поток (родительский) 
 //не убьёт этот поток (дочерний)               
 //иначе будет рабтать вечно                    
 while (true) {
  strcpy (temp, temp_);
  temp [i]= ' ';
  i++;
  i== strlen(temp)?i= 0: false;
  SetWindowText (hwndEdit, temp);
  Sleep (100);
 }
 
 
 pthread_cleanup_pop (false); 
 
 return NULL; 
}
Добавлено через 10 минут
Только имей ввиду что ТАК оконные приложения не пишутся, это просто чтобы знать что и как работает. Так пист это вчерашний день. Оконные приложения пишутся с помощью конструктора форм, где все кнопки не прописываешь вручную, а кидаешь на форму мышкой. Если серьёзно настроен на это, то советую обратиться к языку C#; тут вот моя тема:
необходимо разобраться со всем этим благолепием, которое предоставляет студия MSVS

Я лично отошёл от (С++сногоконструктора форм) и обратился к C# и по моему не ошибся. В конце концов никто не запрещает интерфейс реализовывать на С# (я так понял, это его сильная сторона; все вот эти кнопки), а функционал на C++

Добавлено через 51 секунду
Ну а для этого дела Dev-Cpp самое то
1
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
04.01.2013, 23:41  [ТС] 14
Цитата Сообщение от kravam Посмотреть сообщение
короче создаётся окошко с двумя кнопками.
Вот как решили эту задачу, пример простой программы:

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
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool stop;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
class TGraphicsThread: public TThread
{
private:
protected:
    void __fastcall Execute(void);
public:
    void __fastcall MyResume(void);
    __fastcall TGraphicsThread(bool Suspended);
    __fastcall ~TGraphicsThread();
};
__fastcall TGraphicsThread::TGraphicsThread(bool Suspended): TThread(Suspended)
{
    //<-- тут инициализируете ваши переменные
}
__fastcall TGraphicsThread::~TGraphicsThread()
{
    //<-- тут уничтожаете ваши переменные
}
void __fastcall TGraphicsThread::MyResume(void)
{
/*  int SuspendCount = ResumeThread(Handle);
  CheckThreadError(SuspendCount >= 0);
  if(SuspendCount = 1) Suspended = false;  */
}
 
void __fastcall TGraphicsThread::Execute(void)
{
    int i, H;
    stop=0;
    H = Form1->Height;
    HDC hDC = GetDC(Form1->Handle);
 
  for (i = 0; i > -1; i++) {
  if (stop==1) break;
  MoveToEx(hDC, i%500,i%500, NULL);
  LineTo(hDC, i%500, H/2);
  TextOut(hDC, i%500, i%500, "Number of raster fonts: ", 24);
}
  }
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TGraphicsThread *MyThread = new TGraphicsThread(true);
MyThread->Suspended = false;
MyThread->FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
stop = 1;
}
//---------------------------------------------------------------------------
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
04.01.2013, 23:45 15
Цитата Сообщение от Tiva Посмотреть сообщение
без многопоточности пожалуй не обойтись
элементарно в теле цикла проверяй кнопку
но ТС не сказал по до что пишет если Win32 то обрабатывать событие нажатие на нужные кнопки
при старте запускай таймер ( обработка в таймере)
при стопе останавливай таймер и обнуляй какую нибудь переменную
при паузу просто останавливай таймер
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
05.01.2013, 00:20 16
Цитата Сообщение от ValeryS Посмотреть сообщение
при старте запускай таймер ( обработка в таймере)
при стопе
Всё, ты при старте вошёл в вечный цикл, как ты из него выйдешь?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
05.01.2013, 00:29 17
Цитата Сообщение от kravam Посмотреть сообщение
Всё, ты при старте вошёл в вечный цикл, как ты из него выйдешь?
какой такой вечный цикл?
я сказал запустил таймер, в таймере проходят итерации по одной

например так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
OnTimer()
{
 // что то расчитываем
iter++;
Invalidate();// чтобы перерисовалось 
 
}
OnStart() // кнопка старт
{
 SetTimer(1,100,NULL);
 
}
OnStop() // кнопка стоп
{
 iter=0;
 KillTimer(1);
}
OnPause()//кнопка пауза
{
  KillTimer(1);
}
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
05.01.2013, 01:37 18
Ты запустил таймер, например на 100 миллисекунд, через 100 миллисекунд он либо послал окну сообщение WM_TIMER, либо вызвал функцию обратного вызова, но пока эти 100 миллисекунд ИДУТ, ты никаких действий по отрисовке (тот самый вечный цикл ну или любые другие действия) делать не можешь; а в это время у тебя работает обыкновенный цикл обработки сообщений.

Фактически создавая таймер ты создаёшь один дополнительный поток, который через определённое время (100) миллисекунд совершает определённые действия- какие я сказал выше.

Но в этом самом потоке ты ничё отрисовать не можешь и ничё полезного не сделаешь. Таймер он и есть таймер. Через определённые промежутки времени посылает сигнал создавшей его программе, только и всего.

Ну или давай уж код с таймером, заценим; для простоты пусть будут две кнопки. Пуск таймера и стоп таймеру. Посмотрим чё ты отрисуешь во время его работы.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
05.01.2013, 01:45 19
Цитата Сообщение от kravam Посмотреть сообщение
Ты запустил таймер, например на 100 миллисекунд, через 100 миллисекунд он либо послал окну сообщение WM_TIMER, либо вызвал функцию обратного вызова, но пока эти 100 миллисекунд ИДУТ, ты никаких действий по отрисовке (тот самый вечный цикл ну или любые другие действия) делать не можешь; а в это время у тебя работает обыкновенный цикл обработки сообщений.
ты догадываешься как таймер в Windows работает?
Цитата Сообщение от kravam Посмотреть сообщение
Ну или давай уж код с таймером, заценим.
на смотри
правда я там не рисовал а музыку играл

https://www.cyberforum.ru/post3838359.html
если нужно конкретно рисование то скажи чего рисовать сварганим если время будет
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
05.01.2013, 02:19 20
Цитата Сообщение от ValeryS Посмотреть сообщение
ты догадываешься как таймер в Windows работает?
А чё тут догадываться? Есть справочники, взял прочёл, понял. Тут ничего не указывается ни на какую функцию обратного вызова. Во время которой могло бы происходить рисование или, например печать
http://www.vsokovikov.narod.ru... ttimer.htm
Есть только указание на функцию обратного вызова, которая вызывается по окончании работы таймера. Это я прочёл по справке. Ты опять меня будешь спрашивать, догадываюсь ли я как работает таймер? Я прочёл и я не догадываюсь, я знаю.

Такие ответы канают за отмазку вообще-то. Давай простое консольное приложение, которое вместо рисования что-нибудь печатает в консоли.
0
05.01.2013, 02:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2013, 02:19
Помогаю со студенческими работами здесь

Нужно вместо кнопки старт/ стоп сделать смену цвета круга
Помогите, пожалуйста, исправить прогу, нужно вместо кнопки старт/ стоп сделать смену цвета круга....

Как добавить кнопку Старт/Стоп
скажем ввели 1 минут и нажали старт ) отсчет пошел и потом нажали Стоп и таймер остановил на 35...

TextureView video-старт/пауза как?
Добрый день! помогите разобраться: public class MainActivity extends AppCompatActivity...

Функция старт/стоп
Как сделать кнопки старт/стоп на этот код? Помогите пожалуйста, сам попробовал - не получилось var...

Процесс старт\стоп
Всем Доброго времени суток. Делаю небольшой таймер для приложений. То есть приложение, которое...

Таймаут, старт, стоп
Здравствуйте. Есть 2 вопроса: 1).В программе необходимо сделать задержку 4 секунды, причём так,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru