LINUX.ORG.RU

Как организовать pause, play, stop в цикле с последовательным выполнением функций

 


0

2

Ребята нужна помощь, идея, направление, хоть что-то!!!

Смысл таков. Есть несколько классов, например

class A{
   ..
   someF();
   ..
};
class B{
   ..
   someF();
   ..
};
class C{
   ..
   someF();
   ..
};

и т. д.

И главный цикл, где последовательно должны выполняться ф-и

while(n){
  a.someF();
  // здесь может быть пауза, стоп, продолжить
  b.someF();
  // здесь может быть пауза, стоп, продолжить
  c.someF();
  // здесь может быть пауза, стоп, продолжить
  ...
}

Вообще n - это общее кол-во анимированных процессов(для каждого итого, анимация идентичная), то есть каждый раз последовательно выполняется ф-я или несколько ф-й, после чего в результате запускается анимация процесса.

В чем собственно и вопрос и проблема, как и какими способами можно организовать паузу, стоп или продолжить выполнение в процессе?

Спасибо.

Все очень просто.

1) Наследуем все три класса от одного родителя
2) Создаем список (циклически) который будет работать в качестве очереди выполнения
3) Накидываем в нее выполняемых айтемов (по количеству классов)
4) Запускаем цикл выполнения, каждый раз берем очередной объект и вызываем его функцию. Конечно запоминаем номер текущего элемента для восстановления после остановки.

CrossFire ★★★★★
()
Последнее исправление: CrossFire (всего исправлений: 1)

Странная задача, если честно=) Ну, вообще, хотелось бы узнать на чем пишите? Если, допустим, на Java, то многопоточность. Изворачиваемся теми же Thread.sleep()/Thread.interrupt() (non Thread.stop()!), но это будет довольно нудно. Что-то из постановки задачи мне подсказывает, что здесь хорошо бы применять событийность=) Например, в той же Java, подписчик всегда сможет использовать Class.wait, что будет ближе к теме пауза/продолжить, нежели тот же sleep.

Но, как я сказал выше, тут нужно отталкиваться от ЯП. Т.к., например, если бы это был тот же PHP, то задачу можно было бы решить проще - тупо создать диспетчера для управления задачами, при стопе останавливать процесс (exit/die что там у него), при паузе так же стопить процесс, но предварительно записывая куда удобнее точку возврата (какие-то разбитые блоки), при запуске - просто снова возвращать на эту самую точку.

Вообщем, ЯП в студию, будет проще сказать что удобнее вам будет применять, я конечно Qt не юзаю, но из вашего абстрактного кода, ориентируясь на самые распространенные ЯП могу исключить только руби и питона, а вот дальше (C++/PHP/Java) уже сложно.

znenyegvkby
()

Посмотри в сторону State Machine Framework и Animation Framework. Они ЕМНИП в QtCore и нужны примерно для этого.

KblCb ★★★★★
()
Ответ на: комментарий от CrossFire

1) Наследуем все три класса от одного родителя

Вот поэтому и нужно знать ЯП, а то я увидел только тэги qt и qt5. Не все поддерживают множественное наследование, а мы же не знаем что за этими классами a/b/c дальше висит=)

2) Создаем список (циклически) который будет работать в качестве очереди выполнения

А если нужно остановить процесс в любом месте программы?=) Для каждого действия придется?

Накидываем в нее выполняемых айтемов (по количеству классов)

4) Запускаем цикл выполнения, каждый раз берем очередной объект и вызываем его функцию. Конечно запоминаем номер текущего элемента для восстановления после остановки.

Вот, вот. Я и подумал что ТС изначально и спрашивает как «организовать» эти самые pause/stop/play, ну типа, в С++ он мог бы сделать это через QMutex/lock и QWaitCondition для паузы, В Java с тем же wait, или через Thread'ы, и т.д. и т.п. Ведь проблема, как я понял, была не в организации логики работы?

как и какими способами можно организовать паузу, стоп или продолжить выполнение в процессе?

Хотя, конечно, могу ошибаться=) Давай ТС, проливай свет на эту темную задачу=)

znenyegvkby
()

Разработка происходит на Qt5

Сейчас на примере все объясню.

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

Спасибо

vertinio17
() автор топика
Ответ на: комментарий от KblCb

А ведь действительно

Вообще n - это общее кол-во анимированных процессов

Вот что значит бегло читать=) Похожа ведь постановка на reacts to stimuli, а я почему-то сразу подумал про pause/stop/play для рабочего процесса внутри самого приложения=)

Спасибо за инфу, пойду почитаю про The Animation Framework и The State Machine Framework, мб когда-нибудь придется с Qt столкнуться=)

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Вот поэтому и нужно знать ЯП, а то я увидел только тэги qt и qt5. Не все поддерживают множественное наследование, а мы же не знаем что за этими классами a/b/c дальше висит=)

99% что это С++.

А если нужно остановить процесс в любом месте программы?=) Для каждого действия придется?

Человек явно написал где возможно потребуется останавливаться, это не любое место программы, а совершенно определенные.

ну типа, в С++ он мог бы сделать это через QMutex

Использовать QMutex в пределах одного потока? Сурово.

CrossFire ★★★★★
()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от vertinio17

классов много, они все выполняют операции вычисления необходимые для работы в дальнейшем. Но хочу заметить что для каждого процесса, все действия одинаковые и последовательность ф-й. Разница только во входных данных..

vertinio17
() автор топика
Ответ на: комментарий от CrossFire

нет, программа должна быть многопоточна. Думаю расчеты должны быть в отдельном потоке, а через сигналы отдавать данные в GUI поток и запускать анимацию, иначе будет заморожен GUI поток.

vertinio17
() автор топика
Ответ на: комментарий от CrossFire

Сори, я тут недавно зарегался=)

99% что это С++.

Можете, пожалуйста, объяснить как вы это определяете?=) Или это а-ля интуиция?=) Т.к. абстрактный код в топике подходит аналогично как для Java так и для PHP и C++. Или здесь речь только о частоте применения? (Типа QtC++ используют в 99% и 1% QTJava и QtPHP) Заранее спасибо за объяснения.

Использовать QMutex в однопоточной программе? Сурово.

Опять же, как вы это определяете?=) Или я что-то проспал?=)

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

Или здесь речь только о частоте применения?

Да, Qt под PHP и Java давно закопали, а на Python код не похож.

Опять же, как вы это определяете?

Я сразу поправился, что имел в виду исполнение цикла в одном потоке. Задача написано довольно сумбурно, но ТС явно не указал количество потоков и что где работает, потому не усложняем по KISS.

Сори, я тут недавно зарегался=)

Оно и видно, тут не принято так часто говорить «спасибо» и «извините» в каждом посте, достаточно просто грамотной речи и отсутствия смайликов после каждого предложения.

CrossFire ★★★★★
()
Ответ на: комментарий от vertinio17

нет, программа должна быть многопоточна. Думаю расчеты должны быть в отдельном потоке, а через сигналы отдавать данные в GUI поток и запускать анимацию, иначе будет заморожен GUI поток.

Это понятно, но цикл в примере и вызовы someFunction работают в одном потоке, верно?

CrossFire ★★★★★
()
Ответ на: комментарий от CrossFire

да, но не в GUI. В GUI только анимация и кнопки стоп, пауза и продолжить

Думаю двигаться в сторону The State Machine, Animation Framework

vertinio17
() автор топика
Ответ на: комментарий от vertinio17

да, но не в GUI. В GUI только анимация и кнопки стоп, пауза и продолжить

И какая, собственно, разница? Дело ваше, я задачу понимаю слабо, и может быть TSMAF подойдет лучше, но чем именно не устраивает мой вариант?

CrossFire ★★★★★
()
Ответ на: комментарий от CrossFire

разница есть, если все в одном потоке, то кнопки стоп, пауза, продолжить заморожены. Возможно можно через таймеры решить и через paintEvent

твой варианта в принципе подходит, согласен, но некоторые ф-и с аргументами(усложняется процесс реализации списка и хранения, можно конечно разбить все, сделать общие переменные, и т.п.), в общем думаю еще ...

TSMAF ???

vertinio17
() автор топика
Ответ на: комментарий от vertinio17

разница есть, если все в одном потоке, то кнопки стоп, пауза, продолжить заморожены.

GUI в одном потоке, вычисления в другом, в котором и крутится цикл из примера, не?

TSMAF ???

The State Machine, Animation Framework

CrossFire ★★★★★
()
Ответ на: комментарий от CrossFire

ну да да, ладно проехали! в общем видимо буду пробывать, всем спасибо

vertinio17
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.