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

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

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

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

26.12.2012, 11:11. Просмотров 5558. Ответов 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 записей. в программе ввести в массив данные и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,578
Записей в блоге: 17
06.01.2013, 14:58 #46
Сами виноваты человек написал вам что у него Builder, а вы ему Dev и WinApi пихаете...я уже не говорю про pthread и консоль...

Добавлено через 3 минуты
Цитата Сообщение от kravam Посмотреть сообщение
Да с IDE тебе не повезло. Bilder это вообще по-моему не знаю что а первая тоже какой-о эксклюзив.
Ага в Dev повезло ...

Как раз Builder куда лучше Dev ...
А главное если использовать потоки то не нужно извращаться с WinApi для синхронизации.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
06.01.2013, 15:36 #47
Цитата Сообщение от kravam Посмотреть сообщение
И всё, твоя программа встряла. И окно не перерисовывается и вообще.
Без фанатизма
Я же сказал, у каждого метода свои недостатки
тяжеловесы, или чтение с порта в отдельный поток, а рассчитать положение фигурки на экране нафиг не нужен

Цитата Сообщение от kravam Посмотреть сообщение
А в двупоточной программе этого никогда не будет.
там свои проблемы синхронизация, одновременный доступ
Цитата Сообщение от Avazart Посмотреть сообщение
не нужно извращаться с WinApi для синхронизации.
прям таки совсем не нужно?
Автомат все за тебя не сделает
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,578
Записей в блоге: 17
06.01.2013, 15:51 #48
Цитата Сообщение от ValeryS Посмотреть сообщение
прям таки совсем не нужно?
Автомат все за тебя не сделает
Конечно... ( если конечно не учитывать тот факт что VCL - обвертка WinApi )

boost и pthread тоже обвертки, но для синхронизации с "окнами" как я понимаю там ничего не предусмотрено ( ибо никак оно не связано с окнами ) по этому пришлось бы опять же прибегнуть к WinApi.
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
06.01.2013, 16:03 #49
Цитата Сообщение от Avazart Посмотреть сообщение
Как раз Builder куда лучше Dev ...
сказать всё, что угодно можно.
Dev-Cpp прост, простота заключается в его минимализме. По умолчанию использует компилятор gcc, компилятор легко (ЛЕГКО изменить); русскоязычный опять же. Есть исходники.
Как видишь, мне понадобилось подключить библиотеку pthread- я подключил, всё просто. Хочешь другую библиотеку подключи.

Цитата Сообщение от Avazart Посмотреть сообщение
А главное если использовать потоки то не нужно извращаться с WinApi для синхронизации.
Давай всё-таки слова не будем говорить разные, а? Я имею ввиду "извращаться"
Вообще я тебя так понял:
Использование WinApi для синхронизации потоков- извращение по определению
Использование <чего-то другого, несомненно крутого, билдера там что ли> для синхронизации потоков- это круто потому что это круто
Думай что говоришь.

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

Я не использую WinApi для создания потоков по причине которая реально ЕСТЬ. А не потому что это "извращение"

Добавлено через 4 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
pthread тоже обвертки, но для синхронизации с "окнами" как я понимаю там ничего не предусмотрено
как прикажешь тебя понимать- ничего не предусмотрено? Вообще предусмотрена синхронизация потоков и ещё какая синхронизация. С помощью мьютексов, семафоров, условных переменных. Второй раз за эту тему говорю- хоть глазами-то пробегись по мануалу какому-нибудь прежде чем что-то утверждать
Я так-то стараюсь инструменты нормальные подобрать для работы, если чё.
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,578
Записей в блоге: 17
06.01.2013, 16:32 #50
Цитата Сообщение от kravam Посмотреть сообщение
Dev-Cpp прост, простота заключается в его минимализме.
Dev-C++ — свободная интегрированная среда разработки приложений для языков программирования C/C++. В дистрибутив входит компилятор MinGW. Сам Dev-C++ написан на Delphi. Распространяется согласно GPL.
Проект поддерживается SourceForge. Основатель проекта Колин Лаплас, компания Bloodshed Software.
Одно время был доступен Linux-порт, однако на настоящее время актуализирована только Windows-версия.
На настоящий момент не разрабатывается, вместо него активно разрабатывается порт интерфейса Dev-C++ на wxWidgets — wxDev-C++.
http://ru.wikipedia.org/wiki/Dev-C%2B%2B


Цитата Сообщение от kravam Посмотреть сообщение
Использование WinApi для синхронизации потоков- извращение по определению
Конечно, как и писать в С++ в Си стиле... ибо в WinApi нет классов... код попросту не удобен...

Цитата Сообщение от kravam Посмотреть сообщение
как прикажешь тебя понимать- ничего не предусмотрено? Вообще предусмотрена синхронизация потоков и ещё какая синхронизация. С помощью мьютексов, семафоров, условных переменных. Второй раз за эту тему говорю- хоть глазами-то пробегись по мануалу какому-нибудь прежде чем что-то утверждать
Я так-то стараюсь инструменты нормальные подобрать для работы, если чё.
А ты читай сам внимательнее что я писал... Не boost не pthread не привязаны к среде и ёё "окнам".
Поэтому с тут будет многоБукоВ с мьютексов, семафорами...
условных переменных.
А это вообще что такое ?
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,578
Записей в блоге: 17
06.01.2013, 17:52 #51
Пример с таймером привел, теперь приведу простой пример с двумя потоками TThread
Вложения
Тип файла: rar TThread Рисование на канве.rar (178.5 Кб, 26 просмотров)
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
06.01.2013, 18:30 #52
Цитата Сообщение от Avazart Посмотреть сообщение
На настоящий момент не разрабатывается
Это я и сам знаю, ты бы уж меня спросил за Dev-Cpp, я бы тебе весь расклад сделал
Во-первых, то, что оно не разрабатывается, это не плохо и не хорошо, это никак. Чему там разрабатываться? Есть готовый продукт, авторы не намерены вносить изменений, это их дела. Хотят вешают на него примочки, не хотят не вешают. Ещё раз, минимализм- вот свойство Dev-Cpp, кому нравится- пожалуйста. По скачке МОЖНО скачать Dev-Cpp, без компилятора и впихнуть туда свой компилятор, какой захочешь, что я и сделал.
По умолчанию с DEv-Cpp идёт версия gcc 3.4.2, это нехорошо, конечно, но более или менее опытный чел обратит на это внимание СРАЗУ. А новичку для "Hello, word" и так сойдёт
Не без косяков, конечно, но где их нет? А сырцы Dev-Cpp открыты, (в отличие от других хороших IDE) вот я их правил
Предлагаю людям как усовершенствовать IDE Dev-Cpp 4.9.9.2

Цитата Сообщение от Avazart Посмотреть сообщение
wxDev-C++
не советую никому использовать, ибо главное, что там есть- это формошлёпство далеко не на уровне. Как видишь, всё честно.

Цитата Сообщение от Avazart Посмотреть сообщение
Конечно, как и писать в С++ в Си стиле... ибо в WinApi нет классов... код попросту не удобен...
это уже более конкретно. Одна из причин, по которой я и использую pthread; Кстати в C++ классы есть если чё. Он и назывался так изначально "C с классами".

Цитата Сообщение от Avazart Посмотреть сообщение
А ты читай сам внимательнее что я писал... Не boost не pthread не привязаны к среде и ёё "окнам".
Поэтому с тут будет многоБукоВ с мьютексов, семафорами...
не больше чем надо, уверяю тебя. Ты попробуй сперва потом говори. Необязательно читать всё. Синхронизация с помощью мьютексов, к примеру. Возьми, прочти, выноси суждение по СИНТАКСИСУ, насколько он неудобен, ибо щас речь о нём, как я понял. А то невежеством попахивает.

Цитата Сообщение от Avazart Посмотреть сообщение
А это вообще что такое ?
один из способов синхронизации. Читаем, изучаем.
Вообще я, например, щас изучаю C# но я стараюсь невежества своего не показывать. Если, к примеру там есть какая-нибудь, сущность то я не бегу на форум и не возмущаюсь- как же так, в С++ этого нет и ничего, обходимся. За неудобство в чём-то платим удобством. Одно из достоинств (внимание- термины!) ИЗУЧЕНИЯ pthread (не самой библиотеки, а её изучения)- если вдруг придётся работать с линуксом, с ноля изучать многопоточность не надо будет. Вот двух зайцев я и убил.
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,578
Записей в блоге: 17
06.01.2013, 19:53 #53
Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
ИЗУЧЕНИЯ pthread (не самой библиотеки, а её изучения)- если вдруг придётся работать с линуксом, с ноля изучать многопоточность не надо будет. Вот двух зайцев я и убил.
А если не придется, то зря потраченное время и изврат...

Другое дело boost...
Добавлено через 9 минут
Цитата Сообщение от kravam Посмотреть сообщение
один из способов синхронизации. Читаем, изучаем.
Речь о Condition Variable ?

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Он и назывался так изначально "C с классами".
Это когда то давно...

Цитата Сообщение от kravam Посмотреть сообщение
По умолчанию с DEv-Cpp идёт версия gcc 3.4.2, это нехорошо, конечно, но более или менее опытный чел обратит на это внимание СРАЗУ. А новичку для "Hello, word" и так сойдёт
Новичек может использовать CodeBlocks или другую легкую IDE.

Цитата Сообщение от kravam Посмотреть сообщение
Не без косяков, конечно, но где их нет? А сырцы Dev-Cpp открыты, (в отличие от других хороших IDE) вот я их правил
Можно конечно тратить время на правку сорcов IDE, и на
Цитата Сообщение от kravam Посмотреть сообщение
Синхронизация с помощью мьютексов
с WinApi окнами...

Но зачем ?

Учитывая, то что ТС изначально сказал что у него стоит Builder, совет использовать DEv как то ...

Но что тут говорить ? Просто сравните количество написаного когда ...
Shpion007
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 40
06.01.2013, 20:03  [ТС] #54
Цитата Сообщение от Avazart Посмотреть сообщение
Пример с таймером привел, теперь приведу простой пример с двумя потоками TThread
Пытался запустить у себя, пишет, что
E2209 Unable to open include file 'System.Classes.hpp'
также Vcl.Controls.hpp
Vcl.StdCtrls.hpp
Vcl.Forms.hpp

Что посоветуете?
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
06.01.2013, 20:54 #55
Цитата Сообщение от Avazart Посмотреть сообщение
А если не придется, то зря потраченное время и изврат...
а я рискну. И да, мы же вроде договорились словами не бросаться?

Цитата Сообщение от Avazart Посмотреть сообщение
Речь о Condition Variable ?
там другой термин используется
Условная переменная имеет тип pthread_cond_t.

Цитата Сообщение от Avazart Посмотреть сообщение
Это когда то давно...
Название изменилась суть осталась. Третий раз ставлю на вид- к чему слова говорить? Давно- не давно... Чё за трольчатина? Отвечайте прямо- в C++ классов нету что ли, по вашему?

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

Цитата Сообщение от Avazart Посмотреть сообщение
Можно конечно тратить время на правку сорcов IDE, и на
"тратить время"- толсто, слишком толсто. Я могу с тем же успехом сказать, что не считаю это время потраченным. Могу сказать, что нет набажных IDE и в свете этого факта возможность править сырцы- благо, но вам же хочется просто поговорить, да?

"тратить время", "потраченное время", "изврат", "извращение"... Позорище.

Цитата Сообщение от Avazart Посмотреть сообщение
Но что тут говорить ? Просто сравните количество написаного когда ...
сравнил и что?
Вот моё:
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
#include <pthread.h> 
 
//++++++++++++++++++++++++++++++++++++++++++++
 
//функция потока
void *task2(void *X);
 
//ЭТО для объявления потоков всё
void* status; 
pthread_t ThreadA; // Объявляем потоки. 
bool flag= false;
 
//Это два вызова в коде
pthread_create(&ThreadA,NULL,task2,NULL); 
pthread_cancel(ThreadA); 
 
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//Функция- деструктор потока, выполняется при его анулировании
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); 
 
 //Тут выполняемые действия; тоже к pthread не имеют отношения 
 
 pthread_cleanup_pop (false); 
 
 return NULL; 
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Всё, что касается потоков.
44 строчки

А у тебя как я понял два файла, TMyThread.cpp и TMyThread.h в одном 64 строчки, в другом 24, 20- строк убираем на комменты ну и что остаётся?

А весь остальной код он (создание окон, оконная процедура и прочее) имеет отношение к недостаткам или достоинствам pthread как свинья к апельсинам. Создание окон можно охренительно автоматизировать и то что я этого не делаю, так это ко мне вопросы, почему я этого не делаю.

Но при чём тут pthread или Dev-Cpp? Ни при чём.

Цитата Сообщение от Avazart Посмотреть сообщение
совет использовать DEv как то ...
не боги горшки обжигают. Поставит Dev-Cpp и будет работать и спасибо ещё мне потом скажет.
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,578
Записей в блоге: 17
06.01.2013, 22:07 #56
Цитата Сообщение от kravam Посмотреть сообщение
Всё, что касается потоков.
44 строчки
Ёу ... где в коде обещенная синхронизация с окном ?
Цитата Сообщение от kravam Посмотреть сообщение
А у тебя как я понял два файла, TMyThread.cpp и TMyThread.h в одном 64 строчки, в другом 24, 20- строк убираем на комменты ну и что остаётся?
Я говорил про написанный код руками ... ( класс наследник от TThread создается автоматически средой ) я лишь добавил пару поле и свой расширенный конструктор и собственно тело потока...
И при чем не было необходимости что-то вносить в код окна для синхронизации...

Добавлено через 57 секунд
Цитата Сообщение от kravam Посмотреть сообщение
не боги горшки обжигают. Поставит Dev-Cpp и будет работать и спасибо ещё мне потом скажет.
Лично я когда то ставил - почти сразу снес...

Цитата Сообщение от kravam Посмотреть сообщение
Только имей ввиду что ТАК оконные приложения не пишутся, это просто чтобы знать что и как работает. Так пист это вчерашний день. Оконные приложения пишутся с помощью конструктора форм, где все кнопки не прописываешь вручную, а кидаешь на форму мышкой. Если серьёзно настроен на это, то советую обратиться к языку C#; тут вот моя тема:
необходимо разобраться со всем этим благолепием, которое предоставляет студия MSVS
Я лично отошёл от (С++сногоконструктора форм) и обратился к C# и по моему не ошибся. В конце концов никто не запрещает интерфейс реализовывать на С# (я так понял, это его сильная сторона; все вот эти кнопки), а функционал на C+
С++ и CLR это изврат как по мне, жаль не обратил на это пост внимание ( может бы просто дальше не спорил бы)

C++
1
2
3
4
5
6
7
8
9
10
11
12
                //Функция потока
void *task2(void *X) { 
// ...
 pthread_cleanup_push (&routine, arg); 
 int OldState,OldType; 
// // Разрешено аннулирование асинхронного типа. 
// ...               
 while (true) {
   //...
  SetWindowText (hwndEdit, temp); /* !!! */
  Sleep (100);
 }
Все бы хорошо если бы нужно было SetWindowText(), а не GDI - ф-ции которые нуждаются в синхронизации как я писал выше...

И то что товарисЧ писал про то что поток плохо прибивать снаружи - думаю правда
( хотя не уверен в работе pthread, но думаю он вызывает TerminatedThread() что плохо )
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
06.01.2013, 22:57 #57
Цитата Сообщение от Avazart Посмотреть сообщение
Ёу ... где в коде обещенная синхронизация с окном ?
базара нет, если я где-то сказал, что будет синхронизация с потоком окна- покажи мне это. В любом случае я сказал это (если сказал)- зря. Потому, что синхронизации с использованием в ЧАСТНОСТИ средств синхронизации в этой задачи не надо. И её у меня нет. Всё просто, тыкается на кнопку- поток запускается. Тыкается на другую- останавливается. Оконный поток и вспомогательный не имеют разделяемых ресурсов. Были бы- была бы синхронизация несомненно.
Ну то есть грубо говоря- потоки работают синхронно без специальных средств синхронизации. Ибо отношение друг у другу имеют небольшое, прямо скажем- один запускается выключается из другого. Всё на этом.

Цитата Сообщение от Avazart Посмотреть сообщение
Я говорил про написанный код руками ... ( класс наследник от TThread создается автоматически средой ) я лишь добавил пару поле и свой расширенный конструктор и собственно тело потока...
И при чем не было необходимости что-то вносить в код окна для синхронизации...
ну то на то и вышло. У тебя нет синхронизации и у меня нет. Но у меня-то нет осмысленно, а у тебя потому, что билдер не написал синхронизацию.
Впрочем прикола ради- ты бы показал, что ли, что ты писал руками. Может заценю в натуре брошу всё и перейду на билдер.

Цитата Сообщение от Avazart Посмотреть сообщение
С++ и CLR это изврат как по мне, жаль не обратил на это пост внимание ( может бы просто дальше не спорил бы)
ну вот видишь

Цитата Сообщение от Avazart Посмотреть сообщение
Все бы хорошо если бы нужно было SetWindowText(), а не GDI - ф-ции которые нуждаются в синхронизации как я писал выше...
Вот когда будут GDI-функции, тогда и будем разоваривать. И синхронизация будет и всё на свете. Я решал задачу про обедающих философов и накропал её графическое решение, вот уж где есть разгуляться синхронизации.
А щас ты уж поверь на слово, что она в pthread есть.

Цитата Сообщение от Avazart Посмотреть сообщение
И то что товарисЧ писал про то что поток плохо прибивать снаружи - думаю правда
( хотя не уверен в работе pthread, но думаю он вызывает TerminatedThread() что плохо )
да он сказал не подумав, а ты повторяешь.

В pthread для корректного завершения потока предусмотрено:
асинхронное аннулирование- ну это немедленно (то есть не корректное, а так себе)
отсроченное- в потоке, который надо аннулировать, программистом определяются места в коде, где можно сделать аннулирование. Это ты уж сам определяй- ага, аннулировать можно только в этой точке.

Наконец, если аннулирование асинхронное, то предусмотрена функция типа деструктора класса, которая перед убиением потока совершает нужные действия. У меня в коде вот она:
C++
1
2
 pthread_cleanup_push (&routine, arg); 
 pthread_cleanup_pop (false);
Вызывается когда убиваем поток

Чё ещё придумать для безопасного убиения потока извне, я хз.
Наконец, внеси ясность в вопрос- чё, в билдере потоки что ли извне не убиваются?
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,578
Записей в блоге: 17
07.01.2013, 00:14 #58
Цитата Сообщение от kravam Посмотреть сообщение
базара нет, если я где-то сказал, что будет синхронизация с потоком окна- покажи мне это.
Цитата Сообщение от kravam Посмотреть сообщение
Вот когда будут GDI-функции, тогда и будем разоваривать. И синхронизация будет и всё на свете.
Вообще то я говорил про именно синхронизацию и именно при перерисовке... да и TC просил именно рисование т.е. GDI ( собственно GDI было и в его примерах если вы не заметил )

Так что с базара не съежай...

Цитата Сообщение от kravam Посмотреть сообщение
ну то на то и вышло. У тебя нет синхронизации и у меня нет. Но у меня-то нет осмысленно, а у тебя потому, что билдер не написал синхронизацию.
У меня осмысленно есть синхронизация и есть собственно рисование ...
C++
1
2
3
Form1->Canvas->Lock();
// ... рисование
Form1->Canvas->Unlock();
Цитата Сообщение от kravam Посмотреть сообщение
да он сказал не подумав, а ты повторяешь.
В pthread для корректного завершения потока предусмотрено:
асинхронное аннулирование- ну это немедленно (то есть не корректное, а так себе)
Да собственно речь как раз и шла о не корректном завершении, и я писал же о
хотя не уверен в работе pthread, но думаю он вызывает TerminatedThread() что плохо
Добавлено через 18 минут
Цитата Сообщение от kravam Посмотреть сообщение
Впрочем прикола ради- ты бы показал, что ли, что ты писал руками. Может заценю в натуре брошу всё и перейду на билдер.
Ок ...

TMyThread.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//---------------------------------------------------------------------------
#ifndef TMyThreadH
#define TMyThreadH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
//---------------------------------------------------------------------------
class TMyThread : public TThread
{
private:
    TRect Rect;  /* Добавил  Область в котрой бегает кривая*/
    TPoint P1;    /* Добавил   начальная точка*/
    TPoint P2;    /* Добавил  конечная точка */
    TColor Color; /* Добавил  цвет кривой*/
 
protected:
    void __fastcall Execute(); 
    void __fastcall Paint();  /* Добавил  только что бы показать  как пользоваться Synchronize() */
public:
    __fastcall TMyThread(bool CreateSuspended);
    __fastcall TMyThread(bool CreateSuspended,TPoint P,TRect Rect,TColor Color); /* Добавил  */
};
//---------------------------------------------------------------------------
#endif
Итого 4 строчки полей и 1 строчка конструктора

TMyThread.cpp
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "TMyThread.h"
#include "Unit1.h"
#include <time.h> /* Добавил для рандома */
 
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended)
    : TThread(CreateSuspended)
{
}
//--------------------------Далее мой  конструтор с инитом полей ------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended,TPoint P,TRect Rect,TColor Color)
    : TThread(CreateSuspended)
{       
    this->Rect= Rect;  
    this->P1= P;  // Начальная точка  
    this->Color= Color; 
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{  // вписал тело потока
    while(!Terminated) // если поток не останавливаем
     {      // не хитрый рандом
         srand(P1.x+P1.y+time(0)); 
         P2.x= rand()%Rect.Width()+Rect.Left;
         P2.y= rand()%Rect.Height()+Rect.Top;
         Sleep(100); // ЖдемС имитируя грамосткие вычисления ...
                  /* Далее рисование с синхронизацией */
         // Synchronize(&Paint);  что бы показать  Synchronize()
         Form1->Canvas->Lock(); // блокирование канвы
         try    
            {     // рисование
                Form1->Canvas->MoveTo(P1.x,P1.y); // рисуем от  СюДва
                Form1->Canvas->Pen->Width= 5; // толщина линии
                Form1->Canvas->Pen->Color= Color; // Цвет линии
                Form1->Canvas->LineTo(P2.x,P2.y); // до СеЛи
            }
         __finally //  полюбЭ разблокируем  
            {
                 Form1->Canvas->Unlock();
            }
 
         P1= P2; // конец последней точки становится началом
     }
}
//--------------------Это можно не писать если не юзать Synchronize() -----------------
void __fastcall TMyThread::Paint()
{
    // Альтернатива   Canvas->Lock() / Canvas->Unlock();
    Form1->Canvas->MoveTo(P1.x,P1.y);
    Form1->Canvas->Pen->Width= 5;
    Form1->Canvas->Pen->Color= Color;
    Form1->Canvas->LineTo(P2.x,P2.y);
}
//---------------------------------------------------------------------------
Тут конечно строк по более но и задумка куда по более вашей ...
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
07.01.2013, 00:40 #59
Цитата Сообщение от Avazart Посмотреть сообщение
Вообще то я говорил про именно синхронизацию и именно при перерисовке... да и TC просил именно рисование т.е. GDI ( собственно GDI было и в его примерах если вы не заметил )
Так что с базара не съежай...

Ни чего подобного. ТС просил не именно рисование, а цикличное действие, что я и сделал- печать. А рисование было "например", если ты не заметил; ТС-овский код не смотрел ни разу, работал по запросу.
Цитата Сообщение от Shpion007 Посмотреть сообщение
Доброго времени суток,
как сделать так, чтобы при нажатии на кнопку начиналось цикличное действие (рисование например) и продолжалось бы пока не будет нажата другая кнопка. Грубо говоря, как сделать "Старт", "Пауза", Стоп".
А у меня "например" печать. А проще потому что, чем рисование. Пример он всегда прост. Всё, пусть теперь лепит вместо печати рисование и синхронизирует при необходимости.
А вообще необходимость синхронизации определяется не используемыми функциями, (в частности GDI), а тем, есть или нет у потоков разделяемые ресурсы. Ситуация: один поток рисует в одном окне, а другой владеет другим окном. И всё. Хоть 100 GDI-функций используй. Вся синхронизация будет заключаться в пуске и остановке одного потока из другого.

Если уж предъявы кидать мне- у меня и паузы не предусмотрено. Сам пусть лепит, базу дал. Такой вот я.

А на слабО меня брать не надо- смогу я синхронизировать или нет потоки если буду использовать GDI. Смогу, хочешь верь, хочешь нет. Просто я с GDI не дружу, если на то пошло. Графику лепил используя OpenGL. Давай я тебе скину проект, как мне кидал ValeryS, ты же не будешь в нём разбираться?

Цитата Сообщение от Avazart Посмотреть сообщение
У меня осмысленно есть синхронизация и есть собственно рисование ...
ну есть и есть, молодец, чё могу сказать.

Давай по размеру кода

Цитата Сообщение от Avazart Посмотреть сообщение
Итого 4 строчки полей и 1 строчка конструктора
чё-т у меня глаз наверное замылился, я только в
TMyThread.h

23 строчки насчитал и ниже портянка не слабая.
В общем, заканчиваем холиварить. В веру свою нам друг друга не обратить, я чувствую.

Добавлено через 6 минут
Цитата Сообщение от Avazart Посмотреть сообщение
ут конечно строк по более но и задумка куда по более вашей ...
Ну хорошо. Пусть у тебя будет два потока в приложении- основной и вспомогательный. Подгони под меня (у меня же проще)- убери из вспомогательного потока рисование и оставь отладочную печать на консоль. Ну то есть: поток запустился, написал "Hello, word" и отработал. Пободаемся.
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,578
Записей в блоге: 17
07.01.2013, 01:14 #60
Цитата Сообщение от kravam Посмотреть сообщение
чё-т у меня глаз наверное замылился, я только в
TMyThread.h
23 строчки насчитал и ниже портянка не слабая.
В общем, заканчиваем холиварить. В веру свою нам друг друга не обратить, я чувствую.
Ручками 4-ре ...
Собственно это шаблон класса ...
Цитата Сообщение от kravam Посмотреть сообщение
Просто я с GDI не дружу,
Все понятно ...

Цитата Сообщение от kravam Посмотреть сообщение
А вообще необходимость синхронизации определяется не используемыми функциями, (в частности GDI), а тем, есть или нет у потоков разделяемые ресурсы. Ситуация: один поток рисует в одном окне, а другой владеет другим окном. И всё. Хоть 100 GDI-функций используй. Вся синхронизация будет заключаться в пуске и остановке одного потока из другого.
А GDI -ф-ции обращаются не к разделяемому ресурсу - окну программы, сообщения от которого обрабатываются в оконной процедуре в основном потоке ?

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Ну хорошо. Пусть у тебя будет два потока в приложении- основной и вспомогательный. Подгони под меня (у меня же проще)- убери из вспомогательного потока рисование и оставь отладочную печать на консоль. Ну то есть: поток запустился, написал "Hello, word" и отработал. Пободаемся.
Какую консоль ты о чем ? приложение оконное изначально было ( напоминаю если ты об этом уже забыл )
Цитата Сообщение от Shpion007 Посмотреть сообщение
как сделать так, чтобы при нажатии на кнопку начиналось цикличное действие (рисование например) и продолжалось бы пока не будет нажата другая кнопка. Грубо говоря, как сделать "Старт", "Пауза", Стоп".
Добавлено через 11 минут
Цитата Сообщение от kravam Посмотреть сообщение
Ну то есть: поток запустился, написал "Hello, word" и отработал. Пободаемся.
Это даже не интересно ... тут и без TThread обойтись можно ... ( CreateThread() + крит секция )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2013, 01:14
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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