Текущий архив: 2004.01.26;
Скачать: CL | DM;
Вниз
Формирование запроса и параллельная работа таймера. Найти похожие ветки
← →
LordBTR (2004-01-15 15:18) [0]Помогите, пожалуйста. Пытаюсь показать юзеру время, которое прошло с момента вызова печати отчета до собственно самой печати.
На форме есть: кнопка "Печать", таймер и label. Обработчик при нажатии кнопки "Печать":
procedure TfmReport.bbtnPrintClick(Sender: TObject);
var
Day, Month, Year:Word;
begin
vBTime:=Time; //Отлавливаем время нажатия кнопки
lbl.Caption:="0:00:00"; //Обнуляем надпись
DMReport.qryOrder6.Open; //Открываем запрос
DMReport.rOrder6.DeviceType:="Screen";
DMReport.rOrder6.Print; //Показываем отчет
end;
Обработчик таймера (Timer.Interval=1000, т.е. 1 сек):
procedure TfmReport.TimerReportTimer(Sender: TObject);
begin
lbl.Caption:=TimeToStr(Time-vBTime); //Надпись соответствует
//времени прошедшему
//после нажатия "Печать"
end;
И вот ведь незадача - надпись показывает "0:00:00", а следующее значение выводится только после отображения отчета, т.е. все время пока формируется запрос (1-2 минуты) имеем "0:00:00" и только потом сразу "0:01:35". Хотелось бы ежесекундное приращение времени, а его нет... :(
Где я не прав?
← →
Карелин Артем © (2004-01-15 15:22) [1]var Time1,Time2:TDateTime;
.............
Time1:=Now;
Что-там хряпает долго в компе;
Time2:=Now;
Разница между Time1 и Time2 и будет интервалом.
← →
Семен Сорокин © (2004-01-15 15:24) [2]Где я не прав?
везде, у тебя это получится только тогда, когда вот это:
DMReport.qryOrder6.Open;
будет работать не в основном потоке.
DMReport.rOrder6.DeviceType:="Screen";
DMReport.rOrder6.Print;
Думай нужно ли тебе это, или пользователь все-таки засечет время секундомером :)
← →
Ega23 © (2004-01-15 15:26) [3]Application.ProcessMessages ?
← →
Семен Сорокин © (2004-01-15 15:28) [4]Ega23 © (15.01.04 15:26) [3]
не поможет, если запрос полторы минуты открывается, и не получится красивого "Хотелось бы ежесекундное приращение времени"
← →
Ega23 © (2004-01-15 15:35) [5]Вопрос другой, после открытия запроса мы придём в обработчик OnTimer? Если придём, то может это перерисовка лэйбла не проходит? А если не придём, то тогда ходу, тогда похоже
> Семен Сорокин © (15.01.04 15:24) [2]
← →
Digitman © (2004-01-15 15:38) [6]
> LordBTR
выноси работу с отчетом в доп.код.поток ... тогда осн.код.поток будет способен "рисовать" в запланированные тобой моментыц хоть время хоть самого черта
← →
LordBTR (2004-01-15 15:44) [7]>> Ega23 © (15.01.04 15:35) [5]
В OnTimer попадаем до Open и после, но все время пока "Что-там хряпает долго в компе;" в OnTimer не попадаем. Да забыл сказать, что в OnTimer-e lbl.Refresh есть, но не помогает.
Боюсь все-таки без доп. потока не обойтись, а тогда игра не стоит свеч и лучше уж "пользователь все-таки засечет время секундомером :)".
Скажите точно, без доп. потока никак?
← →
Ega23 © (2004-01-15 15:46) [8]
> но все время пока "Что-там хряпает долго в компе;" в OnTimer
> не попадаем.
Тады поток...
← →
Digitman © (2004-01-15 15:49) [9]
> LordBTR
> без доп. потока никак?
смотря что является источником данных для формирования НД
← →
LordBTR (2004-01-15 16:11) [10]Digitman © (15.01.04 15:49) [9]
Источником данных является СУБД Oracle 9i.
← →
Digitman © (2004-01-15 16:14) [11]
> LordBTR (15.01.04 16:11) [10]
> Источником данных является СУБД Oracle 9i.
это - не источник
я имел ввиду некий ODBC-драйвер, который, согласно документации к нему, позволяет асинхронные обращения к СУБД
← →
LordBTR (2004-01-15 16:44) [12]Digitman © (15.01.04 16:14) [11]
Если Вы правильно поняли - я не профи и про ODBC знаю совсем мало, но думаю наличие оного не спасет, т.к. блокировка выполнения OnTimer до окончания выполнения запроса к СУБД происходит на уровне приложения. Мне кажется так...
Но, если я ошибаюсь, то, если можно, по-подробнее про этот драйвер или линк на инфу.
Страницы: 1 вся ветка
Текущий архив: 2004.01.26;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.008 c