Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Windows 2000/XP (http://forum.oszone.net/forumdisplay.php?f=6)
-   -   Остановка (отставание) времени в DOS приложении при работе в WindowsXP (http://forum.oszone.net/showthread.php?t=53640)

msgipss 08-09-2005 12:58 354130

Остановка (отставание) времени в DOS приложении при работе в WindowsXP
 
Здравствуйте Знатоки, столкнулись со следующей проблемой: при работе в фоновом режиме графические приложения dos отстают во времени на os win2k, winxp, ну и наверное в winnt (не проверял). Приложения dos которые работают в текстовой моде в фоне winxp - отставание премени замечено было только несколько раз.
Сделаем простой пример.
Пишем простенькое графическое приложение на паскале, которое выводит на экран текущую дату, время. Компилируем, запускаем, смотрим - время идет нормально. Переключаемся в другую (другие) задачи windows, работаем, через время переключаемся обратно, видим что время отстало и тикает не секундами а немного быстрее, как будто пытается догнать текущее.

К сожалению проблема стоит серьезно, т.к. имеется dos клиент наблюдения за тех. процессом, ограничения:
1. должен работать под ОС win2000,xp
2. пользователи переключаются между задачами, и при очередном переключении видят некоректные данные 8(.

пробовали настраивать ntvdm, пользоваться dosbox - без полож.результата

Если кто сталкивался с подобной ситуацией, либо владеет любой информацией по данному вопросу, просьба откликнуться.
Заранее благодарен

McDAK 08-09-2005 18:10 354199

msgipss
Вопрос конечно интересный, просто приведу свои воспоминания.. В том же самом Паскале (или что то же самое, Делфи) все зависит от того, при помощи какой функции реализовано, от чего естественно зависит точность хода времени приложения...

SlS 08-09-2005 20:23 354237

Я тоже кодю на паскале =) msgipss, а ты не пробовал сделать это в делфи как консольное приложение? А лучше вообще оконное ;) Просто в этих версиях винды вроде вообще стоит эмулятор Dos. Насколько знаю в фоновом режиме программа вообще прекращает свою работу, хотя это галкой задаётся =)

McDAK
Дельфя это не паскаль =) Дельфя - это круче - это обжект паскаль =) и богатый набор VCL =) и удобство проектирования интерфейса и .... =)

msgipss 09-09-2005 13:20 354380

спасибо, но есть система, есть задача заставить ее работать под вин2к,хп. В свойствах ярлыка я делал различные установки - не помогает

сорри, возможно что то не понятно написал.
Детализирую:
используется ПО для контроля тех процесса, написано на foxpro2.6 из тектовой моды этой программы (на фоксе) запускаются исполняемые файлы писанные на клипере, паскале, они работают в графичейкой моде. Эти приложения отображают данные из БД .dbf в соответствии с системным временем.
Проблема работы данного ПО обнаружилась на win2k,xp, если во время работы программы переключиться в др. задачу виндов. Проблему удалось локализовать. Если работает только в приложениях использующих текстовый режим, то переключения задач переносится нормально, время не отстает и соответствует действительному. Если же открыть программу которая работает в графической моде, поработать не закрывая ее переключиться в др.вин.задачу, поработать а потом опять в граф.задачу, то время начнет тикать с момента 1 переключения. И все данные показываюся некоректно. Более того при выходе из этого граф.приложения в техт. моду фокса - время все равно остается кривое и бежит быстрее. Со временем время догоняет текущее.
Для решения проблемы был написан тестовый пример на пасе, на нем я и экспериментировал, пример ниже

uses crt, graph, dos;
var gm, gd:integer;
result:integer;
h2, m2, s2, ss2:word;
s01:string;
function IntToStr(I: Longint): String;
{ Convert any integer type to a string }
var
S: string[11];
begin
Str(I, S);
IntToStr := S;
end;
begin
gd:=detect;
initGraph(gd,gm,'');
result:=GraphResult;
if Result<>grok then
begin
TextBackground(0);
ClrScr;
Writeln('Ошибка инициализации графики',Result,' ',gD,' ',gM);
Delay(2000);
Halt;
end;
repeat
getTime(h2,m2,s2,ss2);
s01:=intToStr(h2)+':'+IntToStr(m2)+':'+IntToStr(
s2)+'.'+IntToStr(ss2);
SetFillStyle(0,0);Bar(0,0,100,100);SetColor(15);

OutTextXY(10,10,s01);
until keyPressed;
closeGraph;
textMode(CO80);
end.

этот пример просто гоняет время в граф.моде, при переключении в другие задачи время останавливается 8(

Буду благодарен за любые мысли по данной проблеме

McDAK 09-09-2005 15:59 354413

msgipss
Гм... По-моему все это только подтверждает мои подозрения... Не удивлюсь, если эта тестовая прога начнет врать со временем, даже если просто очень хорошо нагрузить проц. А все от того, что не надо получать время функцией getTime... Возьми хороший учебник по Паскалю и поищи другие способы получения системного времени, я просто сейчас уже не помню...
SIS
Я знаю что такое ObjectPascal :) В основе Делфи все равно лежит в конечном счете Паскаль, а потому...

msgipss 12-09-2005 09:11 354839

Наверное я не умею объяснять, 8))
я же говорил выше, что при запуске любого !!! граф.DOS приложения (пробовал писать на клипере, пасе7.0 фоксе, запускал граф. дос игрушки ), и переключении в другую вин. задачу, в ntvdm происходит задержка времени, и после переключения опять в задачу ntvdm начинает догонять время реальное 8))
проблема не в паскале не ооп - а в настроке нтвдм, если она вообще возможна 8((


Время: 05:51.

Время: 05:51.
© OSzone.net 2001-