Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ ребус http://www.cyberforum.ru/cpp-beginners/thread746515.html
# include <iostream> # include <stdio.h> # include <conio.h> # include <math.h> using namespace std; int main() {int d=0,r=0,u=0,g=0,s0,s1,sum; cout <<"Rebus"; do { * do { * * * if(r==d) continue; do...
C++ Как правильно перегружать унарный минус? Дайте правильный прототип перегрузки унарного минуса. http://www.cyberforum.ru/cpp-beginners/thread746508.html
Деление длинного на длинное C++
#ifndef INTEGERLONGS_HPP_INCLUDED #define INTEGERLONGS_HPP_INCLUDED //================================================================================================= namespace Longs { class...
C++ Как переделать эту прогу в шаблон классов "Двусвязный список" произвольных элементов
#include <iostream.h> #include <stdlib.h>2 #include <conio.h> using namespace std; struct Element { public: double data; //сами данные
C++ Контейнеры STL и виды деревьев http://www.cyberforum.ru/cpp-beginners/thread746500.html
подскажите, или покажите где есть эта информация например я знаю, что контейнеры map и set реализованы через красно-черное дерево через "какие" деревья\другие структуры данных реализованы остальные...
C++ простые числа от 1 до 10000 Написать программу, которая выводит на экран все простые числа в диапазоне от 1 до 10000 и находит их количество. подробнее

Показать сообщение отдельно
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
07.01.2013, 18:14
Ну вот, то, о чём я и говорил. Задержка в 1 секунду не допускается, но она есть. Вот и таймер.
Но и мой способ не подойдёт по этой же самой причине. Если его использовать, тогда управляющий поток должен передать управление рисующему потоку, который точно также будет чего-то расчитывать в течении1-ой секунды, а, поскольку он в это время будет владеть окном, та же задержка в управлении и выйдет. Только реализация ещё труднее.

Что же делать?

Нужен симбиоз решений.
Пусть у тебя рисует всё в таймере- у то есть через 100 миллисекунд к примеру. Это нормально. Но все расчёты пуст делаются в ДРУГОМ потоке.
Ну то есть как-то так:

---в потоке A нажал старт-> создался параллельный поток B (чисто для расчётов, он окно не занимает)

(Теперь по расчётам. Я так понимаю, все данные для расчётов формируются динамически, иначе их просто можно было расчитать до начала отрисовки, а потом махом всё отрисовать. То есть

произошла отрисовка- новые данные
произошла отрисовка- новые данные
произошла отрисовка- новые данные
произошла отрисовка- новые данные

Отсюда вывод: по каждому расчёту поток B должен приостанавливать свою деятельность и ждать, сигнала "произошла отрисовка", после этого генерить новые данные и посылать их потоку A).
---В потоке B делается расчёт и посылается об этом сигнал потоку A; поток B приостанавливает деятельность
---Поток A отрисовывает чё надо и посылает сигнал об этом потоку B
---В потоке B делается расчёт и посылается об этом сигнал потоку A; поток B приостанавливает деятельность
---Поток A отрисовывает чё надо и посылает сигнал об этом потоку B

И так сколько нам надо раз. Можно сделать, чтобы поток B сделал, к примеру 10 расчётов по 1-ой секунде каждый после чего самоубился. Тогда вся работа займёт примерно 1- секунд- то же самое, что и в твоём варианте с той лишь разницей, что в эти 10 секунд окно тормозить не будет .
Можно просто напросто реализовать убиение потока по нажатию кнопки стоп.

Я тебе сразу говорил с кандачка эту задачу не решить.

Не по теме:

А в билдере, как я понял, надо только подумать и синхронизацию прописывать не надо, всё само пропишется.



И напоследок ты спросишь- а где тут таймер? Как видишь, обошлись без него. Ведь для чего он нам нужен был? Чтобы циклично выполнялись какие-то действия (перерисовка). Но тут таймером может с успехом служить поток B- всякий раз по окончании расчётов он посылает сигнал об этом потоку A; так что не будем плодить лишние сущности.

Щас изобразим. Сразу говорю- кнопки пауза не будет, кроме того. Данные потоку B передаваться не будут. Передача динамически формирующихся данных- это отдельная тема. Вместо этого будет например семафор какой-нибудь (тоже вид данных своего рода),
то есть так:

поток B расчитал- сбросил флаг
поток A отрисовал- установил флаг


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