Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2012, 21:42   #1
Shpion007
Пользователь
 
Регистрация: 28.12.2012
Сообщений: 14
Вопрос --== Кнопки "Старт" "Стоп" ==--

Доброго времени суток,
как сделать так, чтобы при нажатии на кнопку начиналось цикличное действие (рисование например) и продолжалось бы пока не будет нажата другая кнопка. Грубо говоря, как сделать "Старт", "Стоп".
Мне предлагали многопоточность, но не понятно как реализовать, что подскажете?
Shpion007 вне форума Ответить с цитированием
Старый 28.12.2012, 22:07   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Как обычно. Пишется функция потока. В ней цикл. В цикле идет какое-то действие.(рисование например). В цикле также можно проверять какой-нибудь boolean флаг. Если он сброшен - выход из цикла. Функция потока закончилась, поток завершен.
Поток можно прибить и напрямую, но не желательно. Реализовать на winapi CreateThread. А если в дотнет, тогда System.Threading.Thread.
EUGY вне форума Ответить с цитированием
Старый 28.12.2012, 22:11   #3
Shpion007
Пользователь
 
Регистрация: 28.12.2012
Сообщений: 14
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Как обычно. Пишется функция потока. В ней цикл. В цикле идет какое-то действие.(рисование например). В цикле также можно проверять какой-нибудь boolean флаг. Если он сброшен - выход из цикла. Функция потока закончилась, поток завершен.
Поток можно прибить и напрямую, но не желательно. Реализовать на winapi CreateThread. А если в дотнет, тогда System.Threading.Thread.
Это я понял, но как это реализовать мне никто сказать не смог, вот к примеру компилятор у меня Embarcadero RAD Studio 2010, приведите, пожалуйста, пример простейшего компилируемого кода с этими потоками, а то пробовал я, находил примеры, но ничего не выходило.
Shpion007 вне форума Ответить с цитированием
Старый 28.12.2012, 22:33   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Не ручаюсь за всякие си-билдеры,
но условно так:
Код:
#include <windows.h>

volatile bool bFLAG;

DWORD WINAPI tridproc(void*)
{
	while(bFLAG)
	{
		// рисовать
	}

	return NULL;
}


//событие кнопки старт
{
        bFLAG   = true;
	DWORD tid;
	HANDLE hTrd = CreateThread(NULL, 0, tridproc, 0, 0, &tid);
	CloseHandle(hTrd);
}

//событие кнопки финиш
{
    bFLAG = false; 	
}
EUGY вне форума Ответить с цитированием
Старый 28.12.2012, 23:30   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
bool isStop=false;
bool isExit= false;
do
{
   isStop = Опросить_Stop();
   isExit = Опросить_Exit();
   if(isStop==false) Draw();

}while(isExit==false)
_Bers вне форума Ответить с цитированием
Старый 28.12.2012, 23:52   #6
Shpion007
Пользователь
 
Регистрация: 28.12.2012
Сообщений: 14
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Не ручаюсь за всякие си-билдеры,
но условно так:
Код:
#include <windows.h>

volatile bool bFLAG;

DWORD WINAPI tridproc(void*)
{
	while(bFLAG)
	{
		// рисовать
	}

	return NULL;
}


//событие кнопки старт
{
        bFLAG   = true;
	DWORD tid;
	HANDLE hTrd = CreateThread(NULL, 0, tridproc, 0, 0, &tid);
	CloseHandle(hTrd);
}

//событие кнопки финиш
{
    bFLAG = false; 	
}
Спасибо большое! Дело сдвинулось с мёртвой точки! Вот только ещё вопрос, я рисую на канве формы. И делал я по предложенной Вами схеме, вот только работает с некоторыми глюками, то рисует немного не так, когда мышкой двигаю, что это может быть?
Shpion007 вне форума Ответить с цитированием
Старый 28.12.2012, 23:54   #7
Shpion007
Пользователь
 
Регистрация: 28.12.2012
Сообщений: 14
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Код:
bool isStop=false;
bool isExit= false;
do
{
   isStop = Опросить_Stop();
   isExit = Опросить_Exit();
   if(isStop==false) Draw();

}while(isExit==false)
Интересно... но можно немного по-подробнее, если тело do будет выполняться по нажатию кнопки, то тогда она никогда не отвиснет?
Shpion007 вне форума Ответить с цитированием
Старый 29.12.2012, 00:13   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Сообщение от Shpion007 Посмотреть сообщение
... вот только работает с некоторыми глюками, то рисует немного не так, когда мышкой двигаю, что это может быть?
Телепатически так:

Если в каком-то потоке использовать свойства, методы, события объекта
созданного в другом потоке, то нужно быть готовым к любым неожиданностям.
Можно посоветовать рисовать только функциями GDI и с этого момента называть "канву формы" - умным словом Device Context
EUGY вне форума Ответить с цитированием
Старый 29.12.2012, 00:19   #9
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от Shpion007 Посмотреть сообщение
Спасибо большое! Дело сдвинулось с мёртвой точки! Вот только ещё вопрос, я рисую на канве формы. И делал я по предложенной Вами схеме, вот только работает с некоторыми глюками, то рисует немного не так, когда мышкой двигаю, что это может быть?
нужна синхронизация с формой если вы пишите на bcb
то вам подойдёт TThread у него есть метод синхронизе.. синхронизация с формой и пожалуйста.

Код:
class T: public TThread
{
...
protected:
void __fastcall Execute(); <-- это используем для работы потока
public:
...
};

void __fastcall TThread::Execute()
{
.....
Synchronize(тут метод с чем нужно синхронизировать)
.....
}
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 29.12.2012, 00:34   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Shpion007 Посмотреть сообщение
Интересно... но можно немного по-подробнее, если тело do будет выполняться по нажатию кнопки, то тогда она никогда не отвиснет?
do выполняется всегда, а не по нажатию кнопки.

Внутри цикла опрашиваются кнопки, и определяется, нужно ли рисовать
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Как "повесить " передачу данных из формы на событие нажатия кнопки типа "button" ? vedro-compota JavaScript, Ajax 10 14.12.2010 21:05
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04