label, принудительный вывод на экран
но во время работы этого процесса при присваивании labelx.caption чего-либо, и даже при вызове labelx.show метка на экране остается неизменной, и меняется только по завершении этого просесса
подскажите пожалуйста можно ли это реализовать, и если да то как?
А у ж там синхронизируй свои label'ы с тем что происходит в потоке.
а сейчас мне нужен ринудительный вывод label'a
то, что мое приложение висит полминуты - меня не огорчает, пока
рисование на конве отображается, лог в memo отображается, а метки не отображаются
после изменения значения переменной. А без извращения - только с потоками действительно...
Ну а если невмоготу, то без потоков после изменения лэйбла нужно поставить строку
и все должно работать нормально.
кстати идея с таймером не пройдет, т.к. события от таймера не смогут прервать висящий процесс
а можно как нибудь сделать так, чтобы еще всякие "параллельные" события не прерывали мой процесс, а то он у меня для этого не предназначен
ведь memo, при его изменении, прорисовывается заного
или может быть есть какой-нибудь компонент, аналогичный label внешне и прорисовывающийся при его изменении
или может вызывать какой-нибудь метод GroupBox на котором у меня лежат метки, чтобы они прорисовались
Поддреживаю. Потоки надо изучить ;)
даже если провести другим окном по моему окну, оно все стирает, а метки все равно прорисовываются заного
LabelX.caption:='блаблабла';
LabelX.repaint;
...
Я тут провел некоторые измерения и выяснил что:
-Application.ProcessMessages при неподвижной мышке и прочих аналогичных факторах замедляет мою программу примерно в 5,1 раза
-LabelX.repaint (5 меток) замедляет мою программу в 4,8 раза
-LabelX.repaint,(тоже 5 меток) вызываемый в 100 раз реже практически не замедляет мою программу
все это по сравнению с программой, где все это отсутствует
>> Замена штатного 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;
если бы у меня метки были на форме, и при каждом их выводе вызывался form.repaint, то у меня бы прог-а работала наверно в миллион раз дольше,
поэтому гогда я заметил, что при изменении меток вызывается form.repaint я поместил их на GroupBox сразу как заметил это, да и потом все равно form.repaint помоему вызывался в самом конце процесса
Сейчас у меня Label.repaint прорисовывает только сами метки поверх старых - к ним в конце приходится прибавлять еще несколько пробелов чтобы не запутаться что новое а что старое при изменении их длины,
не говоря уже что GroupBox не прорисовывается заного (и не надо)- для каждой метки в отдельности надо писать свой repaint
в итоге у меня метки прорисовываются раз 500 в сек, и это не оказывает ни какого видимого влияния на скорость программы
(если да, то как?)
а то даже точки останова не работают не в моих модулях