Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 111
1

Как отследить, что MessageBox активен?

18.08.2020, 11:54. Показов 2377. Ответов 52
Метки нет (Все метки)

Доброго времени суток, Форумчане. Подскажите, как отследить активность messagebox по условию if, где истина - данное окно открыто. Если можете пожалуйста отсыпьте чутка кода)

Добавлено через 1 час 1 минуту
Суть: мне требуется передать dialogresult. Я хотел бы сделать его доступным для нескольких методов. Указать что для dialogresult = mb("","",...Yes.No); После этого вернуть dialogresult. После если в асинхронный метод приходят данные, то равнозначно нажатие Yes, иначе - ничего не делать. Тут либо юзер нажимает на кнопку, либо при поступлении данных асинхронный метод нажимает на кнопку по типу mydialog = DialogResult.Yes;
0

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

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2020, 11:54
Ответы с готовыми решениями:

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

А что находится внутри функции MessageBox или как еще можно создать MessageBox?
Помните сказку о лягушке-царевне? Что необходимо было сделать, чтобы убить Кащея-бессмертного?...

Как можно реализовать, если есть ответ от сайта, тогда вывести сообщение о том, что сайт активен
Всем привет. Не подскажете какможно реализовать, если есть ответ от сайта, тогда вывести сообдщение...

HDD не активен. Что делать?
Всем привет. только на одном (из двух тестированных) ноутбуке ЖД говорит, мол, диск защищён <=> с...

52
Эксперт .NET
14956 / 11331 / 2971
Регистрация: 17.09.2011
Сообщений: 18,981
18.08.2020, 13:23 2
Цитата Сообщение от Yoms Посмотреть сообщение
После если в асинхронный метод приходят данные, то равнозначно нажатие Yes, иначе - ничего не делать.
Если у вас асинхронные методы, то используйте таски и ожидайте результата.

Но в целом хотелось бы по-больше деталей, а то текущее объяснение не очень понятно.
Как насчет минимального примера, на "голом" проекте?
1
9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 111
18.08.2020, 14:15  [ТС] 3
Старт
C#
1
2
3
4
5
6
7
8
9
10
private void f_Connect()
        {
            Open();
            StartAsyncSerialReading();
            MessageBox.Show("Connect OK");
            ret_Dispenser(loader.LoadDispenser());
            cmb_dispenser.DataSource = disp;
            cmb_dispenser.DisplayMember = "name_ot";
            cmb_dispenser.ValueMember = "id";
        }
Открытие порта
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public SerialPort Open()
        {
            connection = loader.m_LoadDevice();
            serial.PortName = connection.portname;
            serial.BaudRate = connection.baud;
            serial.Parity = connection.parity;
            serial.DataBits = connection.databits;
            serial.StopBits = connection.stop;
            try
            {
                this.serial.Open();
                startReading = StartAsyncSerialReading;
                startReading();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            return serial;
        }
Желаемое действие при получении данных
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void StartAsyncSerialReading()
        {
            byte[] buffer = new byte[bufferLength];
            if (serial.IsOpen)
            {
                serial.BaseStream.BeginRead(buffer, 0, bufferLength, delegate (IAsyncResult ar)
                {
                    try
                    {
                        dialogserial = DialogResult.Yes;   
                    }
                    catch (IOException exc)
                    {
                        MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK);
                    }
                    if (serial.IsOpen)
                        startReading();
                }, null);
            }
        }
Вхождение MessageBox с его dialog-ом додумайте сами)

Добавлено через 5 минут
И да условие тут необходимо, как раз таки чтобы в случае AsyndReading различать инициировал это пользователь, или же нет. То есть если будет открыто окно mbox предполагается, что при данном условии будет выполнять нажатие Yes, если же нет, то будет предполагать, что пользователь работает в штатном режиме, без подключения к устройствам

Добавлено через 1 минуту
Сам startReading это обычный Action

Добавлено через 23 минуты
Так, можете что-то подсказать в данном контексте?

Добавлено через 10 минут
Могу сразу сказать, у меня трудности с асинхронными методами, поэтому и обратился к более сведущим форумчанам) Суть задачи сводится к тому чтобы соединить разные методы работы с данными на одном mbox. То есть входим в цикл появляется mbox ("Обработать данные?", "", ...Yes.No). Если да нажали в окне то все ок обрабатываем их, если данные абсолютно любые ловятся с порта без нажатия на Да, то метод сам нажимает Да и переходит также на стандартную обработку данных

Добавлено через 8 минут
Трудность заключается в том, что я пытаюсь понять, как централизовать данную работу, чтобы например тот-же асинхронный метод не нажимал сам себя по множеству раз единожды получив данные, поэтому предположил, что наиболее эффективно будет использовать отслеживание mbox
0
Нарушитель
1343 / 793 / 299
Регистрация: 17.05.2015
Сообщений: 3,062
18.08.2020, 14:22 4
Yoms, После того как юзер жмет обработать данные какой метод должен вызываться?
1
9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 111
18.08.2020, 14:34  [ТС] 5
Это сторонняя библиотека.
По аналогии:
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
dialogserial = MessageBox.Show("Обработать данные?", "В процессе обработки...", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (dialogserial == DialogResult.Yes)
                        {
                            cmp = cl_messages.ExecuteCommand_S(serial.BaseStream);
                            arr = cmp.ResponseList[cmp.ResponseList.Count - 1].ToCharArray();
                            arr = Array.FindAll<char>(arr, (c=> (char.IsDigit(c) || c == '.')));
                            resp = new string(arr);
                            resp = resp.Replace(".", ",");
                            resp = resp.Trim();
                            switch (j)
                            {
                                case 1:
                                    if (i != 10)
                                    {
                                        row["ves_1"] = resp;
                                        if (factor)
                                        {
                                            row["vod_1"] = Math.Round(Convert.ToDecimal(resp) / coef, 4);
                                        }
                                        if (!factor)
                                        {
                                            row["vod_1"] = Math.Round(coef * Convert.ToDecimal(resp), 4);
                                        }
                                        fr_sum_n1(Convert.ToDecimal(resp));
                                        fr_sum_sr1(dev.Sr(10, Convert.ToDecimal(resp)));
                                    }
                                    break;
                                case 2:
                                    if (i != 10)
                                    {
                                        row["ves_2"] = resp;
                                        if (factor)
                                        {
                                            row["vod_2"] = Math.Round(Convert.ToDecimal(resp) / coef, 4);
                                        }
                                        else
                                        {
                                            row["vod_2"] = Math.Round(coef * Convert.ToDecimal(resp), 4);
                                        }
                                        fr_sum_n2(Convert.ToDecimal(resp));
                                        fr_sum_sr2(dev.Sr(10, Convert.ToDecimal(resp)));
                                    }
                                    break;
                                case 3:
                                    if (i != 10)
                                    {
                                        row["ves_3"] = resp;
                                        if (factor)
                                        {
                                            row["vod_3"] = Math.Round(Convert.ToDecimal(resp) / coef, 4);
                                        }
                                        else
                                        {
                                            row["vod_3"] = Math.Round(coef * Convert.ToDecimal(resp), 4);
                                        }
                                        fr_sum_n3(Convert.ToDecimal(resp));
                                        fr_sum_sr3(dev.Sr(10, Convert.ToDecimal(resp)));
                                    }
                                    break;
                                case 4:
                                    if (i != 10)
                                    {
                                        row["ves_4"] = resp;
                                        if (factor)
                                        {
                                            row["vod_4"] = Math.Round(Convert.ToDecimal(resp) / coef, 4);
                                        }
                                        else
                                        {
                                            row["vod_4"] = Math.Round(coef * Convert.ToDecimal(resp), 4);
                                        }
                                        fr_sum_n4(Convert.ToDecimal(resp));
                                        fr_sum_sr4(dev.Sr(10, Convert.ToDecimal(resp)));
                                    }
                                    break;
                            }
                            table.Rows.Add(row);
                        }
                        else
                        {
                            break;
                        }
Добавлено через 9 минут
Это отправка запроса на устройство, с целью получить данные в ответе.
C#
1
cmp = cl_messages.ExecuteCommand_S(serial.BaseStream);
0
HF
547 / 362 / 100
Регистрация: 09.09.2011
Сообщений: 1,188
Записей в блоге: 2
19.08.2020, 09:29 6
Или я не верно понял задачу или решение совсем простое.
Зачем ждать какой-то результат, когда это делается на простой подписке на событие.
1) если есть данные, то пусть они грузятся хоть постоянно и куда-то складируются. При желании жмётся кнопка "Хочу обработать" и мы просто пользуемся результатом. (это к требованию что данные всегда читаются даже без подтверждения)
2) Открываем окно, подписываемся на результат, забываем об окне. Когда окно закрывается и там есть нужные нам условия, то всех оповещают об этом. Хотите - начинаете обрабатывать, не хотите не обрабатываете.

И ещё я постоянно негодую на желание "Хочу сэмулировать нажатие кнопки", "Как мне нажать Да" и т.п. Зачем нажимать кнопки, если вы сами владеете процессом? Например в данном примере - зачем нажимать "Да", если вы просто можете закрыть форму на которой что-то написано, например "Хотите обработать?". Вы увидели что есть данные; прошло время; отмена действия из логики... просто закройте форму. Не надо "нажимать кнопки"!

Добавлено через 7 минут
Цитата Сообщение от Yoms Посмотреть сообщение
Желаемое действие при получении данных
Это не желаемое действие. Это уже попытка что-то придумать на желаемое действие. Словами опишите что вы тут пытались реализовать. Лично я не понимаю что там происходит.
- если порт открыт, то уже не нужно наверное постоянно проверять его статус. Если он вдруг закроется не вами это фатально. И вы получается просто проигнорируете это.
- если это результат и вы делегат создали, то что это за метод снова "startReading()"? и без параметров. Там обработчик данных или снова чтение потока? Если обработка - то назовите его по другому и передавайте туда результат, почему он глобальными данными пользуется?
- не нужно наворачивать столько кода. Устроили подписку на результат (IAsyncResult ar)? просто метод передайте который результат обработает. Вот этот метод и будет типа асинхронным. А то что вы вызвали StartAsyncSerialReading совсем близко не асинхронность и только какой-то вызыватель. Будет проще, чище и понятнее, чем то что сейчас наворочено в 20 строках.
1
9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 111
19.08.2020, 09:36  [ТС] 7
Мысль понятна, но не совсем так. Получается, что данные проходят преобразование из аналогового на цифровой, через микроконтроллер. Сами данные являются высокой точности, поэтому получать их необходимо не постоянно, а после соблюдения некоторых физических условий. Суть сводится к тому чтобы юзер не бегал от терминала к компьютеру, а мог выполнить действия и так и так.
Что касается того, что Вы сказали, не могли бы Вы показать любой маломальский пример, так как я тоже Вас не понял в полной мере.

Добавлено через 6 минут
Так, я занимаюсь этим уже неделю))). Вы можете показать в коде пример подписки на IAsyncResult? Потому что, как говорилось выше у меня с асинхронностью туго.
0
HF
547 / 362 / 100
Регистрация: 09.09.2011
Сообщений: 1,188
Записей в блоге: 2
19.08.2020, 09:44 8
Цитата Сообщение от Yoms Посмотреть сообщение
Что касается того, что Вы сказали, не могли бы Вы показать любой маломальский пример, так как я тоже Вас не понял в полной мере.
Скорее не понятна проблема. Когда вы говорите "хочу передать dialogResult" на самом деле это ваше понимание решения, а оно может быть ошибочное. Поэтому требуется понимать именно проблему - зачем вам это нужно.
А мне лично ваш код не понятен. На картинке вопросы:
- зачем метод StartAsyncSerialReading используется два раза - в методе Open() и потом снова в f_Connect ?
- что такое "startReading" в f_Connect ?
-- В 12 строке ей присвается функция. В 13 вызывается. Это делегат? Зачем такие сложности с вызовом?
-- а в методе StartAsyncSerialReading этот startReading() опять вызывается. У вас ещё не было переполнения стека?

И о понимании. Я предполагаю что вашей задачей или проблемой являются строки 4 и 5 в методе f_Connect()?
Типа.. вы вызвали чтение данных, но открыли диалог с сообщением "Connect OK". И теперь вам нужно его закрыть при каком-то условии. Видимо когда данные принимаются или принялись или что-то ещё. И соответственно после этого ззапустится 6 строка с вызовом LoadDispenser() и т.д. Верно?
Если да, то
1) какое условие успешное для начала ЛоадДиспенсеризации?
2) что будет если будет ошибка. Сообщение выведется и нужно будет выйти из f_Connect()?
1
Миниатюры
Как отследить, что MessageBox активен?  
HF
547 / 362 / 100
Регистрация: 09.09.2011
Сообщений: 1,188
Записей в блоге: 2
19.08.2020, 09:47 9
И чем плох подход из сообщения? Задали вопрос, если успешно - начали что-то делать. Почему у вас так же не сделано?

"Чтобы пользователь сам не бегал и кнопки не нажимал"? Но тогда зачем вообще нужен диалог, если вы можете эту обработку автоматизировать. Зачем нужны вообще диалоги? Вот это дальше не понятно.
1
9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 111
19.08.2020, 10:32  [ТС] 10
По поводу первых замечаний. Двойной вызов, как вы его опиали был взят с примеров из интернета, раньше я пользовался исключительно подключением к последовательному порту, без каких либо дополнительных методов. То есть все строилось чисто на basestream, в синхронном режиме. На сколько верны новые данные методы я не знаю, точнее быть точным - до конца на данном этапе не понимаю.
Диалог нужен для пользователя, чтобы он понимал, что сейчас что то происходит или будет происходить.
Хорошо, как предполагаю поступить: я оставлю reading в области Connection, убрав его из метода Start.
Но что дальше делать? Как с условием того, что юзеру нужно обязательно видеть сообщения привязать все к данному mb.

Добавлено через 4 минуты
По поводу loader, он подключается единожды, внутри находятся подключения ко множеству баз данных, в итоге он производит опрос, получает данные по условиям, и возвращает в том числе Dispenser, то есть устройства с дозаторами их характеристики, чтобы уже по ним производить заполнение данных я имею ввиду в конечный отчет пользователя.
Loader после получения первичных данных больше в работе не участвует.
Далее участвуют cl_messages внутри которого прописаны преобразования и шаблоны опроса устройства.

Добавлено через 8 минут
1) какое условие успешное для начала ЛоадДиспенсеризации? - чтобы были данные в базах данных
2) что будет если будет ошибка. Сообщение выведется и нужно будет выйти из f_Connect()? - ошибок в области connect я не встречал если использую все без AsyncRead, если с ним, то просто не будет доступа к порту, так как и устройство придется перезагрузить, ошибка сообщений внутри - это хороший случай. Плохой - устройство и программа стремятся в бесконечность то есть просто перестают отвечать.

Добавлено через 2 минуты
уже объяснял данные async а точнее пародия на них также как и на то как устроен connect имеется ввиду двойной вызов я взял с инета, когда же данные методы не работали у меня, я предполагал, что ошибка заключается не в неправильной последовательности или же вредном двойном вызове, а в том что я как то не так понял. Хотя код действительно просто скопирован был и условия были: отследить поступающие данные на COM-порт в режиме онлайн.

Добавлено через 7 минут
и еще одно, стабилизация перед получением данных составляет от 5 до 10 секунд в зависимости от условий среды (тут я имею ввиду исключительно физический мир, то есть по сути получение данных). Если я получу данные быстрее, то произойдет фатальная ошибка также как и данные будут уже неправильными, внутри микроконтроллера возникает исключение если он пробует отослать нестабильные данные. Поэтому получать данные все время я не могу.
Да я не говорю что мое суждение наиболее верно, однако с точки зрения пользователя оно наиболее удобно, иметь возможность понимать что сейчас вот что то произойдет или будет происходить, также как и сообщить ему о том что "будем дальше обрабатывать" или нет. По этим всем причинам я попросил помочь мне понять с хотя бы каким то мало-мальским примером самым даже примитивным, что мне требуется сделать чтобы реализовать данное.
0
HF
547 / 362 / 100
Регистрация: 09.09.2011
Сообщений: 1,188
Записей в блоге: 2
19.08.2020, 10:53 11
Цитата Сообщение от Yoms Посмотреть сообщение
Диалог нужен для пользователя, чтобы он понимал, что сейчас что то происходит или будет происходить.
Как с условием того, что юзеру нужно обязательно видеть сообщения привязать все к данному mb.
Всё-таки этот кусок, я считаю, и есть спорный и непонятный.

То есть ЛоадерДиспенсер требует данных, которые должен обработать. Значит он зависит от принятых данных. Вопрос остался незакрытым - в каком состоянии должны быть данные? Полностью принятые? и не зависеть от решения пользователя (кнопку нажимателя).

"пользователь видит что происходит"
Мысли-вопросы: Каким образом в вашем примере он это видит? Если данные пришли то понятно - закончили приём, вывели конечный диалог. А если они идут в данный момент? Вы же хотели даже асинхронно делать. А вас уже вывелся диалог "Connect OK" (ОК). Или неверное сообщение? Не коннект успешный, а данные тоже получены?
Моё видение: зачем ему нужно тогда выводить диалог? для этого есть статусные строки. Можно даже приделать индикатор загрузки. Когда данные не поступают - чёрный кружочек; идут данные - мигает зелёным; всё получено - синий и т.п.

По-моему мнению разделите логику и ответственности. Открытие порта, ожидание и чтение данных - одно. Реакция на данные - другое. Нужно отменить - кнопка со своей логикой, со ссылкой на первый сервис.

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
private void f_Connect()
        {
            Open();
            StartAsyncSerialReading();
        }
 
private void StartAsyncSerialReading()
        {
                ...
                AsyncCallback callBack = new AsyncCallback(ReadingComplete);
                serial.BaseStream.BeginRead(buffer, 0, bufferLength, callBack);
                ...
        }
 
        private void ReadingComplete(IAsyncResult ar)
        {
                ...
                тут обработка результата, проверка условий и т.п.
                ...
??? result = serial.BaseStream.EndRead(ar)
 
            ret_Dispenser(loader.LoadDispenser(result ));
            cmb_dispenser.DataSource = disp;
            cmb_dispenser.DisplayMember = "name_ot";
            cmb_dispenser.ValueMember = "id";
 
            MessageBox.Show("Все данные получены/обработаны. Смотрите результат");
        }
Грубо накидал по смыслу.

Похоже код от сюда взят?
https://coderoad.ru/27988887/-... лько-тогда
1
678 / 489 / 177
Регистрация: 21.02.2019
Сообщений: 1,810
19.08.2020, 11:10 12
... может, пользователю выводить сообщение о готовящемся факте загрузки (розлива пива в физическом смысле) просто с кнопкой "Отмена/GoAround" с таймером ... ? .. т.е. пользователь видит, что происходит, может операцию отменить, если что-то не так, а ОК и сам нажмется по дефолту?
1
9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 111
19.08.2020, 11:18  [ТС] 13
"То есть ЛоадерДиспенсер требует данных, которые должен обработать. Значит он зависит от принятых данных." Нет, данные не зависят от COM-порта. Они получается в следствии добавления записей в базы данных о типах устройства в том числе о том механика это или автоматика. Про разделение я понял.
Ресурс что указали, да код схожий просто дополнительно были еще методы.
Поюзаю код который Вы предоставили. Однако сразу скажу, что данных в среднем (N*K*10) + (K + N), то есть обычно от 12 до 414 записей. Столько порт присылает данных, меньше 200 записей бывает крайне редко.

Добавлено через 7 минут
Алгоритм:
1. Вводим данные о устройствах различного типа, указываем их характеристики. Сохраняем в базах
2. loader в любой момент кода может быть запущен и он также получит данные, так как кода много я имею ввиду условий по работе с данными и их расчеты, то я загрузчик вызываю рядом с коннектом, чтобы просто не потеряться в многообразии выполняемых действий.
3. После последовательный порт устанавливает соединение с устройством (терминалом). Терминал может как отсылать данные не ожидая нажатия внутри программы на кнопку, так и возвращать их в ответ на запрос при нажатии на кнопку внутри программы.
4. Терминал не отправляет массу данных. Он отправляет только 3 строки данных. 2 строки это сообщение о том как ему живется и все ли хорошо, и 3 это данные. Каждый пакет такой это всего лишь 1 обработка данных. Таких производится в среднем 200. 12 обработок это для учебных устройств чисто проверить от нечего делать.
0
HF
547 / 362 / 100
Регистрация: 09.09.2011
Сообщений: 1,188
Записей в блоге: 2
19.08.2020, 11:21 14
Я пока "пас". Мне сложно понять связь/зависимость данные-пользователь(диалог)-функцияДиспенсора.

И вы так чётко и не сформирулировали, зачем именно нужен диалог и как его можно и нужно закрывать. Если это только оповещение о процессе загрузки данных (или уже загруженных), то диалог не нужен, так как он в итоге и закрыться сам должен. Решение: просто вывод в статусную строку "Данные загружаются", "Данные загрузились", "Данные обработаны" (и т.п.). Если нужно отменить процесс загрузки, то это тоже обычная кнопка "Отменить", которая доступна на момент процесса загрузки данных.

Цитата Сообщение от Yoms Посмотреть сообщение
По поводу loader, он подключается единожды, внутри находятся подключения ко множеству баз данных, в итоге он производит опрос, получает данные по условиям, и возвращает в том числе Dispenser, то есть устройства с дозаторами их характеристики, чтобы уже по ним производить заполнение данных я имею ввиду в конечный отчет пользователя.
Loader после получения первичных данных больше в работе не участвует.
Такая же история. Один раз загрузилось, но выполняется (в коде) только после загрузки каких-то данных (качество данных не понятно) и нажатия пользователем кнопки. Тогда это не инициализация, а пост процессинг, если оно всё-таки эти данные использует.
1
9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 111
19.08.2020, 11:21  [ТС] 15
Также существуют исключения для измерений, есть некоторые характеристики Dispenser, которые требуют до минуты стабилизации.
0
HF
547 / 362 / 100
Регистрация: 09.09.2011
Сообщений: 1,188
Записей в блоге: 2
19.08.2020, 11:25 16
Цитата Сообщение от Yoms Посмотреть сообщение
Алгоритм:
Быстро пробежался по тексту и сразу вопрос - где в этом алгоритме внешние действия пользователя? Зачем нужен диалог? И если нужен, то что от него зависит.
В остальном - это всё строится на событиях. Запустили события и они сами "руду добывают". Я же даже не спрашивал сколько строк и каких. Есть загрузчик данных с порта, есть обработчик (коллбек для результата). Они сами разберутся когда выполняться. Вы со стороны только можете управлять этим - выводить результаты (обращаться к полученным данным); видеть статус обработки; останавливать процесс и т.п.
1
9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 111
19.08.2020, 11:39  [ТС] 17
Поясняю: N - характеристика номиналов измерений, то есть номиналы объемов которые будут проверятся. K - количество каналов устройства по которым может проходить жидкость или сыпучие вещества. Dispenser - это метод который возвращает 1 строку. Строку устройства, по условию программы, что юзер с таким логином и паролем выбрал активным вот именно это устройство, его штатная работоспособность будет проверяться.
Как предполагаю работу с mb. Я предполагаю что требуется создать публичный dialogresult, после этого присвоить для него значение внутри метода который был выше с заполнением данных. И когда приходят данные на com-порт выявить каким либо условием что mb открыт. Если он открыт то просто нажимать Yes, то есть dialogresult = DialogResult.Yes, если же mb в данный момент не открыто, то никак не реагировать. Именно прошу учесть что в моем понимании это нажатие должно быть в асинхронном методе. То есть ничего не делать в остальных любых случаях, кроме случая открытого окна

Добавлено через 5 минут
Алгоритм с пояснением:
1. Пусть есть форма_А. Пользователь добавил туда данные о устройстве. Нажал кнопочку. Сохранилось в базе.
2. Пользователь перешел в форму_Б. Нажал подключить. Загрузился loader, который опросил базы данных. И установилось соединение с последовательным портом.
3. Юзер задал параметры: имя устройства, условия среды и другие показатели. Он нажал ок. Данные передались не в Dispenser а в глобальные переменные. Некоторые данные были преобразованы согласно формульным рядам и возвращены в теже переменные. После этого вызывается тот метод где dialogresult вызывается впервые. Туда попадают: коэффициенты расчета, номиналы, каналы.
После исходя из формул открываем цикл: а уже внутри цикла вызывается dialogresult. Это при нажатии на кнопку измерить

Добавлено через 6 минут
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
110
111
112
113
114
115
116
117
118
119
private void m_Logic(int nom, int chan)
        {
            string mes = String.Empty;
            try
            {
                string resp = String.Empty;
                DataRow row;
                char[] arr;
                List<string> headers = channelnames;
                for (int k = 1; k <= nom; k++)
                {
                    for (int j = 1; j <= chan; j++)
                    {
                        for (int i = 0; i <= 10; i++)
                        {
                            if (i == 0 && k == 1)
                            {
                                row = table.NewRow();
                                row["ves_1"] = headers[j - 1].ToString();
                                table.Rows.Add(row);
                                continue;
                            }
                            row = table.NewRow();
                            dialogserial = MessageBox.Show("Выполнить?", "В процессе ...", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                            if (dialogserial == DialogResult.Yes)
                            {
                           
                                Thread.Sleep(15000);
                            R:
                                cmp = cl_messages.ExecuteCommand_S(serial.BaseStream);
                                mes = cmp.ResponseList[cmp.ResponseList.Count - 1];
                                if (mes == "S A" || mes == String.Empty || mes == null || mes.Contains("?"))
                                {
                                    goto R;
                                }
                                arr = cmp.ResponseList[cmp.ResponseList.Count - 1].ToCharArray();
                                arr = Array.FindAll<char>(arr, (c => (char.IsDigit(c) || c == '.')));
                                resp = new string(arr);
                                resp = resp.Replace(".", ",");
                                resp = resp.Trim();
 
                                switch (j)
                                {
                                    case 1:
                                        row["ves_" + k.ToString()] = resp;
                                        if (factor)
                                        {
                                            row["vod_" + k.ToString()] = Math.Round(Convert.ToDecimal(resp) / coef, 4);
                                        }
                                        else
                                        {
                                            row["vod_" + k.ToString()] = Math.Round(coef * Convert.ToDecimal(resp), 4);
                                        }
                                        fr_sum_n1(Convert.ToDecimal(resp));
                                        fr_sum_sr1(dev.Sr(10, Convert.ToDecimal(resp)));
                                        break;
                                    case 2:
                                        row["ves_" + k.ToString()] = resp;
                                        if (factor)
                                        {
                                            row["vod_" + k.ToString()] = Math.Round(Convert.ToDecimal(resp) / coef, 4);
                                        }
                                        else
                                        {
                                            row["vod_" + k.ToString()] = Math.Round(coef * Convert.ToDecimal(resp), 4);
                                        }
                                        fr_sum_n2(Convert.ToDecimal(resp));
                                        fr_sum_sr2(dev.Sr(10, Convert.ToDecimal(resp)));
                                        break;
                                    case 3:
                                        row["ves_" + k.ToString()] = resp;
                                        if (factor)
                                        {
                                            row["vod_" + k.ToString()] = Math.Round(Convert.ToDecimal(resp) / coef, 4);
                                        }
                                        else
                                        {
                                            row["vod_" + k.ToString()] = Math.Round(coef * Convert.ToDecimal(resp), 4);
                                        }
                                        fr_sum_n3(Convert.ToDecimal(resp));
                                        fr_sum_sr3(dev.Sr(10, Convert.ToDecimal(resp)));
                                        break;
                                    case 4:
                                        row["ves_" + k.ToString()] = resp;
                                        if (factor)
                                        {
                                            row["vod_" + k.ToString()] = Math.Round(Convert.ToDecimal(resp) / coef, 4);
                                        }
                                        else
                                        {
                                            row["vod_" + k.ToString()] = Math.Round(coef * Convert.ToDecimal(resp), 4);
                                        }
                                        fr_sum_n4(Convert.ToDecimal(resp));
                                        fr_sum_sr4(dev.Sr(10, Convert.ToDecimal(resp)));
                                        break;
                                }
                                table.Rows.Add(row);
                            }
                            else
                            {
 
                            }
                        }
                    }
                }
            }
            catch (ArgumentOutOfRangeException exs)
            {
                MessageBox.Show(exs.Message);
            }
            catch (DivideByZeroException)
            {
                MessageBox.Show("Процесс завершен.", "Уведомление", MessageBoxButtons.OK);
            }
            catch (FormatException er)
            {
                MessageBox.Show("Произошла ошибка стабильного результата.", "Уведомление", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }
0
HF
547 / 362 / 100
Регистрация: 09.09.2011
Сообщений: 1,188
Записей в блоге: 2
19.08.2020, 11:39 18
Цитата Сообщение от Yoms Посмотреть сообщение
Как предполагаю работу с mb. Я предполагаю что требуется создать публичный dialogresult, после этого присвоить для него значение внутри метода который был выше с заполнением данных. И когда приходят данные на com-порт выявить каким либо условием что mb открыт. Если он открыт то просто нажимать Yes, то есть dialogresult = DialogResult.Yes, если же mb в данный момент не открыто, то никак не реагировать. Именно прошу учесть что в моем понимании это нажатие должно быть в асинхронном методе. То есть ничего не делать в остальных любых случаях, кроме случая открытого окна
Окей. Пусть будет ваш вариант. Я понял что вы хотите. Но тогда послушайте что я скажу.

1) MessageBox - ошибка. Это диалог, неуправляемый. Нельзя взять его и закрыть. Это абсолютно ошибочное действие. Как если бы за вас подпись кто-то ставил.
2) "Mb" (ваш термин) сделайте в Form. В ней публичное свойство IsOpened и видимо ещё статический публичный метод KillMeImmediately()
Решение.
- где вам нужно открываете эту форму Form1.OpenDialog().
- при открытии назначаем IsOpened = true
- любой код может обратиться к Form1.IsOpened
- если нужно - любой код может закрыть форму Form1.KillMeImmediately()
На форме будет написано то что вам нужно (статус, статическая информация и т.п.)
На форме соответственно можно добавить кнопку "Закрыть" для пользователя, которому нужно будет потыкать куда-нибудь.
Так пойдёт? никакой асинхронности не нужно. Это просто какая-то заглушка в вашем приложении.
1
9 / 1 / 0
Регистрация: 06.08.2018
Сообщений: 111
19.08.2020, 11:44  [ТС] 19
Я выложил большую часть кода метода где вызывается dialogresult посмотрите пожалуйста, возможно Вы скажете, что то еще. Да я понимаю, что тут не все чисто и гладко, также понимаю что далек от нормальной терминологии программиста, однако я же что то с этим делаю)))))
0
HF
547 / 362 / 100
Регистрация: 09.09.2011
Сообщений: 1,188
Записей в блоге: 2
19.08.2020, 11:45 20
Цитата Сообщение от Yoms Посмотреть сообщение
                            dialogserial = MessageBox.Show("Выполнить измерение?", "В процессе измерения...", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                            if (dialogserial == DialogResult.Yes)
этот код заменяем на мой "мистико-костыль-код" ))

C#
1
2
3
4
5
6
7
row = table.NewRow();
if(!Form1.IsOpened)
{
         var dResult = MessageBox.Show("Выполнить измерение?", "В процессе измерения...", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
         if (dResult == DialogResult.No) exit;
         Form1.Open();
}
То есть если диалог
  • ещё не открыт
    • то мы выводим вопрос - нужно ли нам это.
    • Если нет - выходим вообще.
    • Если да - открываем форму с инфой.
  • Если форма уже открыта
    • -- игнорируем и продолжаем цикл
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2020, 11:45

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

Как отследить что рестартит ПК
Я не спец по ОС и железу, подскажите как что делать :) Началось всё с того, что стал вылетать...

Как определить, что сторонний процесс показал MessageBox
Вот запускаю процесс Shell(Path, AppWinStyle.NormalFocus) При запуске мне процесс выдает...

Как сделать, что бы строка сообщения в MessageBox была полужирной
Здравствуйте! Как сделать, что бы строка была полужирной?

Как сделать так, что в MessageBox отображалась активная ссылка
Подскажите как сделать так, что в MessageBox отображалась активная ссылка. ...

Как отследить что стало инициатором вызова формы и как это использовать?
Здравствуйте) В общем задача, как мне видится тривиальная) но что то не могу придумать решение....

Как отследить, что пользователь закрыл форму?
Добрый день! Подскажите, как отследить, что именно пользователь, а не программа закрыла форму? У...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.