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

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

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

« Ответ #30 : 06-07-2012 17:41 » new

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

Лучше уж вывод в контролы и UpdateWindow по таймеру.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zubr
Гость
« Ответ #31 : 06-07-2012 18:04 » 

Цитата
Насколько я понял, это древнегреческий эквивалент "моему" трюку.
Ну так этот трюк - ключевой, чтобы программа могла получать очередь сообщений.
Кстати, не обязательно из таймера запускать цикл, можно PostMessage вызвать на пользовательское сообщение, в котором запускать цикл.
Dimka, почему не  будет работать нажатие клавиш? - while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) AfxGetApp()->PumpMessage();
Записан
Dimka
Деятель
Команда клуба

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

« Ответ #32 : 06-07-2012 19:42 » 

zubr, тут, конечно, MFC, и поэтому вызов WinAPI не зазорен. Но я придерживаюсь правила, что если используешь оболочку, библиотеку или фреймворк, пиши по правилам и в соответствии с идеологией этой оболочки, библиотеки или фреймворка. И если на уровне библиотеки такой трюк отсутствует, то уж лучше с таймером. К тому же обновлять окошко быстрее способности человека увидеть результат смысла нет, а бесконечный цикл загрузит ядро CPU под завязку.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

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

« Ответ #33 : 08-07-2012 21:40 » 

Окно, конечно, будет перерисовываться. Но его будет не закрыть, нажатия на кнопки не будут работать. Плохая затея.

В данном случае ты споришь с очевидным фактом: и окно перерисовывается и кнопки замечательно работают.

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

О чём я говорю (говорил) с самого начала. Нууу можно ещё, и ещё раз повторить. Ага

Цитата
Кстати, не обязательно из таймера запускать цикл, можно PostMessage вызвать на пользовательское сообщение, в котором запускать цикл.

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

zubr, тут, конечно, MFC, и поэтому вызов WinAPI не зазорен. Но я придерживаюсь правила, что если используешь оболочку, библиотеку или фреймворк, пиши по правилам и в соответствии с идеологией этой оболочки, библиотеки или фреймворка.

Нууу даже с этой точки зрения, нет никаких противоречий твоим правилам: PumpMessage объекта CWinThread очень даже MFC. Ага В частности:

Цитата
You can call PumpMessage directly to force messages to be processed

С единственной рекомендацией:

Цитата
Calling PumpMessage directly and overriding its default behavior is recommended for advanced users only.

Ну я думаю на них мы уже тянем. Ага

Цитата
К тому же обновлять окошко быстрее способности человека увидеть результат смысла нет, а бесконечный цикл загрузит ядро CPU под завязку.

Да, в самом общем случае. Но в данном на этот счёт никаких указаний в задании нет. Может результаты будут фиксироваться высокоскоростной видеокамерой.  Отлично А если серьёзно, то если таковые и возникнут, например, считывать или отображать данные в единицу времени, то и они решаются элементарным вызовом Sleep() в цикле, на радость процессору.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
ann_nef
Помогающий

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

« Ответ #34 : 09-07-2012 08:08 » 

Ого, сколько написали, я не заходила на форум несколько дней.
Докладываю всем, что естественно сделала глупость, когда цикл в OnInitDialog  засунула.
Поэтому переместила все в обработку нажатие кнопки, всё заработало и в боевой программе (то,что Джон  предложил - прерывание цикла с помощю PeekMessage).
Получается, что пользователю лишний клик надо делать, что самой не очень нравится,но пока так.
Вернусь из отпуска, попытаюсь сделать по-другому, посимпатичней.
Вне зависимости от этой задачи, обязательно разберусь с потоками и FIFO c вашей помощью.
Спасибо всем и до послеотпуска.
Записан
Джон
просто
Администратор

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

« Ответ #35 : 09-07-2012 09:37 » 

Получается, что пользователю лишний клик надо делать, что самой не очень нравится,но пока так.

Посмотри решение с таймером. Там только пару строчек добавить.

СТОП!!! только сейчас заметил ключевую фразу: "Этот бесконечный цикл поставила в OnInitDialog". Чесслово я бы удивился, если бы ТАК работало. Ага Само название Init уже подразумевает отсутствие каких либо иных действий, кроме инициаллизации.

Значит так. Быстренько добавляешь таймер на 100-250 мс, и запускаешь его в OnInitDialog. А уже по таймеру вызываешь ф-ю с циклом. Таймер ессно тут же убиваешь.


Код здесь https://forum.shelek.ru/index.php/topic,28774.msg281524.html#msg281524

Цитата
Ого, сколько написали, я не заходила на форум несколько дней.

Вот это-то и плохо, что МНОГО всякой воды, поэтому основное и не видно.
« Последнее редактирование: 09-07-2012 09:39 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
ann_nef
Помогающий

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

« Ответ #36 : 10-07-2012 04:48 » 

Спасибо, Джон. Скачала. Буду разбираться.
Записан
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines