Форум программистов, компьютерный форум 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 параметрами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 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
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
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
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
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
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
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
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
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
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 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
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 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 так и происходит, поэтому и решили применять средства апи, хоть и рисуем на форме то нет никаких глюков.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
05.01.2013, 18:04     Как сделать "Старт", "Пауза", Стоп"? #31
Цитата Сообщение от Shpion007 Посмотреть сообщение
хоть и рисуем на форме то нет никаких глюков.
Странно так как "окно" как было разделяемым ресурсом так им и осталось...
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
05.01.2013, 18:11  [ТС]     Как сделать "Старт", "Пауза", Стоп"? #32
Цитата Сообщение от Avazart Посмотреть сообщение
Странно так как "окно" как было разделяемым ресурсом так им и осталось...
А чего тут спорить, проверь простейший пример, хоть мною пред ставленый, он не совсем изящный, т.к составлялся исключительно для проверки.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
05.01.2013, 18:21     Как сделать "Старт", "Пауза", Стоп"? #33
Такие вещи нельзя проверить так как не знаешь когда произойдет сбой...
То что якобы работает не отменяет необходимости синхронизации между потоками...

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

В любом случае тут в потоке нет необходимости...
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
05.01.2013, 18:27  [ТС]     Как сделать "Старт", "Пауза", Стоп"? #34
Цитата Сообщение от Avazart Посмотреть сообщение
В любом случае тут в потоке нет необходимости...
Возможно, но как решить эту задачу я не знал, и это (показанное мною) решение первое работающее что мне предложили и что удалось реализовать, возможно, оно не самое лучшее, но оно рабочее, предложите другой вариант, возможно он лучше.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
05.01.2013, 18:42     Как сделать "Старт", "Пауза", Стоп"? #35
В таймере рисовать ...

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

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

А что за утечка?
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 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/
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
05.01.2013, 20:10  [ТС]     Как сделать "Старт", "Пауза", Стоп"? #38
Цитата Сообщение от Avazart Посмотреть сообщение
В таймере рисовать ...
А можно пример небольшой, схему принципиальную?
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 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;
}
//--------------------------------------------------------------------------
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 22:18     Как сделать "Старт", "Пауза", Стоп"?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
05.01.2013, 22:18     Как сделать "Старт", "Пауза", Стоп"? #40
Цитата Сообщение от Shpion007 Посмотреть сообщение
решение первое работающее
э, алё, а чё с моим решением?
Как сделать "Старт", "Пауза", Стоп"?
Yandex
Объявления
05.01.2013, 22:18     Как сделать "Старт", "Пауза", Стоп"?
Ответ Создать тему
Опции темы

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