Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.12.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.004 c
4-1242719572
Deamon_777
2009-05-19 11:52
2010.12.19
Как получить всю инфорнацию о файле.


2-1285157997
Den
2010-09-22 16:19
2010.12.19
Подскажите как построить запрос


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


2-1285405441
Игорь
2010-09-25 13:04
2010.12.19
Узнать количество процессоров компьютера


15-1283804001
Кто б сомневался
2010-09-07 00:13
2010.12.19
Удалить папку System Volume Info навсегда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский