Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

label, принудительный вывод на экран

44K
07 января 2011 года
FeelUs
57 / / 10.05.2010
требуется в процессе работы длительного процесса отображать меткой, ну например, некоторую переменную,

но во время работы этого процесса при присваивании labelx.caption чего-либо, и даже при вызове labelx.show метка на экране остается неизменной, и меняется только по завершении этого просесса

подскажите пожалуйста можно ли это реализовать, и если да то как?
8
07 января 2011 года
mfender
3.5K / / 15.06.2005
то что происходит в том "длительном процессе", должно происходить в отдельном потоке. Это правильно уже хотя бы потому, что у тебя всё приложение висит и даже его окно не пошевелишь, пока процесс не закончится. Ищи в сторону TTread. Например, тут - http://www.intbook.info/delphi/Glava29/Index6.html

А у ж там синхронизируй свои label'ы с тем что происходит в потоке.
44K
07 января 2011 года
FeelUs
57 / / 10.05.2010
с потоками я хотел разобраться попозже,
а сейчас мне нужен ринудительный вывод label'a
то, что мое приложение висит полминуты - меня не огорчает, пока
рисование на конве отображается, лог в memo отображается, а метки не отображаются
8
07 января 2011 года
mfender
3.5K / / 15.06.2005
Лучше не затягивать, а освоить потоки. Оно того стоит, тем более, что иначе никак не получится.
278
07 января 2011 года
Alexander92
1.1K / / 04.08.2008
Извращенный вариант - повесить таймер и каждые n мс вызывать Refresh формы. Либо
 
Код:
Application.ProcessMessages;

после изменения значения переменной. А без извращения - только с потоками действительно...
6
07 января 2011 года
George
4.1K / / 05.01.2007
Потоки штука хорошая, изучить стоит. Особенно с появлением в последних версиях дельфи анонимных функций процесс синхронизации несколько упростился. :)
Ну а если невмоготу, то без потоков после изменения лэйбла нужно поставить строку
 
Код:
Application.ProcessMessages;

и все должно работать нормально.
44K
09 января 2011 года
FeelUs
57 / / 10.05.2010
спасибо большое, работает
кстати идея с таймером не пройдет, т.к. события от таймера не смогут прервать висящий процесс
а можно как нибудь сделать так, чтобы еще всякие "параллельные" события не прерывали мой процесс, а то он у меня для этого не предназначен
ведь memo, при его изменении, прорисовывается заного
или может быть есть какой-нибудь компонент, аналогичный label внешне и прорисовывающийся при его изменении
или может вызывать какой-нибудь метод GroupBox на котором у меня лежат метки, чтобы они прорисовались
8
09 января 2011 года
mfender
3.5K / / 15.06.2005
потоки, потоки освой, не парься, не страдай ерундой.
6
09 января 2011 года
George
4.1K / / 05.01.2007
Цитата: mfender
потоки, потоки освой, не парься, не страдай ерундой.


Поддреживаю. Потоки надо изучить ;)

44K
09 января 2011 года
FeelUs
57 / / 10.05.2010
а все оказалось совсем просто
 
Код:
LabelX.repaint;
8
09 января 2011 года
mfender
3.5K / / 15.06.2005
при чём тут repaint? он-то всё равно выполнится только когда программа отлипнет, и при смене caption в любом случае выполняется refresh..
44K
09 января 2011 года
FeelUs
57 / / 10.05.2010
а вот и нет, метки отрисовываются при вызове этого самого метода сразу
даже если провести другим окном по моему окну, оно все стирает, а метки все равно прорисовываются заного
 
Код:
...
LabelX.caption:='блаблабла';
LabelX.repaint;
...
6
09 января 2011 года
George
4.1K / / 05.01.2007
А вышеназванный Application.ProcessMessages наличествует?
44K
09 января 2011 года
FeelUs
57 / / 10.05.2010
нет, только LabelX.repaint
Я тут провел некоторые измерения и выяснил что:
-Application.ProcessMessages при неподвижной мышке и прочих аналогичных факторах замедляет мою программу примерно в 5,1 раза
-LabelX.repaint (5 меток) замедляет мою программу в 4,8 раза
-LabelX.repaint,(тоже 5 меток) вызываемый в 100 раз реже практически не замедляет мою программу
все это по сравнению с программой, где все это отсутствует
19K
10 января 2011 года
Alegun
269 / / 10.09.2010
Если это так важно и чтоб не грузить проц ерундой, типа .Repaint (прорисовывается ведь не только сам компонент, но и форма под ним, а это много-много протактов), то есть предложение, попробовать заменить Application.ProcessMessages на аналогичнeую но "свою":

Код:
{**** UBPFD *********** by delphibase.endimus.com ****
>> Замена штатного Application.ProcessMessages
Автор:       ssk, ucad@pisem.net, ICQ:166758074, Харьков
Copyright:   составлено из кусков кода Borland
Дата:        7 сентября 2004 г.
*****************************************************}
Uses Windows, Messages
procedure ProcessMessagesEx;
function IsKeyMsg(var Msg: TMsg): Boolean;
const
CN_BASE = $BC00;
var
Wnd: HWND;
begin
Result:= false;
with Msg do if
(Message >= WM_KEYFIRST) and
(Message <= WM_KEYLAST) then
begin
Wnd:= GetCapture;
if Wnd = 0 then
begin
Wnd:= HWnd;
if SendMessage(Wnd,CN_BASE+Message,WParam,LParam) <> 0 then
Result:= true;
end else
if (LongWord(GetWindowLong(Wnd,GWL_HINSTANCE)) = HInstance) then
if SendMessage(Wnd, CN_BASE + Message, WParam, LParam) <> 0 then
Result:= true;
end;
 end;
function ProcessMessage(var Msg: TMsg): Boolean;
begin
Result:= false;
if PeekMessage(Msg,0,0,0,PM_REMOVE) then
 begin
Result:= true;
if Msg.Message <> WM_QUIT then
if not IsKeyMsg(Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
 end;
end;
var
Msg: TMsg;
begin
while ProcessMessage(Msg) do {loop};
end;

и вызывать в цикле, вместо Application.ProcessMessages, процедуру под названием ProcessMessagesEx;
44K
10 января 2011 года
FeelUs
57 / / 10.05.2010
Цитата:
прорисовывается ведь не только сам компонент, но и форма под ним, а это много-много протактов


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

в итоге у меня метки прорисовываются раз 500 в сек, и это не оказывает ни какого видимого влияния на скорость программы

19K
10 января 2011 года
Alegun
269 / / 10.09.2010
Прорисовывается всёравно "слоёный", (слой за слоем) регион под контролом, где бы и на чём бы он (компонент) не лежал. Для примера, разместим AniImage с анимацией на форме и на TPanel на этой же форме и посмотрим где больше "серых артефактов" будет. Панель проиграет. Но это всё, как говорится, другая песня...:) Перерисовывать во время "затяжного" выполнения, всё же как-то не надёжно (см. мессагу #2, самое правильное решение в данном случае - это потоки).
44K
13 января 2011 года
FeelUs
57 / / 10.05.2010
а можно как-нибудь по шагам посмотреть, что там выполняется?
(если да, то как?)
а то даже точки останова не работают не в моих модулях
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог