|
Страници по тази тема: 1 | 2 | (покажи всички)
Тема
|
'Please wait...' със закъснение
|
|
Автор |
Eventer () |
Публикувано | 06.08.03 11:59 |
|
При дълги операции извеждам съобщение от типа 'Prease wait...'
Обаче искам съобщението да се покаже 3 секунди след като е включено, ако не е изключено дотогава. Проблемът е, че съобщението трябва да се покаже по време на изпълнение на основния процес и въпреки него.
Някакви идеи със или без отделна нишка за просто и универсално изпълнение?
Thanks
Дали завиването на крушка е софтуерен проблем?
| |
Тема
|
Re: 'Please wait...' със закъснение
[re: Eventer]
|
|
Автор |
Pechenia (нема лабаво ;-) |
Публикувано | 06.08.03 13:19 |
|
Интересно е дали ще стане с таймер и Application.ProcessMessage в основния цикъл.
чети и дишай по-леко
| |
|
т.е. Application.ProcessMessage не показва съобщението.
Формата със съобщението не се показва, докато основния процес не приключи. Май трябва да бъде с разклонение, но си мислех за нещо по-елементарно.
Дали завиването на крушка е софтуерен проблем?
| |
Тема
|
Re: 'Please wait...' със закъснение
[re: Eventer]
|
|
Автор |
PhantomAS (няма) |
Публикувано | 06.08.03 16:12 |
|
Ами една идея - предполагам, че това което правиш е от тип цикъл ????
start_time = :Get_Start_Time; // ima si metod kojto wrasta wremeto w ms
while not EndOfOperation do
begin
blabla;
if Message_is_not_shown and (Get_Start_Time - start_time > 3000) then
ShowMessage(); // towa ti pokazwa saobstenieto i ti setwa flaga Message_is_not_shown
Application.ProcessMessages; ///tuk da ne ti zawiswa opresniawaneto na ekrana
end;
HideMessage() ;
---
Е т'ва е живот!
| |
|
Thanks, обаче не е универсално. Имам например сложни SQL реплики, които се бавят и при които нямам контрол
Необходимостта се поражда от работата на приложението върху различни по производителност компютри. При бързите това съобщение само премигва досадно, при по-бавните има опасност потребителя да се чуди дали му е зависнал компютъраРедактирано от Eventer на 06.08.03 16:30.
| |
|
Ами ползвай TQuery в нишка ;-)))) това май е единственото решение.
---
Е т'ва е живот!
| |
Тема
|
Re: 'Please wait...' със закъснение
[re: Eventer]
|
|
Автор | я ro знaм бe :) (Нерегистриран) |
Публикувано | 06.08.03 18:30 |
|
1. Ако формата се ползва често - дръж я постоянно в паметта(не я създавай/разрушавай). Заема малко памет, но ако веднъж си започнал сложен процес времето за създаване на формата е голямо, а и може да се проследи процеса на създаване ... брррр....
2. ОСНОВНИЯ ти проблем сигурно идва от това, че се опитваш да свършиш сложна операция в основната нишка. Ако просто пуснеш невизуалната работа да се свърши във втора нишка всичко ще е по-логично (все пак основната нишка е отговорна за обновяването на интерфейса).
3. Дори и това да не се получава лесно, избягвай application.processmessages
4. Можеш да правиш .repaint на формата със съобщението от друга нишка, да кажем на всяка секунда (грозно, ама по-универсално).
няма да пиша код сега, но това трябва да те насочи...
И последно. Точно за да нямаш тия проблеми е измислен курсура. ВСИЧКИ свързват пясъчния часовник с 'pleace wait', вече е условен рефлекс на потребителите :)))
| |
|
Стартирането на дългия процес като отделна нишка ще освободи основния да си отваря и затваря прозорците.
Идеята е добра, ще я приложа.
Дали завиването на крушка е софтуерен проблем?Редактирано от Eventer на 06.08.03 18:56.
| |
Тема
|
Re: 'Please wait...' със закъснение
[re: Eventer]
|
|
Автор | mf2hd (Нерегистриран) |
Публикувано | 07.08.03 09:41 |
|
Здравейте на всички.
Нишките са хубаво нещо, но аз си мисля, 4е не трябва да се прекалява с тях.
Помисли си дали е удачно за твоя случай, потребителите да работят с програмата докато тя прави нещо важно ? Според мене е по-добре да изчакат. Но всичко си зависи от случая.
За таймера .. Сега нямам вазможност да пробвам , но не виждам защо няма да се покаже формата. Ето един примерен код :
procedure Long_calculation;
begin
timer1.interval := 3000; //това може и да е default;
timer1.enabled := true;
Screen.Cursor:=crHourGlass;
try
repeat
// твоя код
//Application.ProcessMessages е хубаво да се сложи да не си мислят лузерите
4е е забила програмата.
until calculation_end;
finally
timer1.enabled:=false; //ако стигне до тук преди 3 сек. формата няма да се покаже
if formPleaseWait.Showing then formPleaseWait.Hide;
Screen.Cursor:=crDefault;
end;
end;
procedure Timer1.OnTimer;
begin
enabled:=false;
formPleaseWait.Show;
formPleaseWait.Repaint; //мисля 4е това трябва да я накара да се покаже
end;
Ако пробваш и нестане пиши да знам :)))
| |
Тема
|
Re: 'Please wait...' със закъснение
[re: mf2hd]
|
|
Автор | я ro знaм бe :) (Нерегистриран) |
Публикувано | 07.08.03 11:22 |
|
mf2hd,
човече, защо смяташ че цикъл с Application.ProcessMessages е по-добър от нишка ????
| |
|
Страници по тази тема: 1 | 2 | (покажи всички)
|
|
|