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

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

11.03.2020, 10:51. Показов 32487. Ответов 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
24.06.2020, 10:51  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от JeyCi Посмотреть сообщение
постараться справиться с "не отвечает"...
справилась выполнением кода в отдельном потоке по совету GoshaM,
Цитата Сообщение от JeyCi Посмотреть сообщение
правильно обрабатывать event
пока заедает кнопка Exit - для экстренного (по желанию) выхода из вспомогательного потока и закрытия MainAppWindow одновременно... - срабатывает только со 2-го раза (когда работает вспомогательный поток)? если ещё не запустить с др кнопки вспомогательный поток - то с 1-го раза можно выйти из окна Main...
C++
1
2
3
4
void MyAppWindow::Exit() {
        work.ShutdownThreads();     
        Break();
    }
PostCallback? или ProcessEvent()? попробовать обрабатывать?
хотя по новым технология, наверно, с контекстом GuiLock__ разобраться... имхо... - но раз на раз не приходится... ?? может, что-то упустила...
=====
как вариант? -
C++
1
while(!Thread::IsShutdownThreads() && !AtomicRead(stop)) {/*...*/}
вероятно, в сам thread, где выполняется функция, - надо заложить пошаговость этой функции - чтобы на любом из шагов можно было экстренно выйти из thread'a... имхо на долгих операциях...

Добавлено через 19 минут
=====
p.s
вот тоже пока не совсем понятно, по какому event'у обрабатывать закрытие формы по крестику (правый верхний угол окна) - WhenClose?.. (чтобы тоже выйти из вспомогательных потоков)...
ведь всегда при длинных (да ещё многопоточных!) операциях хочется уметь выходить экстренно
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
25.06.2020, 07:57  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
while(!Thread::IsShutdownThreads() && !AtomicRead(stop)) {/*...*/}
в принципе, наверно, излишне, т.к. Patch applied...
да и вобщем и целом:
Mastering MT with Mutex is mandatory before trying to use Atomic operations which is a lot more tricky
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
25.06.2020, 17:57  [ТС]
взяла линки из класса формирования половины линков и отдала в dowloader...
загрузились...
пока через "не отвечает" - но уже хоть какая-то декомпозиция (чтобы не дублировать код)...
пул потоков не за горами ... имхо...
действительно, читабельная архитектура делает разработку приятней

Добавлено через 18 минут
p.s.
на всякий случай - Qt multithreading PDF - там же Implementation of signal-slot: different threads
p.p.s
Beginning Qt
p.p.p.s
Golden Rule of Design
Don't do to others what you don't wish.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
25.06.2020, 20:59
Цитата Сообщение от JeyCi Посмотреть сообщение
на всякий случай - Qt multithreading PDF -
Там плохой пример код. В Qt стоит писать иначе. По крайней мере если мыслить в рамках реальности и актуальной версии Qt.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
26.06.2020, 07:48  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
в рамках реальности
хотя бы в чём отличие от (актуальной) реальности? (если нет примера лучше)

Добавлено через 11 минут
?? а здесь - Multithreading with Qt - что-то много всяких new...

Добавлено через 2 минуты
? или habr Правильная работа с потоками в Qt

Добавлено через 2 минуты
на оф. сайте - очень в общем
или The Missing Article About Qt Multithreading in C++

Добавлено через 2 минуты
и здесь на cyber'e Многопоточность
или Qt/C++ - Урок 047. QThread - создание потоков в Qt
===
сориентируйте хоть в 2х словах (и линком если есть) - что лучше?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.06.2020, 11:06
У Qt отличная документация c примерами туда стоит смотреть в первую очередь. Как учебник есть книги Шлее и Самерфилда.

Цитата Сообщение от JeyCi Посмотреть сообщение
сориентируйте хоть в 2х словах (и линком если есть) - что лучше?
1. Стоит отдавать предпочтение использованию QThread c классами "рабочими" а не наследованию от него.
2. Не нужно пихать bool стоит использовать std::atomic -ки, а на данный момент в QThread уже есть этот флаг для остановки потока isInterruptionRequested()
3. Есть еще модуль QtConcurent он более высоко уровнивый и там уже есть и пул потоков и ф-ции для распределения между потоками задач.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
26.06.2020, 11:36  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
isInterruptionRequested()
3. Есть еще модуль QtConcurent он более высоко уровнивый и там уже есть и пул потоков
вот это кстати да - заметила - пул потоков(!) и конкурентность...
оказывается, и остановить поток можно - замечательно...
спасибо

Добавлено через 15 минут
хотя на habr'e
А теперь, увы, ложка дегтя: хотя разные QQuickWindow чисто теоретически могли бы жить в разных потоках, на практике это требует аккуратной пересылки им сообщений от операционной системы и в Qt сегодня таковая не реализована. В Qt 5.13 к примеру QCoreApplication пытается общаться с QQuickWindow через sendEvent требующий чтобы получатель и посылатель были в одном потоке (вместо postEvent который допускает чтобы потоки были разными). Поэтому на практике QQuickWindow правильно работают только в GUI-потоке и как следствие все QtQuick-объекты живут там же. В результате несмотря на наличие rendering thread практически все доступные пользователю объекты связанные с GUI по-прежнему обитают в одном и том же GUI thread. Возможно это изменится в Qt 6.
но QQuickWindow - это вроде для Android...
(пока пилится на u++ - допилю, потом при случае подумаю о переезде, может и для др проекта)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
26.06.2020, 11:41
Цитата Сообщение от JeyCi Посмотреть сообщение
но QQuickWindow - это вроде для Android...
Это QML т.е. приложения с особым интерфейсом т.е. "современные вырвиглазки"
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
27.06.2020, 09:59  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
пул потоков не за горами ...
-- наверно, как-то так - на U++
-- есть вариант запуска 2х thread'ов параллельно... а ведь интереснее между ними communication сделать??...
p.s.
в общем и целом по тз:
а) систему signal-slot банально заменила своей vba-шной манерой -- передавать флаги (например, об окончании загрузки или её прерывании), и возвращать в WorkerThread true or false, на основе которых WorkerThread возвращает в GUI-поток message (PromptOK or PromptExclamation-connection lost)... пока отлавливаю diconnect'ы сети на всякий случай...
б) всё бы хорошо, когда connection'а нет, но в реале при загрузке сама загрузка останавливается, видимо, плохо родной библиотекой u++ - наверно, ждёт - стучится по url'у несколько раз?, - вобщем подвешивается на некоторое время - неприятно так долго ждать, пока downloader разберётся он подключен или нет...
в) и вывод динамики процесса в Progress пока, как в тумане... не понятно, через что лучше обрабатывать i-тую подгрузку в downloader class'e чтобы отразить обратно транзитом через WorkerThread в Progress GUI потока - через Event или через PostCallback??... (мучают смутные сомнения - что это по сути одно и тоже?? может какой virtual void Event'a - override сделать??)

Добавлено через 26 минут
или инкапсуляция неверно выбрана?..
(класс winapp с методом workerThread И класс downloader(param массив линков))
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.06.2020, 10:03
Думаю стоит забить на U++ Вы с ним слишком долго возитесь.
Я бы советовал переписать под Qt и залить на гит что бы люди могли посмотреть и сказать что не так.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
27.06.2020, 11:26  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
стоит забить на U++
хуже чем vba сейчас не работает... просто некоторые штрихи добавить интересно... и разобраться с новым для меня - многопоточностью...
Цитата Сообщение от Avazart Посмотреть сообщение
Вы с ним слишком долго возитесь.
я ни его, ни многопоточност,и ни с++ вообще не знала - считаю рабочий код создан был быстро... профессионализм в разработке нарабатывается годами... и не в ide дело, полагаю... спросила совета по структуре ООП и логике MT
Цитата Сообщение от Avazart Посмотреть сообщение
залить на гит
этого не будет - в проекте много инфо рабочего порядка... sorry
Цитата Сообщение от Avazart Посмотреть сообщение
Я бы советовал переписать под Qt
не привыкла бросать начатое при первом же вопросе (с U++ ещё не ознакомилась до конца - его лёгкость в обращении с БД и репрезентации мат. моделирования, как его позиционируют, пока привлекают)... если увижу реальные основания - перейду на Qt (пока кстати он больше понравился, чем VS)... имхо
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.06.2020, 11:56
Цитата Сообщение от JeyCi Посмотреть сообщение
не привыкла бросать начатое при первом же вопросе
Это все равно что биться головой об стенку с гордым видом.
Цитата Сообщение от JeyCi Посмотреть сообщение
и не в ide дело,
При чем тут IDE ? Касательно фреймворка то думаю как раз тут в этом дело.
Если долго возитесь в таких случаях стоит попробовать что-то другое.

Добавлено через 3 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
если увижу реальные основания - перейду на Qt
Нормальная поддержка, нормальная документация с примерами и книги, популярность. Этого более чем достаточно.
И как оказалось много поточность. Как по мне если GUI фреймворк не предусматривает синхронизацию GUI с вторичными потоками то это сразу ему огромный минус.
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,475
27.06.2020, 12:09
я конечно не специалист многопоточности, только недавно её начал изучать, но
Цитата Сообщение от JeyCi Посмотреть сообщение
передавать флаги (например, об окончании загрузки или её прерывании)
при её использовании - это крайне хреновый вариант

Цитата Сообщение от JeyCi Посмотреть сообщение
если увижу реальные основания - перейду на Qt (пока кстати он больше понравился, чем VS)
а что за VS, вижуал студия что ли? Тогда причём здесь Qt? Зачем сравнивать библиотеку и среду разработки.

Цитата Сообщение от JeyCi Посмотреть сообщение
я ни его, ни многопоточност,и ни с++ вообще не знала
Я прошу извинить меня за то, что придираюсь к вам, но судя по вашим сообщениям, вы ещё плохо разбираетесь в плюсах. Просто вы часто употребляете различные выражения, вкладывая в них свой смысл, а не деле они означают совершенно другое.

И да на Qt, наверняка, было бы проще все ваши задумки реализовать. Как минимум, по нему есть куча примеров готового кода.

Ну раз уж вы решилили использовать всё-таки использовать U++ - что ж удачи
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
27.06.2020, 12:21  [ТС]
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Я прошу извинить меня за то, что придираюсь к вам, но судя по вашим сообщениям, вы ещё плохо разбираетесь в плюсах.
не извиняю, когда тема скатывается от темы к личностям...
по 2-й части: я о том же - что это не повод менять ide, а повод поднимать мат.часть
по части ваших впечатлений о словарном запасе - здесь их не ждали... пишите своими словами и пишите по делу - будет и пополнение моего словарного запаса... последние несколько постов - сплошные ваши впечатления...
Цитата Сообщение от Avazart Посмотреть сообщение
Это все равно что биться головой об стенку с гордым видом.
впечатляйтесь молча ...
Цитата Сообщение от Avazart Посмотреть сообщение
Нормальная поддержка
я заметила последние несколько постов...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.06.2020, 12:23
Цитата Сообщение от JeyCi Посмотреть сообщение
этого не будет - в проекте много инфо рабочего порядка... sorry
Цитата Сообщение от Recrut_rf Посмотреть сообщение
вы решилили использовать всё-таки использовать U++ - что ж удачи
Скорее не ждите помощи... sorry ....
Особенно если не можете предоставить минимальный пример кода демострирующий проблему.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
27.06.2020, 16:19  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
если не можете предоставить минимальный пример кода демострирующий проблему
вы не хотите видеть кода - пример по линку из #209 подходит для тестирования по вопросу... и отвечать кодом не хотите... вопросы в том же посте - про communication... как и про ООП... и даже дублем пришлось ставить вопрос в #211 и подчёркивать... день убит на ваши "sorry"
Цитата Сообщение от Avazart Посмотреть сообщение
Скорее не ждите помощи...
не тратьте времени...[/COLOR]
спасибо тем, кто тратит время на то, чтобы поделиться знаниями и кодовыми строками

Добавлено через 29 минут
Цитата Сообщение от JeyCi Посмотреть сообщение
пример по линку из #209 подходит для тестирования по вопросу communication between threads
вот идут thread'ы сами по себе:
пример по линку из #209
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <CtrlLib/CtrlLib.h>
 
using namespace Upp;
 
class TestThread : public TopWindow
{
    protected:
        bool stop;
        void buttonCb(void);
        Thread thr1, thr2;
        virtual void thrCb(void);       //<<<<<<<<<<<<<<<<
        virtual void thrPerso(void);        //<<<<<<<<<<<<<<<<
        
        ProgressIndicator progress;
        int32 icounter;
        Button button;
        StatusBar status;
        
        Image ImgCrs;
        
    public:
        typedef TestThread CLASSNAME;
 
        TestThread();
        
    // ......
        void CheckProg() { 
            if(progress < 100) progress++;
            else
            {               
                stop = false;
                OverrideCursor(ImgCrs);
                UpdateRefresh();        
            }
        }
    // ......   
        void CheckCount() {
            if(icounter < 100) icounter++;
            status.Set(IntStr(icounter));
        }
    // ....
};
 
 
void TestThread::thrCb()
{
    for(;!stop;)
    {   
        PostCallback(THISBACK(CheckProg));
        Sleep(100);
    }
}
 
void TestThread::thrPerso()
{
    for(;!stop; )
    {
        PostCallback(THISBACK(CheckCount));
        Sleep(100);
    }
}
 
//...
 
void TestThread::buttonCb(void)
{
    if(stop)
    {
        stop = false;
        button.SetLabel("STOP");
        
        ImgCrs = OverrideCursor(Image::Wait());
        thr1.Run(THISBACK(thrCb));
        thr2.Run(THISBACK(thrPerso));
    }
    else
    {
        OverrideCursor(ImgCrs);
        
        stop = true;
        thr1.Wait();
        button.SetLabel("START");
    }
    
    
}
 
TestThread::TestThread()
{
    SetRect(0, 0, 300, 150);
    Add(button);
    button.TopPos(90, 30).HCenterPos(100);
    button.SetLabel("START");
    Add(progress);
    progress.TopPos(30, 40).HCenterPos(250);
    progress.Set(0, 100);
    icounter = 0;
    AddFrame(status);
    status.Set(" ");
 
    stop = true;
    button <<= THISBACK(buttonCb);
        
}
 
GUI_APP_MAIN
{
    TestThread().Run();
}

а переделать хочу - чтобы по Event'у сдвига Progress'a, например, увеличивался счётчик в Status'e... читаю документацию - надеюсь, пользы будет больше, чем от ваших недовольств количеством community для пререканий с вами
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.06.2020, 16:27
Цитата Сообщение от JeyCi Посмотреть сообщение
день убит на ваши "sorry"
Ну они Ваши, не мои.

Добавлено через 4 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
пример по линку из #209 подходит для тестирования по вопросу.
Нет. Навряд ли кто-то будет ставить себе U++ и разбираться с ним что бы проверить левый код взятый непонятно откуда и непонятно как написанный что бы удовлетворить Ваши хотелки я именно об этом вёл речь.
0
 Аватар для Recrut_rf
389 / 334 / 66
Регистрация: 14.10.2014
Сообщений: 1,475
27.06.2020, 19:14
Цитата Сообщение от JeyCi Посмотреть сообщение
а переделать хочу - чтобы по Event'у сдвига Progress'a, например, увеличивался счётчик в Status'e
В Qt для этого достаточно просто сигналом передать интовый параметр в слот - и счётчик будет увеличиваться. Как это провернуть в U++ - лично я х/з. А советовать что-то без возможности это проверить - уж точно ничего не буду.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
27.06.2020, 21:31  [ТС]
вобщем что и следовало ожидать - криво, грязно, но работает (не претендую пока на чистоту кода - просто логику проследить)
.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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#ifndef _thread_communicate_thread_communicate_h
#define _thread_communicate_thread_communicate_h
 
#include <CtrlLib/CtrlLib.h>
 
using namespace Upp;
 
class myApp : public TopWindow
{
    protected:
    
        int32 icounter;
        Button button;
        StatusBar status;
        ProgressIndicator progress;
        Image ImgCrs;
        
        bool stop;
        Thread thr1, thr2;
        
        void buttonCb(void);
        void thrCb(myApp* pw);
                
    public:
        typedef myApp CLASSNAME;
 
        myApp();
        ~myApp();       //не было деструктора
        
        volatile Atomic terminated;
        volatile Atomic threads;
        
        void CheckProg();   
        void CheckCount();
};
 
#endif

.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "thread_communicate.h"
 
#include <CtrlLib/CtrlLib.h>
 
using namespace Upp;
 
// Constructor
myApp::myApp()
{
    SetRect(0, 0, 300, 150);
    Add(button);
    button.TopPos(90, 30).HCenterPos(100);
    button.SetLabel("START");
    Add(progress);
    progress.TopPos(30, 40).HCenterPos(250);
    progress.Set(0, 10);
    icounter = 0;
    AddFrame(status);
    status.Set("0");
 
    stop = true;
    //button <<= THISBACK(buttonCb);    
    button << [=] { buttonCb(); };
    terminated = 0;
    
    //progress.WhenAction = [&]{if(icounter < 10) icounter++;
    //      status.Set(IntStr(icounter));}  ;       //(CheckCount); // Events should be defined in Constructor
        
}
 
// Destructor
myApp::~myApp()
{
    terminated = 1;
    ShutdownThreads();
}
 
// button callback - in main GUI thread
void myApp::buttonCb(void)
{
    if(stop)
    {
        stop = false;
        button.SetLabel("STOP");
        
        ImgCrs = OverrideCursor(Image::Wait());
        
        AtomicInc(threads);
        //thr1.Run(THISBACK1(thrCb, TestThread* pt ));
        //thr2.Run(THISBACK(thrPerso));
        thr1.Run ( [=]{thrCb (this);} );
    }
    else
    {
        OverrideCursor(ImgCrs);
        
        stop = true;
        thr1.Wait();
        button.SetLabel("START");
    }
    
    
}
 
// fx from button - creating secondary thread
void myApp::thrCb(myApp* pw)
{
    for(;!stop;)
    {   
        PostCallback(THISBACK(CheckProg));          
 
        Sleep(100);
    }
}
 
//progress
        void myApp::CheckProg() { 
            if(progress < 10) {
                progress++;
                Call([=]{CheckCount ( );});     // this 
            }
            else
            {               
                stop = false;
                OverrideCursor(ImgCrs);
                UpdateRefresh();
                icounter++;             
            }
        }
//status    
        void myApp::CheckCount() {
            if(icounter < 10) icounter++;
            status.Set(IntStr(icounter));
        }
 
 
GUI_APP_MAIN
{
    myApp().Run();
}

- надо просто запускать не параллельно, а др. из др. и Call для обращения к GUI
static void Call(Function<void ()> cb)
Executes a callback in the main thread (the one responsible for GUI). It works by posting callback into timer queue (with zero delay), then waits its completion using Semaphore. Main GUI thread has to run timer queue management for callback to be executed (by running event-loop (TopWindow::Run) or ProcessEvents). Warning: Call temporarily unlocks GuiLock (if locked) so that the main thread can run on GUI, this is possible source of race-conditions (GuiLock is relocked after call completes). Be prepared that some other code can run on GUI between call to Call and cb being executed!
но GuiLock'и ещё нигде не использовала - надо подумать, может ли где просочиться... и причесать код...
=====
C++
1
2
    progress.WhenAction = [&]{if(icounter < 10) icounter++;
            status.Set(IntStr(icounter));}  ;
удивил - запускал icounter++ циклом в status после того, как окончит весь action сам progress... возможно, что-то упустила... но хоть какой-то результат...

Добавлено через 1 минуту
=====
Цитата Сообщение от Avazart Посмотреть сообщение
Навряд ли кто-то будет ставить себе U++
там ставить нечего - просто unzip сделать... не убеждаю, предупреждаю посетителей ветки и тех, кого заинтересует

Добавлено через 16 минут
P.S.
ProcessEvent'ов для мышей и клавиш... остальные события в библиотеке ctrl...
Коллбэки на ЭУ можно и лямбдами делать... не доказано, что коллбэки хуже сигнально-слотовой системы... возможно, их просто надо научиться использовать... имхо
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.06.2020, 23:10
C++
1
volatile Atomic terminated;
Что такое Atomic ?

Добавлено через 2 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
ProcessEvent'ов для мышей и клавиш... остальные события в библиотеке ctrl...
Коллбэки на ЭУ можно и лямбдами делать... не доказано, что коллбэки хуже сигнально-слотовой системы... возможно, их просто надо научиться использовать... имхо
Главное убедится что колбеки вызываются в основном потоке, а не вторичных когда это нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.06.2020, 23:10

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
220
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru