Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];

Вниз

ProgressViewer   Найти похожие ветки 

 
Loginov Dmitry ©   (2007-12-18 10:19) [0]

Вышло обновление модуля визуализации длительных операций ProgressViewer.
Скачать его можно по адресу:
http://matrix.kladovka.net.ru/download.php?getfilename=uploads/other/progressviewer.zip

Возможности обновленного модуля Вы можете посмотреть, запустив демку.

Если Вы считаете, что в модуле чего-то нехватает, или обнаружите какой-либо глюк, напишите об этом!


 
oldman ©   (2007-12-18 10:23) [1]

А какая по длительности операция нужна для теста?
А то я стараюсь избегать в программе окон "Ждите, думаю..."


 
Альф   (2007-12-18 11:10) [2]

Оформление кода замечательное :)

По мелочи:
№1. Возможность использовать собственную форму.
или же
№2. Использовать окно с заголовком и крестиком. Юзерам лень тянуться за ESC, любят нажимать на крестик...
№3. Использовать стандартный ProgressBar.
№4. Использование задаваемых юзером сообщений и стиля вывода. Вот эти все SProductName, SLine1 и т.п.

№5. Вызов оформить вот так
with TProgressViewer.Create("", False) do try
// some work...
finally
   Free();
end;


Также непонятна необходимость создания вот этого
 WndHandleList := TThreadList.Create;
 ThreadsList := TList.Create;


 
Slym ©   (2007-12-18 11:45) [3]

Ну и цветовая схема... Win3.11?
баги:
1. бегунок наезжает на прарую свою границу...
2. если бегунок постепенно скрывается справа, то почему "резко" появляется слева?
3. Основная форма "висит" :) несмотря на выкрутасы с потоками...
4. Если запускаю "долгий запрос" в доп потоке "Отмена" не канает но окошку ожидания уже конец
5. Не проверено, но - Если ProgressMethod выполнится не вызвав принудительно Terminate прогреса, то прогресс будет прогрессировать до опупения!
6. Вызов Windows.MessageBox(Handle,"1","1",0) может приводить к некоторым "нестабильным" проблемам


 
Rouse_ ©   (2007-12-18 11:46) [4]

procedure TProgressViewer.AddStringInfo(LineNumber: Integer; AText: string;
 TextAlignment: TAlignment = taRightJustify; ALineBreak: Boolean = False;
 AFontColor: TColor = clBlack; AFontStyle: TFontStyles = [];
 AFontSize: Integer = 8; AFontName: string = "MS Sans Serif");

Имхо лучше оформить передачу параметров в виде record, а то слишком много всего...

В DoCancelByUser, DrawProgress и Execute глухой except

Практически везде не изменяемый в теле процедур string параметр передается без префикса const


 
Loginov Dmitry ©   (2007-12-18 11:50) [5]


> Оформление кода замечательное :)


Не сомневаюсь!


> №1. Возможность использовать собственную форму.


Используй! Кто мешает? Исходники открыты.


> №2. Использовать окно с заголовком и крестиком. Юзерам лень
> тянуться за ESC, любят нажимать на крестик...


Можешь заголовок добавить. Лично я не вижу необходимости в кнопке "Закрыть". Кнопка "Отмена" более наглядна.


> №3. Использовать стандартный ProgressBar.


Если не устраивает то, что предложено, можеть использовать стандартный ProgressBar. Это не сложно сделать. Но я в этом не вижу никакой необходимости - только дополнительная нагрузка на процессор.


> №5. Вызов оформить вот так


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


> Также непонятна необходимость создания вот этого


Если лень читать исходники, поясню: это сделано для того, чтобы но Handle окна, переданного в оконную функцию, найти объект TProgressViewer, породивший данное окно и вызвать его метод DoCancelByUser (если пользователь нажал кнопку "Отмена").


 
Loginov Dmitry ©   (2007-12-18 11:52) [6]

Ну вот уже более конструктивные замечания! Отвечу чуть позже!


 
Slym ©   (2007-12-18 11:53) [7]

а это мой прогрессбар, правда слабая бета версия :) http://ifolder.ru/4607526
полностью гуевый (отсюда медленней чем [0]) с примерами


 
Slym ©   (2007-12-18 11:57) [8]

Slym ©   (18.12.07 11:45) [3]
6. Вызов Windows.MessageBox(Handle,"1","1",0) может приводить к некоторым "нестабильным" проблемам

у меня запуск IE перехватил на себя модальность Мессаж бокса с вытекающими отсюда последствиями:
1. активация месажбокса активирует IEApp.
2. Закрытие программы вызывает определенные траблы...
3. IE после этого остался "замодаленым" т.е. не принимал фокуса ввода
4. проверено несколько раз: результаты разные


 
Kolan ©   (2007-12-18 11:59) [9]

> хо лучше оформить передачу параметров в виде record, а то
> слишком много всего&#133

И называется это Long params list


 
Семер Сурков   (2007-12-18 12:57) [10]

Я не специалист в winapi, но тема меня заинтересовала, т.к. мне тоже нужно будет делать progress в отдельном окне. Почему бы не поучиться у других?

Однако критика.

Вызывает большое сомнение правомерность строчки

SendMessage(FhWindow, WM_PAINT, Integer(Self), 0);

в методе DrawProgress. Ибо MSDN по поводу WM_PAINT говорит:

>>The WM_PAINT message is generated
>>by the system and should not be
>>sent by an application.

Наверное это неспроста написано?

Я тут переписал немного - использую InvalidateRect, вместо явной посылки WM_PAINT. Вот, посмотри, если интересно http://ifolder.ru/4608234.

Думаю, что так будет правильней :)


 
Loginov Dmitry ©   (2007-12-18 13:00) [11]


> Ну и цветовая схема... Win3.11?


Не знаю :) Для фона используется clBtnFace. Делал как можно проще, но с необходимой функциональностью.


> 2. если бегунок постепенно скрывается справа, то почему
> "резко" появляется слева?


Как-то не замечал этого :)


> 3. Основная форма "висит" :) несмотря на выкрутасы с потоками...


Ну а модуль-то здесь причем? :)


> 4. Если запускаю "долгий запрос" в доп потоке "Отмена" не
> канает но окошку ожидания уже конец


тут я ничего не скажу. Попросту ни разу не тестил! :)


> 5. Не проверено, но - Если ProgressMethod выполнится не
> вызвав принудительно Terminate прогреса, то прогресс будет
> прогрессировать до опупения!


Верно! Поэтому в нет необходимо вызывать Terminate!


> 6. Вызов Windows.MessageBox(Handle,"1","1",0) может приводить
> к некоторым "нестабильным" проблемам


У меня вообще Windows.MessageBox никак не работает! С Application.MessageBox проблем вроде нет :) Интересно, почему с Windows.MessageBox такой касяк?


> procedure TProgressViewer.AddStringInfo(LineNumber: Integer;
>  AText: string;
>  TextAlignment: TAlignment = taRightJustify; ALineBreak:
>  Boolean = False;
>  AFontColor: TColor = clBlack; AFontStyle: TFontStyles =
> [];
>  AFontSize: Integer = 8; AFontName: string = "MS Sans Serif");
>
> Имхо лучше оформить передачу параметров в виде record, а
> то слишком много всего...


Добавлю для записей дополнительный метод.


> В DoCancelByUser, DrawProgress и Execute глухой except


А кто его будет обрабатывать в случае возникновения? Лучше уж заглушить, чем допустить вылет из Execute, имхо.


> у меня запуск IE перехватил на себя модальность Мессаж бокса
> с вытекающими отсюда последствиями:
> 1. активация месажбокса активирует IEApp.
> 2. Закрытие программы вызывает определенные траблы...
> 3. IE после этого остался "замодаленым" т.е. не принимал
> фокуса ввода
> 4. проверено несколько раз: результаты разные


Сейчас на это я могу одно сказать: не вызывай Windows.MessageBox при выполнении цикла :) А если серьезно, то необходимо разобраться, почему так происходит и найти способ обхода данной баги...


 
Loginov Dmitry ©   (2007-12-18 13:03) [12]


> Вызывает большое сомнение правомерность строчки
>
> SendMessage(FhWindow, WM_PAINT, Integer(Self), 0);


Вроде не замечал никаких проблем с этим. По крайней мере до сих пор все работало :)


> Я тут переписал немного - использую InvalidateRect, вместо
> явной посылки WM_PAINT. Вот, посмотри, если интересно http:
> //ifolder.ru/4608234.


пишет типа "файл не найден" (


 
Rouse_ ©   (2007-12-18 13:05) [13]


> А кто его будет обрабатывать в случае возникновения?

Как это кто? :) Программист :)


 
Семен Сурков   (2007-12-18 13:07) [14]

2Автор

В доке сказано, надо выполнять.

Еще раз
http://ifolder.ru/4608338


 
Loginov Dmitry ©   (2007-12-18 13:41) [15]


> В доке сказано, надо выполнять.
>
> Еще раз
> http://ifolder.ru/4608338


Спасибо! Не знал про такой подход! И при этом никакие глобальные списки становятся ненужными! :)


 
Kerk ©   (2007-12-18 14:04) [16]

Вот как раз в таком окошке можно рекламу показывать :))))))))))))))))


 
clickmaker ©   (2007-12-18 14:10) [17]


> [16] Kerk ©   (18.12.07 14:04)

слабо замутить рекламную картинку, которая одновременно будет прогресс-индикатором? :)


 
Slym ©   (2007-12-18 14:36) [18]

Loginov Dmitry ©   (18.12.07 13:00) [11]
6. Вызов Windows.MessageBox(Handle,"1","1",0) может приводить
> к некоторым "нестабильным" проблемам
У меня вообще Windows.MessageBox никак не работает! С Application.MessageBox проблем вроде нет :) Интересно, почему с Windows.MessageBox такой касяк?

это косяк  with TProgressViewer :) я сам акарал :)


 
Loginov Dmitry ©   (2007-12-18 15:40) [19]


> это косяк  with TProgressViewer :) я сам акарал :)


Вашу машу! Угарно :)
Handle относится к TProgressViewer! :)


 
Loginov Dmitry ©   (2007-12-23 14:58) [20]

> [14] Семен Сурков   (18.12.07 13:07)


К сожалению, предложенный Вами вариант не является надежным. Все дело в хакерской функции Classes.MakeObjectInstance. Она выполняет ряд подмен, в результате которых в качестве оконной процедуры будет вызван переданный метод. Данная функция не является потокобезопасной, т.к. изменяет ряд глобальных переменных без использования критической секции. Если одновременно с моим окном будет создана VCL-форма, то это может привести к краху программы.


 
Семен Сурков   (2007-12-25 10:21) [21]


> Loginov Dmitry ©   (23.12.07 14:58) [20]
> > [14] Семен Сурков   (18.12.07 13:07)
> К сожалению, предложенный Вами вариант не является надежным.


ну-ну :)
вам, видимо, виднее.


 
Семен Сурков   (2007-12-25 12:29) [22]

2автор
как-то у тебя неряшливо написано многое.
вот ты класс регистрируешь RegisterClass, результат не проверяешь.
а вообще говоря второй и далее разы дает ошибку, т.к. CreateNewWnd выполняется для каждой формы


 
Loginov Dmitry ©   (2007-12-25 23:03) [23]

> вот ты класс регистрируешь RegisterClass, результат не проверяешь.
> а вообще говоря второй и далее разы дает ошибку, т.к. CreateNewWnd
> выполняется для каждой формы


ценное замечание! Спасибо! Действительно, при текущем подходе в условиях многопоточности можно огрести проблемы. Не зная алгоритма работы функции RegisterClass, можно предположить, что вызвов функции CreateWindowEx для одного потока произойдет раньше, чем класс успеет зарегистрироваться (в другом потоке).


> как-то у тебя неряшливо написано многое.


так уж и многое!? ))


 
Семен Сурков   (2007-12-26 11:15) [24]


> > как-то у тебя неряшливо написано многое.
> так уж и многое!? ))


если честно, то почти все. без обид.

я не большой спец (вернее просто почти ламер) в winapi, но правильный и аккуратный код отличу, от кода с потенциальными ошибками :)

очень, кстати, советую посмотреть исходники Розыча http://rouse.drkb.ru, относящиеся к winapi. бери пример - аккуратно, и почти (ну я то всегда найду, что-то по сути :p) придраться не к чему.


 
Ketmar_   (2007-12-26 12:14) [25]

как это — «не к чему»? если Партия прикажет, мы и к begin end; придерёмся!


 
Loginov Dmitry ©   (2007-12-26 12:52) [26]


> если честно, то почти все. без обид.
>
> я не большой спец (вернее просто почти ламер) в winapi,
> но правильный и аккуратный код отличу, от кода с потенциальными
> ошибками :)


Я с твоего пинка нашел тут еще несколько потенциально опасных мест ))
Позже выложу исправления.


 
Loginov Dmitry ©   (2007-12-28 01:00) [27]

Учтя все замечания и пожелания, изложенные в данной ветке, я внес в модуль соответствующие исправления. Обновленная версия доступна для скачиваний по тому же адресу.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.044 c
15-1196883191
Rouse_
2007-12-05 22:33
2008.02.03
Традиционное предновогоднее ММР


2-1200065240
AntonUSAnoV
2008-01-11 18:27
2008.02.03
перевод типа word в string


2-1199749264
гость
2008-01-08 02:41
2008.02.03
двоичная запись


15-1198677259
Ega23
2007-12-26 16:54
2008.02.03
поделитесь ссылкой


2-1199779394
Zheksik
2008-01-08 11:03
2008.02.03
Варианты решения задачи сравнения вещественных чисел.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский