Russian Qt Forum
Апрель 28, 2024, 13:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 ... 5   Вниз
  Печать  
Автор Тема: Переходничок  (Прочитано 43490 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Сентябрь 07, 2010, 14:33 »

Добрый день

Хочу поддержать хорошую инициативу. Класс выглядит несколько странным, но без таких маленьких классов проект не живет нормально, все "слипается" в кучу. Обратите внимание что он не тащит ни одного #include. Ну const char * не есть аккуратно, по уму здесь надо template. Но не суть

Код
C++ (Qt)
#ifndef MESHPROGRESS_H
#define MESHPROGRESS_H
 
struct CMeshProgress {
CMeshProgress ( void );
virtual ~CMeshProgress                  ( void );
 
virtual bool _Update ( long cur );
virtual void _SetIndicator        ( const char * text, long maxNum );
 
static bool Update ( long cur, long step );
static void SetIndicator ( const char * text, long maxNum );
 
// data members
static CMeshProgress * mInstance;
};
 
inline CMeshProgress::CMeshProgress( void )
{
mInstance = this;
}
 
inline CMeshProgress::~CMeshProgress( void )
{
mInstance = 0;
}
 
inline bool CMeshProgress::_Update( long cur )
{
return true;
}
 
inline void CMeshProgress::_SetIndicator( const char *, long )
{
}
 
inline bool CMeshProgress::Update( long cur, long step )
{
if (((cur + 1) % step) != 0) return true;
return mInstance ? mInstance->_Update(cur) : true;
}
 
inline void CMeshProgress::SetIndicator( const char * text, long maxNum )
{
if (mInstance)
mInstance->_SetIndicator(text, maxNum);
}
#endif // MESHPROGRESS_H
 


Edit (2 дня спустя): по просьбе модератора добавляю описание.

Как известно, проект делится на части/модули. Одна из главных задач сделать модули как можно более независимыми друг от друга. Одно из самых простых требований: не раскидывать UI везде, не позволять UI проникать в расчетные части. Иначе когда появится очередной портинг (или потребуется версия с командной строкой) - придется пожалеть о содеянном.

Предлагаемый класс есть очень простой пример "развязки" UI и расчетов. Расчетам нужен UI индикатор, т.к. они могут длиться минуты. Но никаких QProgressDialog, сигналов - никаких подробностей реализации UI в расчетах быть не должно. Использование может выглядеть так:

Код
C++ (Qt)
int CMeshCalculator::CalcNormals( void )
{
 CMeshProgress::SetIndicator("Calculating Normals", mNormals.size());
 ...
 for (size_t i = 0; i < count; ++i) {
  ..
  if (!CMeshProgress::Update(i, 100))
   return ERR_USER_CANCEL;
  ..
  Calc1Normal(..);
 }
}
 
Т.к. CMeshProgress по умолчанию ничего не делает, то его можно безболезненно долить во все расчеты. Перед началом расчетов др. модуль зарядит конкретное UI индикатора - это может быть QProgressDialog, а может и печатание точек в командной строке.

Признаться, я был удивлен что такая банальная вещь вызвала такие трудности с understand'ом  Улыбающийся
« Последнее редактирование: Сентябрь 09, 2010, 10:33 от Igors » Записан
Karl-Philipp
Гость
« Ответ #1 : Сентябрь 07, 2010, 15:13 »

Расскажите, пожалуйста, для чего нужен этот класс (с примером желательно) Улыбающийся? И как проект не сможет жить без него нормально?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 07, 2010, 15:26 »

Расскажите, пожалуйста, для чего нужен этот класс (с примером желательно) Улыбающийся? И как проект не сможет жить без него нормально?
Полный ответ на этот вопрос занял бы много страниц - и все равно, вероятно, не был бы полным. Я не знаю как объяснить, я просто понял что надо так делать  Улыбающийся
Записан
Denjs
Гость
« Ответ #3 : Сентябрь 07, 2010, 16:20 »

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


 фи... :`(
« Последнее редактирование: Сентябрь 07, 2010, 17:01 от Denjs » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Сентябрь 07, 2010, 16:59 »

Igors пример использования давай
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Сентябрь 07, 2010, 17:10 »

Я не собираюсь с кем-то спорить (не стоит оно того). Просто есть МЫСЛИ которые программист придумал сам. И есть тупенькое копирование учебного примера. Если сравнить технически - учебный пример гораздо более совершенен, свои мысли всегда содержат много ошибок и субъективный взгляд автора, это неизбежно. Но как ни старайся, а на учебном примере далеко не уедешь, в реальной работе очень быстро придется решать самому. А поэтому мысли важнее, пусть они в 100 раз менее совершенны.

Не следует подходить к этому разделу потребительски, как к документации Assistant. У "троллей" - да и у любой
нормальной компании есть своя "creative lab" мы видим только "выход" - в понятной, доступной форме. Но в рамках "creative lab" вопросы типа "а что я могу использовать/полагаться" неуместны, это не букварь. Здесь надо иметь свое мнение и (увы) - это многих раздражает  Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 07, 2010, 17:12 »

Igors пример использования давай
Юра, не могу, это человек должен сам догнать  Улыбающийся
Записан
zenden
Гость
« Ответ #7 : Сентябрь 07, 2010, 17:18 »

Ну хотя бы написали переходник от чего к чему.
От нестатической функции к статической?
Записан
Denjs
Гость
« Ответ #8 : Сентябрь 07, 2010, 17:31 »

Я не собираюсь с кем-то спорить (не стоит оно того). Просто есть МЫСЛИ которые программист придумал сам. И есть тупенькое копирование учебного примера. Если сравнить технически - учебный пример гораздо более совершенен, свои мысли всегда содержат много ошибок и субъективный взгляд автора, это неизбежно. Но как ни старайся, а на учебном примере далеко не уедешь, в реальной работе очень быстро придется решать самому. А поэтому мысли важнее, пусть они в 100 раз менее совершенны.

Не следует подходить к этому разделу потребительски, как к документации Assistant. У "троллей" - да и у любой
нормальной компании есть своя "creative lab" мы видим только "выход" - в понятной, доступной форме. Но в рамках "creative lab" вопросы типа "а что я могу использовать/полагаться" неуместны, это не букварь. Здесь надо иметь свое мнение и (увы) - это многих раздражает  Улыбающийся
Тогда вы разделом ошиблись... имхо.. нет? это кладовая _готовых_ решений? (т.е. тот самый  ""выход" - в понятной, доступной форме") или "биореактор-мысле-теней"? публиковать код даже без обяснения его применимости - зачем засорять пространство? я так тоже могу понавыкладывать много чего из ссылок в подписи...  

ваше дело конечно, на этот случай есть модераторы, но моё вам "фи"... ;(
« Последнее редактирование: Сентябрь 07, 2010, 17:38 от Denjs » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Сентябрь 07, 2010, 18:14 »

Ну хотя бы написали переходник от чего к чему.
От нестатической функции к статической?
Статические ф-ции здесь удобны/выгодны потому что они позволяют каким-то частям проекта использовать это класс без всяких дополнительных усилий. По этой же причине ф-ции не объявлены как pure virtual (= 0).
Записан
Sancho_s_rancho
Гость
« Ответ #10 : Сентябрь 07, 2010, 18:28 »

Дергаем статические функции. Если экземпляр класса создан, то статические функции будут дергать его члены. По вкусу можно отнаследоваться. Любопытно посмотреть применение. Вопрос: а почему даже assert не стоит в конструкторе. Начнет кто-то дорабатывать твою программу, создаст еще экземпляр класса и у первого (какой из них будет "первым" еще  вопрос) все перестанет работать.  Или я что-то не так понял?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Сентябрь 07, 2010, 18:38 »

Или я что-то не так понял?
Совсем не понял  Улыбающийся Никакой "подкрутки" в классе нет - дело в функциональности
Записан
Pretorean
Гость
« Ответ #12 : Сентябрь 07, 2010, 18:49 »

это конкурс "догадайся зачем это нужно" ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Сентябрь 07, 2010, 19:03 »

это конкурс "догадайся зачем это нужно" ?
Ну если в Вашем проекте таких проблем (пока) не возникло - незачем тратить время на догадки  Улыбающийся
Записан
zenden
Гость
« Ответ #14 : Сентябрь 07, 2010, 20:00 »

Особенно интересно будет послушать про использование этого класса в многопоточных программах  Смеющийся
Записан
Страниц: [1] 2 3 ... 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.095 секунд. Запросов: 22.