Форум программистов, компьютерный форум 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 параметрами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
26.12.2012, 11:15     Как сделать "Старт", "Пауза", Стоп"? #2
объявите глобальную переменную
C++
1
bool end=false;
в обработчик кнопки старт:
C++
1
2
3
end=false;
while(!end)
{...}
кнопка стоп:
C++
1
end=true;
пауза так же как и стоп, только, в кнопке стоп вам надо сделать что-то еще, смотря что вам надо(ну например вы записываете в файл), а в паузе этого не надо делать (надо цель знать)
Shpion007
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;
пауза так же как и стоп, только, в кнопке стоп вам надо сделать что-то еще, смотря что вам надо(ну например вы записываете в файл), а в паузе этого не надо делать (надо цель знать)
Сделал, не получается, ведь, действительно, программа постоянно выполняет тело цикла, и как бы "зависает", т.е. выполняет тело, но нажать на другие кнопки не получается.
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
26.12.2012, 13:04     Как сделать "Старт", "Пауза", Стоп"? #4
Цитата Сообщение от Shpion007 Посмотреть сообщение
Сделал, не получается, ведь, действительно, программа постоянно выполняет тело цикла, и как бы "зависает", т.е. выполняет тело, но нажать на другие кнопки не получается.
Вам необходимо запускать своё "действие" в потоке. И кнопками старт\стоп запускать или прерывать выполнение потока.

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

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

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

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

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

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

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

как скачать boost есть в инете. если скачать, скомпилировать и правильно установить буст у тебя не получается, как вариант, скачай embarcadero rad studio xe, это с++ билдер, у него буст встроен по умолчанию.
Shpion007
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;
}
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
27.12.2012, 23:34     Как сделать "Старт", "Пауза", Стоп"? #8
я когда-то сильно читал документацию на буст-тред, но уже все забыл.
там много нюансов, всякие мютексы, прерывания и прочее прочее.
честно, я дальше не знаю как быть, но то что вам надо - это многопоточность 100%.

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

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

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

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

Да с IDE тебе не повезло. Bilder это вообще по-моему не знаю что а первая тоже какой-о эксклюзив.
Shpion007
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."
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
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 самое то
Shpion007
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;
}
//---------------------------------------------------------------------------
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
04.01.2013, 23:45     Как сделать "Старт", "Пауза", Стоп"? #15
Цитата Сообщение от Tiva Посмотреть сообщение
без многопоточности пожалуй не обойтись
элементарно в теле цикла проверяй кнопку
но ТС не сказал по до что пишет если Win32 то обрабатывать событие нажатие на нужные кнопки
при старте запускай таймер ( обработка в таймере)
при стопе останавливай таймер и обнуляй какую нибудь переменную
при паузу просто останавливай таймер
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
05.01.2013, 00:20     Как сделать "Старт", "Пауза", Стоп"? #16
Цитата Сообщение от ValeryS Посмотреть сообщение
при старте запускай таймер ( обработка в таймере)
при стопе
Всё, ты при старте вошёл в вечный цикл, как ты из него выйдешь?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
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);
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
05.01.2013, 01:37     Как сделать "Старт", "Пауза", Стоп"? #18
Ты запустил таймер, например на 100 миллисекунд, через 100 миллисекунд он либо послал окну сообщение WM_TIMER, либо вызвал функцию обратного вызова, но пока эти 100 миллисекунд ИДУТ, ты никаких действий по отрисовке (тот самый вечный цикл ну или любые другие действия) делать не можешь; а в это время у тебя работает обыкновенный цикл обработки сообщений.

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

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

Ну или давай уж код с таймером, заценим; для простоты пусть будут две кнопки. Пуск таймера и стоп таймеру. Посмотрим чё ты отрисуешь во время его работы.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
05.01.2013, 01:45     Как сделать "Старт", "Пауза", Стоп"? #19
Цитата Сообщение от kravam Посмотреть сообщение
Ты запустил таймер, например на 100 миллисекунд, через 100 миллисекунд он либо послал окну сообщение WM_TIMER, либо вызвал функцию обратного вызова, но пока эти 100 миллисекунд ИДУТ, ты никаких действий по отрисовке (тот самый вечный цикл ну или любые другие действия) делать не можешь; а в это время у тебя работает обыкновенный цикл обработки сообщений.
ты догадываешься как таймер в Windows работает?
Цитата Сообщение от kravam Посмотреть сообщение
Ну или давай уж код с таймером, заценим.
на смотри
правда я там не рисовал а музыку играл

Написать программу для развития слуха
если нужно конкретно рисование то скажи чего рисовать сварганим если время будет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 02:19     Как сделать "Старт", "Пауза", Стоп"?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
05.01.2013, 02:19     Как сделать "Старт", "Пауза", Стоп"? #20
Цитата Сообщение от ValeryS Посмотреть сообщение
ты догадываешься как таймер в Windows работает?
А чё тут догадываться? Есть справочники, взял прочёл, понял. Тут ничего не указывается ни на какую функцию обратного вызова. Во время которой могло бы происходить рисование или, например печать
http://www.vsokovikov.narod.ru/New_M...n_settimer.htm
Есть только указание на функцию обратного вызова, которая вызывается по окончании работы таймера. Это я прочёл по справке. Ты опять меня будешь спрашивать, догадываюсь ли я как работает таймер? Я прочёл и я не догадываюсь, я знаю.

Такие ответы канают за отмазку вообще-то. Давай простое консольное приложение, которое вместо рисования что-нибудь печатает в консоли.
Yandex
Объявления
05.01.2013, 02:19     Как сделать "Старт", "Пауза", Стоп"?
Ответ Создать тему
Опции темы

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