> вот чего я придумал: > > DWORD ms = GetTickCount(); > do {} while( (GetTickCount() - ms) < pause ); > > соответственно если (0xffffffff - pause) < ms - > возникает проблема..
Tebe chto ~49 dhei malo?? Ni figa sebe pauzha!
> может есть какие стандартные средства?
Vobzhe to Esli u tebia GUI to skoree vsego tebe nado obrabaryvat` messages vo vremia pausy.
Takchto sozdai event. A potom ispolzui :
MessgaeLoop(&hahdletoEvent,1,1000);
//eta foo waits for 1 sec a potom returns, i v to zhe vremia proishodit obrabotka messagei
int MessageLoop (
HANDLE* lphObjects, // handles that need to be waited on
int cObjects, // number of handles to wait on
DWORD dwmlsec)
{
while (TRUE)
{
DWORD result ;
MSG msg ;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
return 1;
DispatchMessage(&msg);
}
result = MsgWaitForMultipleObjects(cObjects, lphObjects,
FALSE, dwmlsec, QS_ALLINPUT);
if (result == (WAIT_OBJECT_0 + cObjects))
{
continue;
}
else
if(WAIT_TIMEOUT == result)
{
return result;
}
else
{
return WAIT_OBJECT_0;
}
}
}
---
как сделать паузу? - вариант.21.12.01 17:02 Автор: Chingachguk <Chingachguk> Статус: Member
> вот чего я придумал: > DWORD ms = GetTickCount(); > do {} while( (GetTickCount() - ms) < pause ); > соответственно если (0xffffffff - pause) < ms - > возникает проблема.. > может есть какие стандартные средства?
Почему не сделать так:
dword Last = GetTickCount();
do
{
if Last <> GetTickCount() then
{
Last = GetTickCount();
dec(ms);
}
} while ms > 0;
Извиняюсь за синтаксис - си не знаю.
зависит от примерной длины паузы21.12.01 14:38 Автор: ukv Статус: Незарегистрированный пользователь
> вот чего я придумал: > > DWORD ms = GetTickCount(); > do {} while( (GetTickCount() - ms) < pause ); > > соответственно если (0xffffffff - pause) < ms - > возникает проблема.. > может есть какие стандартные средства?
На мой взгляд, решение зависит от длительности паузы и требуемой точности.
Если нужно всего лишь обезопасить переполнение GetTickCount - проблемы нет, если pause тоже беззнакового типа.
Если пауза больше 50ms (или если величина pause не помещается в DWORD) - в цикле ожидания лучше делать Sleep'ы, чтобы не тормозить систему надолго. Если остаток стал меньше 50ms, а выдержать паузу надо как можно более точно - Sleep лучше не вызывать, а делать описанный цикл; если нужно разрешение лучше 1ms - вместо GetTickCount использовать QueryPerformanceCounter; а самый точный результат для коротких задержек - пользоваться инструкцией rdtsc, правда, сначала нужно узнать тактовую частоту процессора.
WIN32: Sleep(time) UNIX: usleep(time) /*время в ms*/21.12.01 14:32 Автор: XR <eXtremal Research> Статус: The Elderman
Кстати, если пауза слишком большая, то мазадай может подумать что прога зависла :)
Если, есно, нажать Ctrl+Alt+Del
И ещо, сама прога тоже "замораживается" :)
Вобщем лучше юзать это дело в потоках
WIN32: Sleep(time) UNIX: usleep(time) /*время в ms*/21.12.01 14:48 Автор: cb <cb> Статус: Member
> с usleep были какие-то косяки на солярке в многопоточных > приложениях... что-то связанное с приходом SIGALRM. в итоге > Это в солярке pthread-ы такие - они kernel-но - user space-овые
отсюда и косяки (race condition) - можно попытатся вылечить это дело
через pthread_cond_timewait()
PS: select разумеется хороший вариант
WIN32: Sleep(time) UNIX: usleep(time) /*время в ms*/21.12.01 17:10 Автор: cb <cb> Статус: Member
> Это в солярке pthread-ы такие - они kernel-но - user > space-овые > отсюда и косяки (race condition) - можно попытатся вылечить > это дело > через pthread_cond_timewait()
> > Это в солярке pthread-ы такие - они kernel-но - user > > space-овые > > отсюда и косяки (race condition) - можно попытатся > вылечить > > это дело > > через pthread_cond_timewait() > > правильно я понимаю что можно заменить usleep на > > { > pthread_mutex_t m_Lock; > pthread_cond_t m_Cond; > > pthread_mutex_init(&m_Lock, NULL); > pthread_cond_init(&m_Cond, NULL); > > .... > pthread_cond_timedwait(&m_Cond, &m_Lock, &time); > > pthread_cond_destroy(&m_Cond); > pthread_mutex_destroy(&m_Lock); > } > > или имеется в виду что-то другое?