Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.12.19;
Скачать: CL | DM;

Вниз

задержка   Найти похожие ветки 

 
Miko   (2010-09-09 08:58) [0]


t=GetTickCount();
while (GetTickCount()-t<delay);

делаю таким образом нужную задержку, только вот программа дальше цикла не идёт, цикл получается бесконечным подскажите, что не так?


 
И. Павел ©   (2010-09-09 09:01) [1]

У меня прекрасно идет дальше. Чему у вас delay равен? Может быть он слишком большой?
Поставьте после while например звуковой сигнал - может быть идет дальше, и зацикливается уже в другом месте?


 
И. Павел ©   (2010-09-09 09:05) [2]

Ну и еще есть один тонкий момент: кажется, GetTickCount может вернуть две одинаковые цифры, если долго не выключать систему (хотя интервал достаточно большой). Если вызвать его перед обнулением счетчика, будет кирдык :)


 
Miko   (2010-09-09 09:07) [3]

да нет, delay=25 , ну 25 миллисекунд задержка мне и нужна


 
_Юрий   (2010-09-09 09:09) [4]

Sleep(25);


 
И. Павел ©   (2010-09-09 09:12) [5]

У меня вот это вперкрасно работает:

procedure TForm1.Button1Click(Sender: TObject);
var t: Cardinal;
   delay: integer;
begin
 t:=GetTickCount();
 delay := 25;
 while GetTickCount()-t < delay do;
 Caption := "OK";
end;


Посмотрите в отладчике - какие значения имеют GetTickCount(), t, delay на каждой итерации. Лучше прямо считайте GetTickCount() в цикле, записывая его в отдельную прееменную и смотрите - чему он равен. А потом проходите while с этой переменной, и тоже анализируйте результат:


t=GetTickCount();
do
{
 t2 = GetTickCount();
 rez := t2-t<delay;
}
while (rez)


Чудес не бывает... Может быть у вас в цикле меняется значение для t. Может быть у вас t не cardinal (хотя не уверен, что меньший тип тут на что-то повлияет, разве что byte).


 
Miko   (2010-09-09 09:13) [6]


> Ну и еще есть один тонкий момент: кажется, GetTickCount
> может вернуть две одинаковые цифры, если долго не выключать
> систему

ребутнулся :) принудительно(спасибо ГорСвет - у) , не помогло


 
Miko   (2010-09-09 09:14) [7]

вообще я в си пишу длл-ку, потому отладку не пущу :(


 
Дмитрий Тимохов   (2010-09-09 10:22) [8]

Sleep(25) штука не очень адекватная примеру с tickcount.
скорее всего это будет много больше 25 мс, т.к. управление скорее всего будет отдано другому потоку.

я думаю, что с tickcount получится более точно отмерить 25 мс, хотя тоже не точно.

насчет исходного примера тоже не понимаю, что не так. должно быть все ок.


 
Ega23 ©   (2010-09-09 10:35) [9]


> кажется, GetTickCount может вернуть две одинаковые цифры,
>  если долго не выключать систему


Поскольку GetTickCount возвращает количество миллисекунд, прошедших со старта ОС в виде DWORD, то имеем
0xFFFFFFFF/1000/3600/24 = 49.7 (.....)
Т.е. через 49.7 суток значение GetTickCount дойдёт до 0xFFFFFFFF, после чего сбросится в ноль и начнёт расти заново.


 
12 ©   (2010-09-09 10:45) [10]

http://habrahabr.ru/blogs/delphi/75234/


 
Kerk ©   (2010-09-09 10:45) [11]

Для таких случаев придумали GetTickCount64


 
Ega23 ©   (2010-09-09 11:00) [12]


> Для таких случаев придумали GetTickCount64


Всё авно не застрахован - через 585 миллионов лет опять сбросится. Нужно техническую перезагрузку делать будет.


 
12 ©   (2010-09-09 11:11) [13]


> через 585 миллионов лет опять сбросится. Н

- .. и возможно вся Вселенная взорвется...
- !?!?!!!
- .. ну а возможно, не вся, а только наша галлактика...
- ну слава богу!


 
И. Павел ©   (2010-09-09 11:12) [14]

> через 585 миллионов лет опять сбросится

Ну пусть жалуются. Только сначала им придется меня откопать :)


 
Ega23 ©   (2010-09-09 11:14) [15]


> Ну пусть жалуются. Только сначала им придется меня откопать  :)


Вот так вот и получается индусский код - ненадёжный и беспощадный.


 
Anatoly Podgoretsky ©   (2010-09-09 11:16) [16]

> Miko  (09.09.2010 08:58:00)  [0]

По заголовку темы я подумал, что речь про задержку месячных.


 
Anatoly Podgoretsky ©   (2010-09-09 11:16) [17]

> Ega23  (09.09.2010 11:00:12)  [12]

Техническая перезагрузка не ранее 8 миллиардов лет, если только
коллайдерщики не помогут.
F0у. А перехват в Виндоус уже давно проблематичен, начиная с
Висты.


 
Miko   (2010-09-09 11:25) [18]

к сожалению в моё случае, значение до сих пор одно и тоже :)
ныне попробую на VS2010.


 
Miko   (2010-09-09 11:34) [19]


> По заголовку темы я подумал, что речь про задержку месячных.

я думал что такой исход возможен))


 
И. Павел ©   (2010-09-09 11:38) [20]

> Вот так вот и получается индусский код - ненадёжный и беспощадный.

За 585 миллионов лет существенное влияние на работу системы начнут оказывать ошибки, связанные с транзисторами и прочим железом. Индусы тут уже будут ни при чем.


 
Anatoly Podgoretsky ©   (2010-09-09 12:26) [21]

> И. Павел  (09.09.2010 11:38:20)  [20]

Индусы всегда будут при деле, будут писать обходы. Обходы на обходы.


 
Ega23 ©   (2010-09-09 12:34) [22]


> За 585 миллионов лет существенное влияние на работу системы
> начнут оказывать ошибки, связанные с транзисторами и прочим
> железом. Индусы тут уже будут ни при чем.


Это пустые отговорки.
Кое-кто тоже говорил, что 100 миллионов долларов - слишком большая цена за Microsoft


 
LL   (2010-09-09 14:13) [23]


> к сожалению в моё случае, значение до сих пор одно и тоже
> :)


А ты не стесняйся, приведи весь код. Ну и где определяешь переменную тоже.


 
Miko   (2010-09-09 14:39) [24]


void Play()
{
int delay;

DWORD t1,t2;

Ptr=fopen("1.vid","r");
   
while(fread(&delay,sizeof(BYTE),1,Ptr)==1)
{
//fread(&delay,sizeof(BYTE),1,Ptr);
 for(int i=0;i<1024*1024;i++)
  {
  fread(&image[i],sizeof(BYTE),1,Ptr);
  image[i]=image[i]+25;
  }

play=true;
UpdateImage(image);
UpdateOverlay();

t1=GetTickCount();
t2=GetTickCount();
       while ((t2-t1)<delay)
 t2=GetTickCount();


}
play=false;
fclose(Ptr);
}


 
Miko   (2010-09-09 14:41) [25]

в общем как и говорил раньше за пределы while не выходит, даже если писать так, как писал выше


t1=GetTickCount();
while (GetTickCount()-t1<delay);


 
Ega23 ©   (2010-09-09 14:45) [26]

А где инициализация delay?


 
Anatoly Podgoretsky ©   (2010-09-09 15:28) [27]


> Miko   (09.09.10 14:39) [24]

Это Си к Дельфи отношения не имеет


 
И. Павел ©   (2010-09-09 15:29) [28]

> А где инициализация delay?

тут:
> fread(&delay,sizeof(BYTE),1,Ptr)

в итоге delay = код последнего байта в файле.

А вот что означает:

> t1=GetTickCount();
> t2=GetTickCount();
>       while ((t2-t1)<delay)

Я так и не понял. Т.к. delay, t2 и t1 не меняются, то цршду либо не прйдет ни одной итерации, либо зациклится.


 
И. Павел ©   (2010-09-09 15:29) [29]

цршду -> цикл


 
И. Павел ©   (2010-09-09 15:34) [30]

> в итоге delay = код последнего байта в файле.

Оказывается, не последнего...

> fread(&image[i],sizeof(BYTE),1,Ptr);



> Miko


Попробуйте написать:

t1=GetTickCount();
t2=GetTickCount();
while ((t2-t1)<15)


А то уж больно delay мудрено считывается.


 
Anatoly Podgoretsky ©   (2010-09-09 16:03) [31]

Попробуйте написать:


t1=GetTickCount();
t2=GetTickCount();
while ((t2-t1)<15)


Это бесконечный цикл, писать надо

while ((GetTickCount()-t1)<15)


 
Ega23 ©   (2010-09-09 16:49) [32]

Я что-то не догоняю.
fread(&delay,sizeof(BYTE),1,Ptr)
По адресу delay записать первые 255 байт из Ptr, так что-ли?


 
И. Павел ©   (2010-09-09 16:50) [33]

sizeof(BYTE) - это ищется, сколько байт занимает переменная типа byte. Т.е. 1 байт.


 
И. Павел ©   (2010-09-09 16:52) [34]

Хотя сомневаюсь, что byte когда-нибудь будет занимать другой размер :) Так что можно было просто поставить единицу.


 
Ega23 ©   (2010-09-09 16:53) [35]

А, не. Наврал.
Но тогда, судя по описанию, где обявление
FILE *Ptr;  ?


 
Ega23 ©   (2010-09-09 16:58) [36]

В общем, есть подозрение, что в delay сидит мусор. Если старший байт ещё как-то инициализируется (хотя чему равен Ptr?), то что с остальными тремя - вообще

ВО!
А не может ли быть, что delay - отрицательное число? Оно же как int объявлено?


 
Anatoly Podgoretsky ©   (2010-09-09 16:58) [37]

> И. Павел  (09.09.2010 16:52:34)  [34]

Можно, но идеологически неправильно.


 
Miko   (2010-09-10 07:08) [38]

да, замена delay на конастанту дала результат :)
удивительно, что если в delay был мусор, а эта переменная типа int, то выход из цикла должен был наблюдаться :)


 
Miko   (2010-09-10 07:25) [39]

зы ещё сменил дистрибутив с VS2005 на VS2010 :)


 
Ega23 ©   (2010-09-10 10:44) [40]


> удивительно, что если в delay был мусор, а эта переменная
> типа int, то выход из цикла должен был наблюдаться :)

Вот смотри. Ты в старший байт записал что-то. Например - 1. Но это - старший байт. Т.е. delay равен (даже если мы его предварительно нулями затёрли) 0x1000000. Или 16777216 в десятичной системе. Это - 4 часа.



Страницы: 1 2 вся ветка

Текущий архив: 2010.12.19;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.009 c
15-1283874133
И. Павел
2010-09-07 19:42
2010.12.19
В честь чего такой гугл сегодня?


3-1249649283
aleks-ran
2009-08-07 16:48
2010.12.19
Параметры и mysql-connector-odbc-5.1.5


2-1285337414
Guestt
2010-09-24 18:10
2010.12.19
Как передать в функцию ссылку на другую функцию?


15-1283891373
Юрий
2010-09-08 00:29
2010.12.19
С днем рождения ! 8 сентября 2010 среда


15-1284205341
Servy
2010-09-11 15:42
2010.12.19
Базы данных и обеспечение уникальности