Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/131: Рейтинг темы: голосов - 131, средняя оценка - 4.52
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549

Архитектура: парсинг и выгрузка текстовиков

11.03.2020, 10:51. Показов 32447. Ответов 421

Студворк — интернет-сервис помощи студентам
начало было положено в ветке - Считать текстовые файлы из папки - там и возник вопрос об Архитектуре...
Цитата Сообщение от JeyCi Посмотреть сообщение
так и не собрала эти все объекты этого класса в group class...
вроде уже собрала...
осталось отображение создать (типа I_tbl_Show) и пронаследовать ? в разные классы пункта назначения (или на консоль, или в файл, или в БД, или допустим ещё в форму)... N.B. классы (пункты-назначения) делать не надо - эти View уже реализованы разработчиками того ПО, на котором сейчас идёт работа...
а) пока что можно просто прописать функции-члены класса; и по месту использовать, что надо при разработке - в файл или на консоль;
б) в перспективе для Release - реализовать и откомпилировать и выгрузку и в файл, и выгрузку в БД, и отражение в DataGrid...
===
!! Т.Е. если в Release захочется и выгрузку в текст, и в БД, и допустим ещё в форму (например с разных кнопок сделать) - тут уж лучше и писать, как положено, наследование??... -- к слову из прошлой ветки о:
Цитата Сообщение от JeyCi Посмотреть сообщение
полагаю тут Наследования никакого не пригодится?
... или как раз тут (при выборе направления выгрузки) его (наследование) делать??
===
Обоснование выбора уровня Абстракции (I_tbl_Show со всеми виртуальными функциями):
чтобы не дублировать код-сбора-для-выгрузки -- сделать class Table - и класс-интерфейс I_tbl_Show, в котором обозначить virtual-функции выгрузки... эти функции определить в др. классах - типа Interface (IwriteCSV, IwriteDB, IwriteDataGrid)...
p.s.
классы консоль, файл, бд, DataGrid - не создаём, т.к. эти пункты назначения уже присутствуют...
p.p.s.
вывести конечные интерфейсы с определёнными методами записи на кнопки...
===
ИЛИ то, что подчёркнуто чуть выше, стоит реализовать в одном классе Table, и здесь же задать все virtual функции ??
===
на скрине: синие - классы, зелёные - интерфейсы (в с++ по сути тоже классы)
птицами отмечены уже кое-как реализованные классы (2 птицы)
курсивные стрелки - отсутствие наследования


Добавлено через 7 минут
вобщем вопрос:
class Table и класс I_Tbl_Show - объединить или нет?

Добавлено через 10 минут
p.p.s.
чтобы избежать проблем Ромба и такого:
Неоднозначность при множественном наследовании
Цитата Сообщение от DrOffset Посмотреть сообщение
Тут нужно виртуальное наследование.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.03.2020, 10:51
Ответы с готовыми решениями:

Проверка двух текстовиков
Написать прогу на языке Си, проверяющую, совпадают ли тексты в двух файлах #include <stdio.h> #include <stdlib.h> ...

Access модуль объединения текстовиков
Добрый день. Очень нужен модуль access который будет объединять текстовые файлы с предложенной папки (каждый раз разные названия и...

Сделать скрипт для вывода текстов из текстовиков
Здравствуйте! Не могли бы помочь сделать скрипт для вывода текстов песен из текстовиков в папке. Расскажу подробней: есть папка с...

421
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 20:40  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
Вы в код посмотрите
я дописывала предыдущий свой пост - ваш код вклинился пока я линк искала... - показать, что они в U++ имеют ввиду под GuiLock...
ваш код посмотрела - спасибо - но status почему-то ничего не показывает...??
компилируется ок в 13664
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 20:47
Короче говоря из кода понятно что тот кто писал не понимает что делает.

Добавлено через 4 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
ваш код посмотрела - спасибо - но status почему-то ничего не показывает...??
По тому что я банально не задействовал его.
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
29.06.2020, 20:49
Цитата Сообщение от JeyCi Посмотреть сообщение
выдаёт assertion failed in CoWork.cpp (line 64) - (!IsWorker) - отсюда:
Увидел, когда на MinGW переключился. Попробую разобраться.
Цитата Сообщение от Avazart Посмотреть сообщение
Да все. Не нужны там мютексы так как есть атомики. И блокировки неправильно используются.
Конкретно какие строчки вас не устраивают. Я вам любую объясню.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 20:50
Цитата Сообщение от GoshaM Посмотреть сообщение
Конкретно какие строчки вас не устраивают. Я вам любую объясню.
Ок если конкретно - все, не люблю гавнокод. Так дохочивее?
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 20:56  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
По тому что я банально не задействовал его.
ну можно, конечно, в вашем коде
C++
1
2
3
4
5
6
7
8
9
10
    for(int i=0; i<=100 &&  !isInterruptionRequested; i+=10)
    {   
        { // Синхронизация для обновления гуи
          GuiLock lockGuard;
          progress.Set(i);
          status.Set(i);   //<<<<<<<<<<<
        } // выход из синхронизации, блокировка снимается с разрушением lockGuard.
        
        Sleep(1000); // тут полезная работа 
    }
но что это меняет по отношению к коду от GoshaM - он замутил ThreadPool силами U++ и отразил как потоки в статусе принтуют i-ый (кстати видно, что не по порядку, как и положено для threadPool'a - кто раньше выскочит)... и плавно плывущий progress... правда в v.11863 видно...
ну понятно же, что сравнивать ваш код и его код - бессмысленно... - ваш не выполняет тот функционал, на который посягнулся он...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 20:59
C++
1
2
3
4
5
6
7
8
9
10
11
void Worker::Start ( StatusBar* pstatus,  ProgressIndicator* pprogress )
{
    m_pstatus = pstatus;
    m_pprogress = pprogress;
 
    Mutex::Lock __ ( mtx );
    manstop = 0;
    /* тут нужно снять блокировку, зачем медлить?  */
 
    m_thread.Run ( [=]{this->Work();} );
};
И вообще зачем блокировать то что и так в основном потоке, а поток еще не запущен?

Добавлено через 58 секунд
Цитата Сообщение от JeyCi Посмотреть сообщение
ну можно, конечно. в вашем коде
Да конечно можно.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 21:03  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
И вообще зачем блокировать то что и так в основном потоке, а поток еще не запущен?
и это единственный повод для оскорблений кода?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 21:06
Цитата Сообщение от JeyCi Посмотреть сообщение
ну понятно же, что сравнивать ваш код и его код - бессмысленно... - ваш не выполняет тот функционал, на который посягнулся он...
Возможно тут Вы правы. Но мне не понятно зачем там пул потоков для инкремента одной переменной это само собой абсурдно.

Добавлено через 2 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
и это единственный повод для оскорблений кода?
Использование мютекса когда есть атомики? Но я повторяюсь.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 21:07  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
зачем там пул потоков для инкремента одной переменной
там будет считывание json'ов или из файлов, или из request'ов на сайт... инкремент на вектор линков (или пути файлов)... возможно WorkQueue придётся делать с Семафором (если сайт не пропустит сразу все requests)...
а вообще - просто познавательно
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 21:11
Цитата Сообщение от JeyCi Посмотреть сообщение
там будет считывание json'ов или из файлов, или из request'ов на сайт
Ну это более сложный вопрос.
Вам скорее всего нужна потокобезопасная очередь из которой потоки будут брать исходные данные.

Добавлено через 2 минуты
И вопрос что выводить в GUI ибо от этого будет зависить как можно синхронизировать с GUI
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 21:12  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Использование мютекса когда есть атомики?
тоже познавательно - увидеть все возможности Фреймворка...
но ваше замечанию приму на заметку - зачем же оскорблять код, на котором столько нового...
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
29.06.2020, 21:14
Цитата Сообщение от Avazart Посмотреть сообщение
И вообще зачем блокировать то что и так в основном потоке, а поток еще не запущен?
Потому, что в проекте потенциально могут появится другие потоки. Поэтому если переменную блокирую, то блокирую везде, чтобы потом не искать, что где-то она не заблокирована.
Цитата Сообщение от Avazart Посмотреть сообщение
/* тут нужно снять блокировку, зачем медлить?  */
И на что это повлияло?
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 21:15  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
что выводить в GUI
да ничего туда не надо выводить - только Финиш считывания/подгрузки... ну и progress - чтобы видеть процесс...
из файлов - историю,
из сети - реал-тайм (иногда изменения в структуре бывают, поэтому тупо текстовики тоже храню, чтобы парсинг вовремя менять, если приходится)...
а вообще цель направлять это в БД - ПОСТ #1 этой ветки (просто на жёлтом облаке пока застопорилась с многопоточностью)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 21:19
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
else
        {
            /*Ожидаем завершения пула потоков
            проверяя каждые четвертьсекунды*/
 
            if ( cw.IsFinished() )
            {
                GuiLock __;
                m_pstatus->Set ( "Выполнено" );
                on = false;
            }
 
            else
                Sleep ( 250 );
        }
Этот цикл с Sleep ( 250 ); тоже не очень хорошее решение стоит поискать какой-то вариант с wait -методом или кондишеном.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 21:23  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Вам скорее всего нужна потокобезопасная очередь из которой потоки будут брать исходные данные.
тоже думаю об этом... oleg-m1973 уже предупреждал...
есть примеры в U++ (bazaar) - не всё компилируется comme ils faut - возможно, тоже связано с компилятором MINGW?!
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
29.06.2020, 21:23
Цитата Сообщение от Avazart Посмотреть сообщение
Этот цикл с Sleep ( 250 ); тоже не очень хорошее решение стоит поискать какой-то вариант с wait -методом или кондишеном.
wait метод конечно есть, но поток остановиться, как же отработать отмену.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 21:25
Да поэтому скорее всего нужно второе т.е. ConditionVariable.

Не по теме:

Но под виной я такие вещи делал обычно через WaitForMultiplyObjects и CreateEvent

0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
29.06.2020, 21:31  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Но под виной
там ведь даже 1 поток можно на queue сделать? - с несколькими fibers!... вроде по скорости можно выиграть?...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.06.2020, 21:38
GoshaM, Хотя нет. Если засунуть в WorkP проверку флага отмены то можно wait() вызывать это проще и лучше.

Добавлено через 4 минуты
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
void Worker::WorkP ( String filename )
{
    /*Этот код выполняется параллельно*/
        
    /*Выполняется какая-то
    длительная обработка*/
    Sleep ( Random() % 2000 );
 
    if(isInterruptionRequested) // точка для отмены.
        return;
 
    // еще какая то обработка
    Sleep ( Random() % 2000 );
 
    if(isInterruptionRequested) // точка для отмены.
        return;
 
 
    /*Результат передается в GUI*/
    GuiLock __;
    m_pstatus->Set ( filename );
    m_pprogress->Set ( AtomicInc ( m_pos ) );
 
};
Добавлено через 1 минуту
Цитата Сообщение от JeyCi Посмотреть сообщение
там ведь даже 1 поток можно на queue сделать? - с несколькими fibers!... вроде по скорости можно выиграть?...
Если фрейморк для работы интернетом асинхронный и чтение из файлов тоже то да в теории...
Но сложнее.
1
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
29.06.2020, 22:19
Цитата Сообщение от Avazart Посмотреть сообщение
GoshaM, Хотя нет. Если засунуть в WorkP проверку флага отмены то можно wait() вызывать это проще и лучше.
Я не потоки закрываю, а задания стоящие в очереди отменяю, а у вас потоки будут запускаться и отменяться вряд ли это проще и лучше, к тому же будут возникать некие трения между потоками за счет обращения к одной переменной. И к тому я ставил цель не использовать std, обойтись средствами U++, можно безопасно проверить CoWork::IsCanceled(). Но опять же цель стояла не текущие потоки отменить.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.06.2020, 22:19

В указанном dsn архитектура драйвера и архитектура приложения не соответствуют друг другу
Добрый день. При запуске программы выскакивает вот такая вот ошибка. В чем может быть проблема и как ее исправить?

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

Ошибка "в указанном dsn архитектура драйвера и архитектура приложения"
Вот такая ошибка при нажатии на кнопку &quot;Проверить соединение&quot; Я прочитал, что это возможно из за того, что моя система 64, а...

Архитектура бд
Я начинающий php-разраб. Пишу свой проект для своего города. Но встал вопрос о архитектуре. Пользователь создает свою страницу с...

Архитектура БД
Доброго времени суток.Задание написать АИС Учёт абонентов телефонной сети предприятия. Краткое описание предметной области: В состав...


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

Или воспользуйтесь поиском по форуму:
260
Ответ Создать тему
Новые блоги и статьи
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru