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

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

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

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

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
05.01.2013, 00:20 #16
Цитата Сообщение от ValeryS Посмотреть сообщение
при старте запускай таймер ( обработка в таймере)
при стопе
Всё, ты при старте вошёл в вечный цикл, как ты из него выйдешь?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
05.01.2013, 01:37 #18
Ты запустил таймер, например на 100 миллисекунд, через 100 миллисекунд он либо послал окну сообщение WM_TIMER, либо вызвал функцию обратного вызова, но пока эти 100 миллисекунд ИДУТ, ты никаких действий по отрисовке (тот самый вечный цикл ну или любые другие действия) делать не можешь; а в это время у тебя работает обыкновенный цикл обработки сообщений.

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

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

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

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

Такие ответы канают за отмазку вообще-то. Давай простое консольное приложение, которое вместо рисования что-нибудь печатает в консоли.
Avazart
Эксперт С++
7148 / 5325 / 276
Регистрация: 10.12.2010
Сообщений: 23,572
Записей в блоге: 17
05.01.2013, 02:43 #21
Цитата Сообщение от Shpion007 Посмотреть сообщение
Компилятор у меня Embarcadero RAD Studio 2010, также есть Borland C++Builder 6, желательно, с ними реализовать. А что за тему посмотреть надо, и действительно ли эта задача так сложна?
Забей на Dev++ и boost

Читай про класс TTimer и TThread (особое внимание методу Synchronize() ), он нем можно прочитать в книгах Архангельского.

Где можно найти описание всех стандартных функций доступных в Dev C++ или Borland 6
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
05.01.2013, 03:40 #22
Цитата Сообщение от kravam Посмотреть сообщение
Такие ответы канают за отмазку вообще-то.
за отмазку канает это я не знаю как устроен виндос давай мне на консоли
Цитата Сообщение от 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
 #include <conio.h>  //для ввода
#include <stdio.h>   // для вывода
# include <Windows.h> // для задержки
int main()
{
int inter=0;
bool start=false;
char tmp=0;
while(1)
 {
    if(kbhit())
     tmp=getch();
     if(tmp=='q')
          return 0;
      if(tmp=='z')
         start=true;
      if(tmp=='x')
      {
        inter=0; 
        start=false;
      }
      if(tmp=='c')
        start=false;
      if(start)
          printf (" %d",inter++);
   Sleep(100);// чтобы не слишком торопилась можно выбросить 
 
 }
return 0;
}
для запуска z стоп x пауза c
для выхода q

ткни пальцем где я потоки использовал?
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
05.01.2013, 05:12 #23
Речь шла о SetTimer если чё
Ну ладно

И куда этот цикл ты намерен запихать?
Лично я в однопоточной программе вижу два места- в оконной процедуре и в цикле приёма сообщений. И то и другое плохо. Ибо выполнение этого цикла будет привязано к приёму сообщений. Нет сообщений- цикл не работает, действия не делаются. Вот и всё.
Так-то и проще можно было бы, вот цикл приёмки сообщений:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 while (true) {
   if (!GetMessage (&msg,NULL,0,0))
     break;
  TranslateMessage (&msg);
  DispatchMessage  (&msg);
  
  //А тут вызов функции, которая проверяет глобальные флаги
  //которые устанавливаются кнопками пуск старт и пауза 
  //и в зависимости от них делает определённые действия.
  //Сделала- вернула управление.
  f (); 
}
вот реализация твоей идеи. Но это по меньшей мере непрофессионально. Всякий вызов функции будет привязан к:
1) Приёму сообщения- а неизвестно когда очередное сообщение придёт. А не придёт и функция f () не вызовется
2) К работе оконной функции- как быстро последняя отработает, чтобы вернуть управление системе, с тем, чтобы снова ждать очередного сообщения.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
05.01.2013, 10:45 #24
Цитата Сообщение от kravam Посмотреть сообщение
Речь шла о SetTimer если чё
SetTimer в консоли это виндовая прилуда и зачем её пихать в консоль(хотя можно) не понимаю.

Цитата Сообщение от kravam Посмотреть сообщение
И куда этот цикл ты намерен запихать?
я тебе показал в Маин

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

Цитата Сообщение от kravam Посмотреть сообщение
if (!GetMessage (&msg,NULL,0,0))
Цитата Сообщение от kravam Посмотреть сообщение
Но это по меньшей мере непрофессионально.
разумеется не профессионально и не надо мне это приписывать
нормальные люди используют PeekMessage
http://vsokovikov.narod.ru/New_MSDN_...eekmessage.htm
которая не ждет сообщений
вот например как решили эту проблему в quake2 ребята из Id Software
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
/* main window message loop */
    while (1)
    {
        // if at a full screen console, don't update unless needed
        if (Minimized || (dedicated && dedicated->value) )
        {
            Sleep (1);
        }
 
        while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
        {
            if (!GetMessage (&msg, NULL, 0, 0))
                Com_Quit ();
            sys_msg_time = msg.time;
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
 
        do
        {
            newtime = Sys_Milliseconds ();
            time = newtime - oldtime;
        } while (time < 1);
//          Con_Printf ("time:%5.2f - %5.2f = %5.2f\n", newtime, oldtime, time);
 
        //  _controlfp( ~( _EM_ZERODIVIDE /*| _EM_INVALID*/ ), _MCW_EM );
        _controlfp( _PC_24, _MCW_PC );
        Qcommon_Frame (time);
 
        oldtime = newtime;
    }
или это тоже непрофессионалы?

итак я привел тебе два типа решения без дополнительного потока
с таймером Win32
без таймера в консоли
и третий ты сам указал в главном цикле WinMain

а от тебя не видел ни одного, кроме фразы нужен еще один поток
Ждем-с.....
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
05.01.2013, 11:14 #25
Цитата Сообщение от ValeryS Посмотреть сообщение
а от тебя не видел ни одного, кроме фразы нужен еще один поток
Да вы, батенька, лгун
Как сделать "Старт", "Пауза", Стоп"?

Добавлено через 21 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
SetTimer в консоли это виндовая прилуда и зачем её пихать в консоль(хотя можно) не понимаю.
Не, ну нормально? Это ты завёл речь про таймер- SetTimer в частности. Я жду таймер, хз может ты вещь сделаешь, но таймера не даёшь. Я спрашиваю- таймер-то где? Ты говоришь - да таймер здесь вообще не нужен.
Если ты решаешь задачу с SetTimer, то решай, если не решаешь не фиг его в качестве потенциального решения упоминать. Я тоже могу тебе сказать- могу задачу с помощью того то и того-то, я крут. Но решать не буду потому что не буду.

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

Цитата Сообщение от kravam Посмотреть сообщение
Ибо выполнение этого цикла будет привязано к приёму сообщений
Цитата Сообщение от ValeryS Посмотреть сообщение
ну и ?
Дурака включаем? Ещё раз повторяю тогда
Цитата Сообщение от kravam Посмотреть сообщение
1) Приёму сообщения- а неизвестно когда очередное сообщение придёт. А не придёт и функция f () не вызовется
2) К работе оконной функции- как быстро последняя отработает, чтобы вернуть управление системе, с тем, чтобы снова ждать очередного сообщения.
Ещё раз спроси "ну и"

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

Цитата Сообщение от ValeryS Посмотреть сообщение
а система при установке таймера сообщения не будет слать ??
да и про какой цикл речь ? цикл обработки сообщений?
Я не знаю, будет она слать или нет, я знаю другое- во время работы таймера у системы не предусмотрено никакой специальной работы функции- имею ввиду функцию обратного вызова. Поэтому никакой дополнительной работы между циклами таймера не сделать.
Хотя ты сделаешь, верю. Дома у себя.


Цитата Сообщение от ValeryS Посмотреть сообщение
итак я привел тебе два типа решения без дополнительного потока
с таймером Win32
без таймера в консоли
и третий ты сам указал в главном цикле WinMain
Это ложь. Первый код вообще ни к селу ни к городу, он консольный, его если и применять, то втыкать в оконное прилоджение- воткни, а я посмотрю, как ты это слделаешь. Ты же не делаешь, ты говоришь- я могу. Я если могу, так я и сделал.

Второй код тоже канает за отмазку. Это я щас должен узнавтаь что такое Com_Quit ();? И вот за это надо узнать наверное
_controlfp( _PC_24, _MCW_PC );
Qcommon_Frame (time);
?

Цитата Сообщение от ValeryS Посмотреть сообщение
и третий ты сам указал в главном цикле WinMain
Ну и указал на его недостатки. Если тебя они устраивают- ну пусть так и будет, мне-то что.

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

Соловья баснями не кормят, код-то увижу я? C двумя кнопками? Когда надо так ты умеешь ПРОСТУЮ консоль безо всяких прибамбасов, а, видите ли две кнопки соорудить нам западло- к готовым сомнительным решениям отправляешь.
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
05.01.2013, 16:32  [ТС] #26
Код написанный мною в последнем моём сообщении не полный забыл паузу (3-я кнопка):

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
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <windows.h>
#include <math.h>
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool stop=0, start=1;
//---------------------------------------------------------------------------
__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==true) break;
  if (start==true) {
  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;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if (start==true)
{
start = false;}
else start = true;
 
}
//---------------------------------------------------------------------------
Код рабочий, компилируется, всё отлично.
Avazart
Эксперт С++
7148 / 5325 / 276
Регистрация: 10.12.2010
Сообщений: 23,572
Записей в блоге: 17
05.01.2013, 16:58 #27
Цитата Сообщение от Shpion007 Посмотреть сообщение
Код рабочий, компилируется, всё отлично
Код лАбуДа, нет синхронизации...

Подозреваю ваш код может заглохнуть намертво в неопределенный момент.

Идея рисовать в потоке бессмысленная... никакого выигрыша не даст
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
05.01.2013, 17:35  [ТС] #28
Цитата Сообщение от Avazart Посмотреть сообщение
Код лАбуДа
Не согласен, что в нём не так, применил в своей программе (более сложной), необходимые задачи он решил.

Добавлено через 4 минуты
Также прошу Вас принять участие в решении следующей проблемы: Как изменить цвет пера?
Avazart
Эксперт С++
7148 / 5325 / 276
Регистрация: 10.12.2010
Сообщений: 23,572
Записей в блоге: 17
05.01.2013, 17:36 #29
Цитата Сообщение от Shpion007 Посмотреть сообщение
что в нём не так
Цитата Сообщение от Avazart Посмотреть сообщение
нет синхронизации...
Что тут не понятного ?
Цитата Сообщение от Avazart Посмотреть сообщение
может заглохнуть намертво в неопределенный момент.
Попробуйте постоянно двигать форму в момент перерисовки потоком, обычно в такие моменты прога просто падает
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
05.01.2013, 17:52  [ТС] #30
Цитата Сообщение от Avazart Посмотреть сообщение
Попробуйте постоянно двигать форму в момент перерисовки потоком, обычно в такие моменты прога просто падает
Да мы это проходили, если рисовать средствами vcl так и происходит, поэтому и решили применять средства апи, хоть и рисуем на форме то нет никаких глюков.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 17:52
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.01.2013, 17:52
Ответ Создать тему
Опции темы

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