LINUX.ORG.RU

Моделирование с использованием Qt

 ,


0

3

Возникла у меня необходимость написать переносимую программу под линукс. Выбор пал на C++ и Qt, так как мне уже приходилось с ними работать. Но беда в том, что я не программист и не знаю как подойти к решению следующей задачи.

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

Проблема в том, что процесс обработки данных довольно сложен: множество алгоритмов, которые выполняются с разными тактами (например алгоритм, который выполняется раз в 4 такта); присутствуют алгоритмы время работы которых заранее не известно (например включение/выключение обратной связи); сами алгоритмы обмениваются промежуточными результатами между собой; данные на выходе появляются неравномерно (за разное количество тактов); и тому подобное.

Так вот, как написать такое на C++?

Тебе в Job надо. Договоришься с тем, у кого есть свободное время и напишут тебе софт, а ты денежку заплатишь и все будут довольны. На вопрос:

Так вот, как написать такое на C++?

Могу дать очень простой ответ - взять и написать. Только сначала подумай, разбей всё на подзадачи, обдумай их взаимодействие и пиши. Начни с реализации самого тактового генератора, может сигналы из Qt тебе помогут в этом. Думай, как это сделать по ситуации, ибо полного ТЗ я не увидел.

peregrine ★★★★★
()

Возникла у меня необходимость написать переносимую программу под линукс.

Так переносимую или только под Linux? Или здесь вообще имеется в виду вендовый смысл переносимости (таскать настройки с собой)?

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

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

m0rph ★★★★★
()

сесть и написать. что за вопрос? сначала пишешь прототип на какмо-нибудь скриптовом языки, а затем переписываешь на кресты.

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

может сигналы из Qt тебе помогут в этом

Вот ради них и Qevent я и выбрал Qt, а не голые плюсы.

Начни с реализации самого тактового генератора

Я думаю сделать так: все алгоритмы выполнить в виде объектов. Тактовый генератор, алгоритмы IO - тоже. Тактовый генератор выдает событие (новый такт) и все объекты его принимают и выполняют свою работу, после чего сообщают генератору о готовности. Когда генератор получает сообщения о готовности от всех объектов, он выдает новый такт.

Идея здравая?

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

Так переносимую или только под Linux? Или здесь вообще имеется в виду вендовый смысл переносимости (таскать настройки с собой)?

И под Linux, и под оффтопик.

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

А вот ещё - обмен информацией между объектами, количество этих объектов и т.д. там большие или маленькие?

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

Смотря в чем заключена задача - эмуляции работы устройства или выполнения алгоритмов

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

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

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

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

Я к тому, что бы скорость работы Qt сигналов не стала узким местом в скорости работы. Т.е. рекомендовал бы сделать это так, что бы можно было малой кровью изменить механизм синхронизации.

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

Обмен данными между объектами должен работать так:

Объект хочет несколько переменных double. Если они все у него на входе есть, то он их обрабатывает за этот такт, затем сообщает генератору что он готов к следующему такту. Если чего-то не хватает, он выдает в вывод нули и также сообщает генератору о готовности.

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

Ну всего тактов работы немного - не более 10000. Вычисления не очень ресурсоемкие. Из того, что я знаю про сигналы в Qt, их скорости хватит за глаза.

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

Если не нужны GUI, и логика не слишком сложная (а значит, потом править/поддерживать не нужно), то бери питон.

global_fs_counter = 1
def read_data():
    global global_fs_counter
    global_fs_counter += 1

    if global_fs_counter < 20:
        return "line from file " + str(global_fs_counter)
    else:
        return None

def algo1(s): return "algo 1 "

def algo2(s): return "algo 2 "

def algo3(s): return "algo 3 "

def main():
    print("Start")
    # Tick => algo
    algos = [
        (1, algo1),
        (3, algo2),
        (5, algo3)]

    tick = 1

    data = read_data()

    while data != None:
        for algo_tick, algo in algos:
            if tick % algo_tick == 0:
                result = algo(data)
                print("tick=%02d; %s" % (tick, result))

        tick += 1
        data = read_data()

    print("Done")

if __name__ == '__main__':
    main()

Результат:

Start
tick=01; algo 1 
tick=02; algo 1 
tick=03; algo 1 
tick=03; algo 2 
tick=04; algo 1 
tick=05; algo 1 
tick=05; algo 3 
tick=06; algo 1 
tick=06; algo 2 
tick=07; algo 1 
tick=08; algo 1 
tick=09; algo 1 
tick=09; algo 2 
tick=10; algo 1 
tick=10; algo 3 
tick=11; algo 1 
tick=12; algo 1 
tick=12; algo 2 
tick=13; algo 1 
tick=14; algo 1 
tick=15; algo 1 
tick=15; algo 2 
tick=15; algo 3 
tick=16; algo 1 
tick=17; algo 1 
tick=18; algo 1 
tick=18; algo 2 
Done

А если хочется простого деплоя, то посмотри в сторону Golang.

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

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

ТЗ на программу нет. Есть прибор. И в программе я моделирую лишь небольшую его часть, чтобы можно было покрутить коэффициенты и посмотреть на результаты работы в «тепличных условиях». Вот и вся ее задача.

Какая дополнительная информация вам нужна?

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

бери питон

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

не нравится вот такой вот лобовой генератор в цикле, а хочется асинхронности

логика не слишком сложная (а значит, потом править/поддерживать не нужно)

Асинхронность нужна, так как необходимо удобство работы с блоками алгоритмов: включать/отключать отдельные алгоритмы (например нужно часто переключать обратную связь, которая включает в себя сразу несколько отдельных алгоритмов), менять внутренние параметры и т.д.

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

Ууу, так это еще и нефиговый такой UI получается, вряд ли люди будут в консоли задавать «Вырубите мне эту связь, включите вон ту.»

Вообще, это все-таки велосипед получается, очень похожий на Matlab Simulink. Лично я его не осилил, но по описанию очень похоже. Можно его попробовать (если нужна будет лицензия, можно студенческие версии прикинуть, там сравнительно доступный core + отдельные модули, в т.ч. и Simulink).

Или взять аналог, Scilab, и тамошний модуль Scicos. Его внутренности/возможности я тоже не знаю, но взглянуть стоит. http://www.scicos.org/

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

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

Если бы не это, то я бы посоветовал питон и, быть может, SimPy. Если ты не программист, то намаешься еще с этими плюсами. Не стоит оно того. Тут главное, как я понял, получить работающую модель некой вашей системы, а для этого довольно простой в использовании питон был бы куда сподручнее.

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