Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: MFC: что выбрать SDI или просто диалог  (Прочитано 9995 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« : 23-06-2010 09:47 » 

Я запуталась. Просто направьте, куда тыркнуться.
Задача:
есть прибор, подключенный к СОМ-порту, посылаю ему информацию и получаю от него ответ.
Ответ или 16 байт, или в цикле ,пока не остановишь.
Тестов и режимов много, много входных разных настроек, вывод подученных данных на экран или по потребности в файл.

Решила использовать MFC, чтобы не тратить время на написание многочисленных меню и настроек.
Начала писать , используя просто Диалог с меню + доп.диалоги для настроек.
Временно решила,что результат вывожу в поле Edit на весь экран.(неудачный вариант для большого количества информации).

Подскажите, как грамотней организовать вывод результата на экран?
По какому из 3-х путей всё-таки пойти в MFC (MDI, SDI или продолжать писать в Dialog)?

"Только не бросайте меня в терновый куст"
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 23-06-2010 09:55 » 

CEdit  пойдёт, только надо шрифт для диалога выбрать моноширинный (например Courier) , чтобы колонки не расползались Улыбаюсь Это можно в редакторе ресурсов сделать

Dialog-based приложение тоже пойдёт для тестов. А там посмотришь
Записан

ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #2 : 23-06-2010 10:21 » 

Да, пока обходилась Dialog-based.
Но, сейчас переписываю циклический запуск сценария - в DOSе вывод результата шёл, пока не нажимали какую-либо клавишу.
(вот еще доп.вопрос: Как это осуществить? Какое событие может закончить этот бесконечный опрос?)

Сейчас 500 циклов запускала(задала кол-во опросов), и только по окончании их вывелась иформация в CEdit.
Что делать,чтобы результаты появлялись на экране во время опроса? Поток организовывать или что?
Записан
x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 23-06-2010 11:14 » 

в цикле обновлять содержимое окна. WM_UPDATE или типа того.
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 23-06-2010 11:59 » 

Если данных очень много и их изменение хочется видеть в (почти) реальном времени, то тут возникает проблема медленной отрисовки графики. Под ДОС  в текстовом режиме такой проблемы не было.

Решение - FIFO-буфер. Порт пишет в него данные, окно забирает по мере возможности.

Это так к слову. Теперь по теме.

1. MFC SDI очень даже подойдёт.
2. CEdit? Для отображения? а) из пушки по воробьям; б) при хороших скоростях будет очень медленным. Гораздо быстрей собственное окно вывода, которое кстати и завязать с FIFO-буфером.

зы Эти решения были использованы в реальном проекте для тестирования приборов подключаемых к различным портам COM, LPT, USB, IEEE1394.
« Последнее редактирование: 23-06-2010 12:03 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #5 : 23-06-2010 12:08 » 

Джон, там пока дело не в отрисовке, а в том, что цикл не отдаёт управление основному потоку, пока не завершится. поэтому пока идёт цикл - окно "пустое", даже если реально в нём что-то есть, оно просто проапдейтиться не успевает. выход - внутри самого цикла заставлять перерисовываться окно. тупо слать ему соответствующую мессагу или использовать какие-то методы класса: Update, Invalidate - как там это у вас называется? скорость упадёт, на больших объёмах - упадёт на порядок, но инфа будет выводится в окне сразу. как вариант, можно обновлять CEDIT не на каждой итерации цикла, а на 5-й - 10-й.
Записан

ann_nef
Помогающий

ru
Offline Offline
Пол: Женский

« Ответ #6 : 23-06-2010 13:00 » new

Буду пробовать.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 23-06-2010 14:55 » 

Джон, отображение в CEdit тормозить не будет, ведь перерисовку можно сделать не чаще, чем, скажем, раз в полсекунды. Я так делал ))

ann_nef, поток - самое удобное. Ну а можно и подпинывать очередь сообщений в цикле основного потока, классика

Код:
	MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

но это всё потом боком как-нибудь выйдет. А вот если приложение не будет более ничего особенного делать - пусть и так сойдёт )
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 24-06-2010 07:30 » 

Джон, отображение в CEdit тормозить не будет, ведь перерисовку можно сделать не чаще, чем, скажем, раз в полсекунды.

Лёш, я ведь не просто так это говорю. Если у тебя мегабайты шуруют на 115200 бод (например, когда парни из Siemens сканируют чековые книжки в цвете, а на компах стоит WinNT 4, которая про USB ни сном ни духом), то он заткнётся как пить дать. Я просто через всё это был прошёл и даже начинал с CEdit, поэтому выложил готовые решения.

CEdit по натуре медленный. Ведь для подобного отображения необходимо сделать его многострочным, значит каждый раз будет включаться логика проверки переноса строки. Плюс скролл. Да ещё не забывай о максимальном размере данных для CEdit, который придётся увеличивать. А как? Динамически? Или сразу установить максимальное значение, которое кстати тоже конечно? Короче, его можно использовать ТОЛЬКО в качестве "пабысраму протестить", но не как окно вывода данных для данной задачи. Ды ты только представь себе как ты будешь его апдейтить! Тебе придётся перелопачивать кучу текста, добавляя к существующему новые строки, каждый раз снова его инициаллизируя. Это оооочень меееедленно. Да просто открой в Блокноте большой текстовый файл и засеки время. Поймёшь о чём я говорю.

Своё же окно свободно от этих недостатков. Во-первых, ты всегда знаешь сколько данных необходимо в нём отобразить (размер окна тебе известен и размер отображаемой строки тоже). Значит ты забираешь только эти последние данные из FIFO-буфера сразу, куском. Поскольку это окно у тебя напрямую связано с FIFO-буфером, оно является как бы отображением его состояния и никаких проблем с апдейтом окна не возникает, при условии конечно, что буфер заполняется другим тредом, но это ессно. Во-вторых, логика скролла тоже в твоих руках. Ну и в-третьих, дизайн отображения тоже имеет значение. В своём окне ты можешь, например, сделать линии, отделяющие столбцы с инфой, отображать данные в виде символов, ESC- и/или HEX-значений и тд и тп. Вот примерно так:



а это с доп инфой



зы Использование TranslateMessage-DispatchMessage является практически стандартным решением подобной проблемы, о чём неоднократно мы говорили здесь на форуме, и никаких "потом боком как-нибудь" не выйдет. Ага "И кильками в наш век гораздо легче отравиться, нежели водкой. Пейте смело." (с) Булгаков

* ss1.gif (21.95 Кб - загружено 1393 раз.)
* ss2.gif (20.1 Кб - загружено 1299 раз.)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 24-06-2010 07:33 » 

Ну, коли не выйдет - хорошо Улыбаюсь Но выйти может, если поток не один
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 24-06-2010 07:40 » 

Даже если не один. У меня изначально UI развязано с портами и транслятором.

зы Ты про сообщения? Так и не надо их тогда, они именно нужны в одном потоке, когда апдейт окон задерживается.
« Последнее редактирование: 24-06-2010 07:42 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 24-06-2010 08:06 » 

ну для этого случая - да
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines