Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485

Приложение Qt Quick: "Программа неожиданно завершилась"

13.12.2014, 05:39. Показов 1505. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Столкнулся с проблемой при запуске приложения с большим количеством объектов
Вот вся форма:
Кликните здесь для просмотра всего текста
JavaScript
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
import QtQuick 2.3
import QtQuick.Window 2.2
 
Window {
    visible: true
    width: 640
    height: 480
 
    property int cs: mapArea.width/16
    property int mapWidth: 300
    property int mapHeight: 300
 
    Flickable {
        id: mapArea
        width: parent.width - leftPanel.width
        height: parent.height
        x: leftPanel.width
 
        contentWidth: map.width
        contentHeight: map.height
 
        Rectangle {
            id: map
            width: mapWidth * cs
            height: mapHeight * cs
 
            Row {
                Repeater {
                    model: mapWidth
 
                    Column {
                        property int i: index
                        id: row
 
                        Repeater {
                            model: mapHeight
 
                            Rectangle {
                                width: cs
                                height: cs
 
                                Rectangle {
                                    id: cell
                                    anchors.fill:parent
                                    color: "transparent"
                                    border.width: 1
                                    border.color: "#11000000"
                                }
                            }
                        } // Repeater
                    } // Column: row
                } // Repeater
            } // Row
        } // Rectangle: map
    } // Flickable
 
    Rectangle {
        id: leftPanel
        width: parent.width/4
        height: parent.height
        color: "grey"
    }
}


Смысл такой: создать "карту" в клеточку с количеством клеток, равным (mapWidth x mapHeight). В моем примере количество клеток равно 300х300 и он не запускается если количество клеток изменить на меньшее, скажем на 200х200, то приложение запускается и отжирает очень много памяти - почти 400мб
У меня есть такие подозрения, что я неправильно создаю это поле в клетку =) Может нужно другие компоненты использовать? Подскажите

п.с. В этих клетках вместо Rectangle:cell в дальнейшем будет компонент Image, а он ведь еще больше памяти сожрет
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.12.2014, 05:39
Ответы с готовыми решениями:

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

Программа неожиданно завершилась
Здравствуйте, уважаемые гуру! Помогите новичку=) Есть блок кода: void Quad::FavoritesSave() { QString key; QSettings...

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

10
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
15.12.2014, 09:35  [ТС]
В общем сделал мега-костыль который загружает нужный "кусок" из модели в зависимости от отображаемой части на экране. Потребление памяти, как и следовало ожидать, упало в разы Сейчас приложение съедает примерно 20 Мб!

Как я и писал выше - я делаю игровую карту, которую можно двигать свапом. Карта большая - 200х200 клеток, из-за чего приложение съедает кучу памяти если загружать ее целиком. Чтобы загружать только нужный участок карты я сделал такой костылёк:

main.qml:
Кликните здесь для просмотра всего текста

C++ (Qt)
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
Item {
    // это видимая часть карты - т.е. видимое игровое поле
    id: gameArea
    width: 300
    height: 200
 
    LevelModel {
        // это "модель" карты, тут и загружается массив в котором прописаны текстуры
        // cs - размер игровой клетки, у меня он равен 48 пикселей
        //
        // levelWidth - это фактическая ширина игрового поля, которая находится по формуле
        // ШИРИНА_КАРТЫ * РАЗМЕР_КЛЕТКИ
        //
        // levelHeight - тоже самое для высоты
      
        id: levelMap
        width: levelWidth * cs 
        height: levelHeight * cs
 
        x: gMap.x
        y: gMap.y
    }
 
    Item {
        // это игровая модель карты
        // тут у меня будут расположены различные игровые объекты которые "живут" в игровом мире :)
        //
        // по сути, можно обойтись и без этого блока. Тогда в MouseArea, который ниже, нужно будет двигать
        // не этот блок, а блок, который выше, т.е. levelMap
      
        id: gMap
        width: levelMap.levelWidth * cs
        height: levelMap.levelHeight * cs
        clip: true
 
        // добавил анимацию для плавности движения карты
        Behavior on x { NumberAnimation { duration: 200; } }
        Behavior on y { NumberAnimation { duration: 200; } }
 
        /* дальше тут много всяких компонентов, к теме не относится :-) */
    }
 
    MouseArea {
        // и наконец сам "двигатель" карты
        id: ma
        anchors.fill: parent
 
        property int startX
        property int startY
        property int startMapX
        property int startMapY
        property int cX
        property int cY
 
        onPressed: {
            startX = mouseX
            startY = mouseY
            startMapX = gMap.x
            startMapY = gMap.y
            cX = 0
            cY = 0
        }
 
        onMouseXChanged: {
            cX = startX - mouseX
            var cx = startMapX - cX*2 // умножаем на 2 чтобы двгаться быстрее
                
            // проверяем границы карты сверху и и снизу
            if(cx > 0)
                cx = 0
            else if(cx < -(gMap.width - gameArea.width))
                cx = -(gMap.width - gameArea.width)
                
            gMap.x = cx
        }
 
        onMouseYChanged: {
            cY = startY - mouseY
            var cy = startMapY - cY*2
            
            // проверяем границы карты слева и справа
            if(cy > 0) 
                cy = 0
            else if(cy < -(gMap.height - gameArea.height))
                cy = -(gMap.height - gameArea.height)
                
            gMap.y = cy
        }
    } // MouseArea: ma
}


LevelModel.qml:
Кликните здесь для просмотра всего текста
C++ (Qt)
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
import QtQuick 2.3
import "qrc:/levels/level_1/1.js" as L
// в 1.js прописаны параметры уровня
// lW - ширина В КЛЕТКАХ
// lH - высота В КЛЕТКАХ
// data - одномерный числовой массив в котором прописано
// для какой клетки какая текстура должна быть загружена
 
Item {
    id: levelMap
 
    property var levelTextureData: L.data
    property int levelWidth: L.lW
    property int levelHeight: L.lH
    clip: true
 
    // эти две переменные нужны для пересчета "видимой" области карты
    property int chX: 0 
    property int chY: 0
 
    onXChanged: {
        // считаем на сколько игровых клеток произошел сдвиг вправо 
        chX = parseInt(x/cs) * -1
        
        // как только levelMap сдвинулся вправо или влево на одну игровую клетку,
        // отображаемая сетка меняет свою позицию по X на количество "невидимых" клеток слева - chX
        fItem.x = chX * cs
    }
 
    onYChanged: {
        // тоже самое для сдвига вверх
        chY = parseInt(y/cs) * -1
        
        // как только levelMap сдвинулся вверх или вниз на одну игровую клетку,
        // отображаемая сетка меняет свою позицию по Y на количество "невидимых" клеток сверху - chY
        fItem.y = chY * cs
    }
 
    
    Item {
        // и, наконец, самое главное - динамический компонент, который меняет свою позицию на игровом поле,
        // а так же загружает нужный кусок модели
        // его ширина и высота должы быть такими же как у видимой части игрового поля
        id: fItem
        width: gameArea.width 
        height: gameArea.height
 
        Column {
            clip: true
            
            Repeater {
                clip: true
                model: (fItem.height / cs) + 1 // добавляем единицу - если убрать, то можно будет видеть как загружается модель справа
                
                Row {
                    property int i: index
                    id: row
                    clip: true
 
                    Repeater {
                        clip: true
                        model: (fItem.width / cs) + 1
 
                        Rectangle {
                            clip: true
                            width: cs
                            height: cs
 
                            Image  {
                               width: cs
                               height: cs
                               source: "qrc:///textures/textures/t1000.png"
                            }
 
                            Image {
                                width: cs
                                height: cs
                                source: {
                                    // по этой формуле считаем что загрузить из модели
                                    // index - текущий номер колонки (нигде не объявлен, доступен из Repeater)
                                    // row.i - тот же индекс, только для текущего номера строки
                                    var mIndex = index + chX + (row.i + chY) * levelWidth
                                    
                                    // загружаем и радуемся! :)
                                    var src = levelTextureData[mIndex]
                                    if(src == undefined)
                                        return ""
                                    return "qrc:///textures/textures/t%1.png" .arg(src)
                                }
                            }
 
                            Rectangle {
                                anchors.fill:parent
                                color: "transparent"
                                border.width: 1
                                border.color: "#11000000"
                            }
                        } // Rectangle
                    } // Repeater
                } // Row
            } // Repeater
        } // Column
    } // Item
}
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
15.12.2014, 11:10
Цитата Сообщение от WxMaper Посмотреть сообщение
В общем сделал мега-костыль который загружает нужный "кусок" из модели в зависимости от отображаемой части на экране.
Все так делают.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
15.12.2014, 11:27  [ТС]
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Все так делают.
Я думал для этого есть готовый компонент! Либо какое-то свойство у Flickable{}...
ListView же есть, он всё сам делает. GridView тоже, но он может пролистываться только либо вертикально, либо горизонтально - из-за этого и он не подошел (
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
15.12.2014, 11:55
А можно вообще свой тип создать с OpenGL/ES.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
15.12.2014, 13:24  [ТС]
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
А можно вообще свой тип создать с OpenGL/ES.
у меня пока слишком низок скилл программирования для того чтобы лезть в OGL =) и, наверное, обладая такими знаниями не будет смысла использовать qml для игростроения
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
15.12.2014, 21:59
Можно это сделать и при помощи QPainter.
1
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
24.12.2014, 05:50  [ТС]
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Можно это сделать и при помощи QPainter.
Эх, похоже что рисование графики через репиторы QML - самое ужасное что можно было придумать. Картинка все равно заметно притормаживает при движении ((
Попробовал через QPAinter получать нужное изображение и выводить его в Image через провайдера, стало еще хуже - в момент перерисовки видимой части картинки ощущается сильный лаг. Что-то я все-таки делаю не так... ;(

Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
Image {
    source: "image://bfaemap/%1,%2,%3,%4,%5,%6,%7" .arg(x)
                                                                    .arg(y)
                                                                    .arg(width)
                                                                    .arg(height)
                                                                    .arg(mapWidth)
                                                                    .arg(mapHeight)
                                                                    .arg(cs)
}
C++ (Qt)
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
class MapProvider : public QQuickImageProvider
{
// ...
}
 
QPixmap MapProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
{
    QStringList data;
    QString texture;
    QJsonArray cellTextures; 
 
    int x; // положение видимой части карты на поле
    int y;
    int width; // размер видимой части в пикселях
    int height;
    int mapWidth; // размер карты в клетках
    int mapHeight;
    int cs; // размер клетки
 
    data = id.split(",");
    x = data.at(0).toInt();
    y = data.at(1).toInt();
    width = data.at(2).toInt();
    height = data.at(3).toInt();
    mapWidth = data.at(4).toInt();
    mapHeight = data.at(5).toInt();
    cs = data.at(6).toInt();
 
    int chX = qFloor(x/cs); // количество клеток на которое сместилась карта
    int chY = qFloor(y/cs);
 
    QPixmap pixmap(width, height);
    pixmap.fill(Qt::white);
 
    QPainter *paint = new QPainter(&pixmap);
 
    for(int row = 0; row < (height / cs) + 1; row++)
    {
        for(int col = 0; col < (width / cs) + 1; col++)
        {
            // заполняю всю карту "начальным" тайлом
            paint->drawImage(col * cs, row * cs, QImage(":/textures/1.png").scaled(cs, cs));
 
            int index = col + chX + (row + chY) * mapWidth;
 
            // карта - json-объект загруженный из файла 
            // этот код в конструкторе:
            //
            // jsonDocument = QJsonDocument::fromJson(mapDataStr.toUtf8());
            // jsonObject = jsonDocument.object();
            // QJsonArray mapData = jsonObject.value("data").toArray();
 
            cellTextures = mapData.at(index).toArray();
 
            // на одну клетку может быть наложено несколько тайлов
            for(int i = 0; i < cellTextures.count(); i++)
            {
                texture = QString::number(cellTextures.at(i).toInt());
                if(texture == "0")
                    texture = "1";
 
                paint->drawImage(col * cs, row * cs, QImage(":/textures/" + texture + ".png").scaled(cs, cs));
            }
        }
    }
 
    delete paint;
    return pixmap;
}


Добавлено через 28 минут
Тьфу... оказывается весь лаг таился в загрузке картинки из ресурсов. Большая часть карты состоит из двух тайлов - под номерами 1 и 2000. Вынес их загрузку в конструктор и лаг практически исчез, дает о себе знать только в тех местах, где видно другие тайлы. В общем код стал таким:
Кликните здесь для просмотра всего текста
C++ (Qt)
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
class MapProvider : public QQuickImageProvider
{
public:
    MapProvider()
        : QQuickImageProvider(QQuickImageProvider::Pixmap)
    {
        level = "level1";
 
        QFile file;
        file.setFileName(":/levels/" + level +".json");
        file.open(QIODevice::ReadOnly | QIODevice::Text);
        levelDataStr = file.readAll();
        file.close();
 
        jsonDocument = QJsonDocument::fromJson(levelDataStr.toUtf8());
        jsonObject = jsonDocument.object();
        levelData = jsonObject.value("data").toArray();
        
        sand = QImage(":/textures/1.png").scaled(cs, cs); // вот эти два основных тайла - песок и земля
        ground = QImage(":/textures/2000.png").scaled(cs, cs);
    }
 
    QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize);
 
    QJsonDocument jsonDocument;
    QJsonObject jsonObject;
 
    QJsonArray levelData;
    QJsonArray cellTextures;
 
    QString levelDataStr;
    QString level;
    
    
    QImage sand;
    QImage ground;
};
C++ (Qt)
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
QPixmap MapProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
{
    QStringList data;
    QString texture;
    QJsonArray cellTextures;
 
    int x;
    int y;
    int width;
    int height;
    int mapWidth;
    int mapHeight;
    int cs;
 
    data = id.split(",");
    x = data.at(0).toInt();
    y = data.at(1).toInt();
    width = data.at(2).toInt();
    height = data.at(3).toInt();
    mapWidth = data.at(4).toInt();
    mapHeight = data.at(5).toInt();
    cs = data.at(6).toInt();
 
    int chX = qFloor(x/cs) * 1;
    int chY = qFloor(y/cs) * 1;
 
    if (size)
        *size = QSize(width, height);
 
    QPixmap pixmap(requestedSize.width() > 0 ? requestedSize.width() : width,
                   requestedSize.height() > 0 ? requestedSize.height() : height);
 
    pixmap.fill(Qt::white);
 
    QPainter *paint = new QPainter(&pixmap);
 
    for(int row = 0; row < (height / cs) + 1; row++)
    {
        for(int col = 0; col < (width / cs) + 1; col++)
        {
            int index = col + chX + (row + chY) * mapWidth;
            cellTextures = levelData.at(index).toArray();
 
            if(cellTextures.count() == 0)
                paint->drawImage(col * cs, row * cs, sand);
            else if(cellTextures.count() == 1)
            {
                texture = QString::number(cellTextures.at(0).toInt());
                if(texture != "2000")
                {
                    paint->drawImage(col * cs, row * cs, sand);
 
                    if(texture != "0" || texture != "1")
                        paint->drawImage(col * cs, row * cs, QImage(":/textures/" + texture + ".png").scaled(cs, cs));
                }
                else
                    paint->drawImage(col * cs, row * cs, ground);
            }
            else
            {
                paint->drawImage(col * cs, row * cs, sand);
 
                for(int i = 0; i < cellTextures.count(); i++)
                {
                    texture = QString::number(cellTextures.at(i).toInt());
                    if(texture == "0")
                        continue;
 
                    paint->drawImage(col * cs, row * cs, QImage(":/textures/" + texture + ".png").scaled(cs, cs));
                }
            }
        }
    }
 
    delete paint;
    return pixmap;
}


Тогда вопрос такой: если у меня очень много тайлов, скажем, штук 50, как их правильнее предварительно загружать в память? Засунуть QImage в массив? Или есть более разумные способы? =)
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
24.12.2014, 11:20
Жесть. Я то думал, что будет использоваться Painted Item

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

Цитата Сообщение от WxMaper Посмотреть сообщение
Тогда вопрос такой: если у меня очень много тайлов, скажем, штук 50, как их правильнее предварительно загружать в память? Засунуть QImage в массив?
Если память позволяет, иначе используй кеш, к примеру QPixmapCache. Например можно держать в памяти только часто встречающиеся тайлы.

Цитата Сообщение от WxMaper Посмотреть сообщение
Или есть более разумные способы?
Попробовать использовать QPixmap, а вообще лучше в текстурах в видеокарте
1
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
24.12.2014, 11:36  [ТС]
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Обычно сначала собирается одно большое изображение по размеру равное или чуть больше видимой части. Когда происходит смещение, не перерисовывается всё изображение, а делается трансформация(матрица смещения), а потом дорисовывается по краям.
Сначала так и думал делать, но у меня в голове не сложилось представления как это реализовать - дорисовывание картинки. За Painted Item спасибо, не знал о таком. Если текущая модель в ходе дальнейшей писанины снова начнет тормозить, то буду искать другие решения =) пока код из моего последнего сообщения вроде неприхотлив, на sgs4mini летаю по карте без дерганий и подвисаний, правда процессор грузится от 5 до 30% в зависимости от скорости движения.

Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Если память позволяет
Тайлы маленькие - 96х96 пикселей. Самый большой по объему - 22кб. Все вместе они и пары мегабайт не заняли думаю оставлю в массиве, раз уж это не критично.
п.с. я не силен в геймдеве, потому и спросил делается ли так вообще ))

Цитата Сообщение от Dmitriy_M Посмотреть сообщение
а вообще лучше в текстурах в видеокарте
шайтан
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
24.12.2014, 12:00
Цитата Сообщение от WxMaper Посмотреть сообщение
Тайлы маленькие - 96х96 пикселей. Самый большой по объему - 22кб.
На самом деле в памяти они будут 96x96x4=36864/1024=36 кб.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2014, 12:00
Помогаю со студенческими работами здесь

Программа неожиданно завершилась Qt C++
Здравствуйте форумчане! Пытаюсь сделать программу с кастомным окном в Qt. Вот код։ MainWindow::MainWindow(QWidget *parent) :...

Программа неожиданно завершилась.
Пишу текстовый редактор, ошибок нет! Но при компиляции появляется такая надпись: Код: mainwindow.h #include &lt;QMenu&gt; ...

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

Программа неожиданно завершилась
Программа неожиданно завершается 15:40:09: Запускается D:\build-54-Desktop_Qt_5_12_2_MinGW_64_bit-Debug\debug\54.exe... 15:40:12:...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru