Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.03;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.031 c
15-1199197702
Denis__
2008-01-01 17:28
2008.02.03
CLSID


3-1190718421
Nemec
2007-09-25 15:07
2008.02.03
Обновление данных на форме под InterBase


2-1199966099
E
2008-01-10 14:54
2008.02.03
Запустить EXE файла из Основного не прибегая к разрезанию и без..


15-1197891695
data
2007-12-17 14:41
2008.02.03
а кто куда носит компы в ремонт?


15-1199064852
SerJaNT
2007-12-31 04:34
2008.02.03
mod_rewrite & PHP