Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для fufel
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535

ТЗ и первый шаг в правильном направление

22.06.2018, 15:24. Показов 2439. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
После темы на форуме решил с самого начало спросить как надо/лучше/правильнее делать чем потом переписывать то что не корректно написано.

ТЗ с описанием проблемы в общих чертах.
Решение задачи должно быть на Windows service.

При запуске сервиса происходит запуск около 10 самостоятельных потоков. Каждый поток работает по своему и со своими интерфейсами. Каждый из потоков время от времени генерирует событие (промежуток не постоянный). События обрабатываются 5-ю методами. (Например 3 потока запускают одно и тоже событие, другой поток запустит второе событие и т.д). Четкой привязки потоков к методам нету.

Задача состоит в том чтобы события из разных потоков обрабатывалось поочерёдно (Чтобы одновременно не было обработки двух событий). Всё дело в том что каждый метод работает с одной и той же структурой, + DB + файлы на сервере. Допустить выполнения двух методов одновременно не допустимо.

В другой ветки у меня была идея. Обработку всех событий реализовать в одном и том же потоке (Вся обработка делалась в GUI потоке), но знающие люди сказали что я не прав и лучше написать код с нуля и правильно. Вот с верху указанно ТЗ, с чего надо начать чтобы добиться выполнения ТЗ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2018, 15:24
Ответы с готовыми решениями:

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

Первый шаг в S7-Graph
Я не АСУ-шник и вообще к программированию отношения не какого не имею. Но есть задании партии освоить S-300. Немного подучил LAD и FBD,...

Мой первый шаг
«Строки» Дана фраза, в которой слова разделены одним пробелом, а сама фраза заканчивается точкой. Требуется: Определить, сколько в...

15
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.06.2018, 15:36
fufel, могу дать пример ТЗ реальной системы. Само-собой. Никаких имён собственных. В конце, кстати, ссылки на ГОСТы, с которыми очень рекомендую ознакомиться. ТЗ1.pdf
0
 Аватар для fufel
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
22.06.2018, 17:03  [ТС]
Цитата Сообщение от aquaMakc Посмотреть сообщение
fufel, могу дать пример ТЗ реальной системы. Само-собой. Никаких имён собственных. В конце, кстати, ссылки на ГОСТы, с которыми очень рекомендую ознакомиться. ТЗ1.pdf
Спасибо, интересная документ. Буду изучать (но много чего уже интересного нашел). Если опустить что я не правильно выразил ТЗ (о точнее это и не ТЗ и ошибка) то как мне решить ту задачу которая стоит? Что делать и куда смотреть?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
22.06.2018, 17:29
Цитата Сообщение от fufel Посмотреть сообщение
Что делать и куда смотреть?
Не забегать вперёд паровоза.
Собираешь по максимуму сведения о том, как программа должна работать и что делать. Максимальное количество "хотелок". Сводишь это в единый документ. Решаешь спорные моменты и взаимоисключающие пожелания. Определяешься с какими объёмами данных нужно работать. Определяешь все точки входа в систему, основные функциональные блоки (ВНИМАНИЕ! Не классы программы!). Определяешься к требованиям по производительности системы. Обязательно формулируешь необходимый функционал. Оформляешь всё это в виде ТЗ. Подписываешь у всех заинтересованных, чтобы потом никаких вопросов не было.
Это всё нужно чтобы:
1) Структурировать всю информацию по программе у тебя самого в голове;
2) Собрать в одном месте все пожелания всех пользователей;
3) Обеспечить обоснование твоей занятости.

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

Добавлено через 10 минут
fufel, ещё. Планируй разработку так, чтобы она шла итерациями (в терминал Agile - спринт). Итерации непродолжительные не более пары недель. По окончании каждой итерации у тебя должен быть рабочий продукт, который можно запустить и продемонстрировать какой-то функционал. Соответственно на спринт надо определить список задач, которые можно реализовать за это время.
Само-собой сначала получаться не будет, но с опытом и нарастанием "мяса" на скелет программы дело пойдёт.
При решении каких-то задач не стесняйся делать прототипы - программы, которые реализуют техническое решение, которое хочешь применить с целью его проверки.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
23.06.2018, 01:24
Цитата Сообщение от fufel Посмотреть сообщение
Допустить выполнения двух методов одновременно не допустимо.
MQ вам в помощь.

Хотя тут под вопросом, почему недопускается многопоточная обработка сообщений. Возможно вы создаете проблему из ничего, и достаточно просто лочить обьекты перед изменением.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
23.06.2018, 10:21
А во внерабочее время можно и по теме почитать:
https://blog.stephencleary.com... art-1.html

Книжка там его на русском языке тоже в интернетах присутствует.
И естественно, всё что связано. Особенно помогает Stephen Toube.

Добавлено через 47 минут
Товарищ на него ссылается на тему Rx (Reactive Extensions), ObservableCollection, асинхронное программирование:
https://msdn.microsoft.com/ru-... 07526.aspx
0
 Аватар для fufel
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
25.06.2018, 12:48  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Хотя тут под вопросом, почему недопускается многопоточная обработка сообщений. Возможно вы создаете проблему из ничего, и достаточно просто лочить обьекты перед изменением.
Там может быть много проблем: То ролик проскользнул, то тележка доехала не за секунду а за 3.

Цитата Сообщение от Wolfdp Посмотреть сообщение
MQ вам в помощь.
Что это за зверь? (Мне хватит и расшифровки аббревиатуры и я остальное найду).

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

Цитата Сообщение от aquaMakc Посмотреть сообщение
Не забегать вперёд паровоза.
Не бегу, паровоз уже на станции и начальник требует результат. Как бы был бы рад всё с нуля переделать (Там полно других логических ошибок). Но увы не на переделку времени уже не даст.

Резюме, буду учить но и искать в интернете решение данной задачи (Хотя и так ясно что задача уже поставлена через зад, но Рим не сразу построился, вот и я не сразу всё сделаю так как надо).
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
25.06.2018, 13:43
Цитата Сообщение от fufel Посмотреть сообщение
Что это за зверь? (Мне хватит и расшифровки аббревиатуры и я остальное найду).
Если правильно помню, Message Query

Идея такая:
- запускаете 10 потокв, и каждьій из них является паблишером в очередь.
- запускаете отдельньій поток, которьій подписьівается на очередь.
- просто синхроно дергаете каждое сообщение

Такая схема позволит вам хоть на отдельньіе серваки разносить.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
25.06.2018, 16:50
Цитата Сообщение от Wolfdp Посмотреть сообщение
Если правильно помню, Message Query
Скорее, Message Queque (Очередь Сообщений).
0
25.06.2018, 17:06

Не по теме:

Цитата Сообщение от insite2012 Посмотреть сообщение
Скорее, Message Queque (Очередь Сообщений).
меня до сих пор поражает, что я делаю в IT без английского... :(

0
25.06.2018, 17:15

Не по теме:

Цитата Сообщение от Wolfdp Посмотреть сообщение
меня до сих пор поражает, что я делаю в IT без английского...
Wolfdp, я тоже не сказать что в нем силен. :( Нет, читаю конечно, как-то даже Стивенсона в оригинале читал, но все равно не профи. А аббревиатура знакома, поскольку плотно занимался WCF, и там как раз и используется очередь сообщений Microsoft (MSMQ).

0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
26.06.2018, 04:45
Лучший ответ Сообщение было отмечено fufel как решение

Решение

В общем как-то так...
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
using System;
using System.Linq;
using System.Messaging;
using System.Threading;
using System.Threading.Tasks;
 
namespace Nya.MSMQ
{
    class Program
    {
        static void Main(string[] args)
        {
            const string path = @".\Private$\NyaQueue";
            if (MessageQueue.Exists(path))
                MessageQueue.Delete(path);
            MessageQueue.Create(path);
 
            Enumerable.Range(0, 10).Select(x => new Invoker(new NyaMQ<NyaModel>(path))).ToArray();
            new Handler(new NyaMQ<NyaModel>(path));
            Console.ReadKey();
        }
    }
 
    [Serializable]
    public class NyaModel
    {
        public Guid Id { get; set; }
 
        public int ThreadSource { get; set; }
 
        public DateTime Date { get; set; }
    }
 
    internal class NyaMQ<T> : MessageQueue, IRequestProvider<T>, IResponseProvider<T>
    {
        public NyaMQ(string path) : base(path)
        {
            Formatter = new BinaryMessageFormatter();
        }
 
        T IResponseProvider<T>.Recive()
        {
            return (T)Receive().Body;
        }
 
        void IRequestProvider<T>.Send(T model)
        {
            Send(model);
        }
    }
 
    public interface IRequestProvider<in T>
    {
        void Send(T model);
    }
 
    public interface IResponseProvider<out T>
    {
        T Recive();
    }
 
    internal class Invoker
    {
        static Random random = new Random();
 
        internal Invoker(IRequestProvider<NyaModel> requestProvider)
        {
            new Task(() =>
            {
                var n = random.Next(5, 10);
                for (var i = 0; i < n; i++)
                {
                    Task.Delay(random.Next(1000, 2000)).Wait();
                    requestProvider.Send(new NyaModel
                    {
                        Id = Guid.NewGuid(),
                        ThreadSource = Thread.CurrentThread.ManagedThreadId,
                        Date = DateTime.Now
                    });
                }
            }).Start();
        }
    }
 
    internal class Handler
    {
        internal Handler(IResponseProvider<NyaModel> responseProvider)
        {
            new Task(() =>
            {
                while (true)
                {
                    var model = responseProvider.Recive();
                    //Console.WriteLine($"source = {model.ThreadSource}; id = {model.Id}; date = {model.Date}");
                    Console.Write($"{model.ThreadSource}");
                }
 
            }).Start();
        }
    }
}
Если опустить отсутствие Dispose, то нерешеная проблема тут в while (true) -- я так и не понял как прервать Recive, когда все Invoker-ы закончили свою работу. Может логичнее юзать BeginRecive, но пока пробовать лень.

Для работьі нужно в винде в компонентах врубить MQ и подключить System.Messaging.dll (поставляется в стандартной сборк .net)

Далее -- весть єтот ужас будет работать только в случае отсутствия обращения обработчика к состоянию паблишера ивента, т.е. когда через MQ гоняются исключительно данные. Если же нужно прям вот в одной RAM все вертеть, то возможно логичнее как-то так...

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
 
namespace Nya.MSMQ
{
    class Program
    {
        static void Main(string[] args)
        {
            var mq = new NyaManualQueue<NyaModel>();
            new Handler(mq);
            Enumerable.Range(0, 10).Select(x => new Invoker(mq)).ToArray();
            
            Console.ReadKey();
        }
    }
 
    [Serializable]
    public class NyaModel
    {
        public Guid Id { get; set; }
 
        public int ThreadSource { get; set; }
 
        public DateTime Date { get; set; }
    }
 
    internal class NyaManualQueue<T> : IRequestProvider<T>, IResponseProvider<T>
    {
        private ManualResetEvent reset = new ManualResetEvent(false);
        private Queue<T> queue = new Queue<T>();
 
        T IResponseProvider<T>.Recive()
        {
            reset.WaitOne();
            return queue.Dequeue();
        }
 
        void IRequestProvider<T>.Send(T model)
        {
            lock (this)
            {
                queue.Enqueue(model);
                reset.Set();
            }
        }
    }
 
    public interface IRequestProvider<in T>
    {
        void Send(T model);
    }
 
    public interface IResponseProvider<out T>
    {
        T Recive();
    }
 
    internal class Invoker
    {
        static Random random = new Random();
 
        internal Invoker(IRequestProvider<NyaModel> requestProvider)
        {
            new Task(() =>
            {
                var n = random.Next(5, 10);
                for (var i = 0; i < n; i++)
                {
                    Task.Delay(random.Next(100, 200)).Wait();
                    requestProvider.Send(new NyaModel
                    {
                        Id = Guid.NewGuid(),
                        ThreadSource = Thread.CurrentThread.ManagedThreadId,
                        Date = DateTime.Now
                    });
                }
            }).Start();
        }
    }
 
    internal class Handler
    {
        internal Handler(IResponseProvider<NyaModel> responseProvider)
        {
            new Task(() =>
            {
                while (true)
                {
                    var model = responseProvider.Recive();
                    //Console.WriteLine($"source = {model.ThreadSource}; id = {model.Id}; date = {model.Date}");
                    for (var i = 0; i < 16; i++)
                    {
                        Task.Delay(100).Wait();
                        Console.Write($"{model.ThreadSource}.");
                    }
                    Console.WriteLine();
                }
 
            }).Start();
        }
    }
}
Ну и основное: т.к. до сих пор обсуждаем некий гибридк невидимого розового единорога сферической формы в вакуме -- возможно вся эта пляска с потоками и подписками вообще лишена смысла.
0
 Аватар для fufel
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
26.06.2018, 12:49  [ТС]
Wolfdp,
1) Спасибо за пример, разбираясь в нём я я кое что понял что од этого слабо понимал.
2) При разборе что такое "MessageQueue" я нашел "Для создания очереди необходимы административные привилегии. Обычно нельзя рассчитывать, что пользователь приложения будет иметь их. Именно поэтому очереди обычно создаются программой установки."
3) Подумав дальше дошло что всё что я хотел не как иное как "event loop", "loop message" и Т.Д. Тоже самое что использует Windows form (с названием терминологии явно где то ошибся).

Подскажите как правильно называется терминология (или методы) и пойду дальше искать.
Или может что то уже есть готовое для изучение или самому писать Message loop?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
26.06.2018, 12:53
Цитата Сообщение от fufel Посмотреть сообщение
При разборе что такое "MessageQueue" я нашел "Для создания очереди необходимы административные привилегии. Обычно нельзя рассчитывать, что пользователь приложения будет иметь их. Именно поэтому очереди обычно создаются программой установки
Мало того, их ещё и включить в винде надо.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
26.06.2018, 18:19
Цитата Сообщение от Wolfdp Посмотреть сообщение
до сих пор обсуждаем некий гибридк невидимого розового единорога сферической формы в вакуме
Полностью согласен. ТС так и не рассказал, что его приложение должно делать. Не как оно должно работать (потоки, события и прочее), а именно что, полностью абстрактно, вне зависимости от технологии и способов реализации. А без такого описания все остальное бесполезно.
0
 Аватар для fufel
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
27.07.2018, 13:13  [ТС]
Всё пора подводить итоги и закрывать тему.
Когда я писал вопрос то я всё напитал и перепутал. Всё не так надо было делать.
И с ТЗ был не так задан, и требования были не те. Проще говоря ворох лишних вопросов и в результате этого киш мищ в голове.

Но итоге из всего этого я получил правильных уроков. Которые теперь учитываю

Wolfdp, Спасибо тебе, твой ответ натолкнул меня на нужную идею. В течение трёх дней я переписал проект под новые требования не переписавая код (изменил 5% старого кода). И всё теперь работает.

Всем спасибо, сорян если кому то потрепал нервы )))))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.07.2018, 13:13
Помогаю со студенческими работами здесь

первый шаг он трудный самый!
Как наверное понятно из заголовка, я решил изучить С++. Скачал книгу, компилятор Dev-C++. В книге написано создать свою первую программу,...

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

первый шаг в Lotus Designer
Добрый день! я первый раз открыл Lotus Designer 6.5, литературы нет ни какой. дайте плиз ссылку или помогите создать любую новую баз...

Явная и неявная схемы.Первый шаг
Всем привет. Вот столкнулся с такой задачей как: Необходимо сделать первый шаг по явной и неявной схеме. ...

Про первый шаг навстречу файлу
Доброго всем здравия, духовного и телесного. Люди добрые, помогите разобраться с файлами. Хотел с помощью программы создать текстовой...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru