Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
как сделать паузу? - вариант. 21.12.01 17:02 Число просмотров: 1093
Автор: 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;
Извиняюсь за синтаксис - си не знаю.
|
<programming>
|
как сделать паузу? 21.12.01 13:56
Автор: zelych Статус: Member
|
вот чего я придумал:
DWORD ms = GetTickCount();
do {} while( (GetTickCount() - ms) < pause );
соответственно если (0xffffffff - pause) < ms - возникает проблема..
может есть какие стандартные средства?
|
|
[Win32] как сделать паузу? 21.12.01 22:07
Автор: + <Mikhail> Статус: Elderman
|
> вот чего я придумал: > > 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
|
|
| |
Кстати! 21.12.01 19:19
Автор: ih8u <i hate you> Статус: Member
|
Кстати, если пауза слишком большая, то мазадай может подумать что прога зависла :)
Если, есно, нажать Ctrl+Alt+Del
И ещо, сама прога тоже "замораживается" :)
Вобщем лучше юзать это дело в потоках
|
| |
WIN32: Sleep(time) UNIX: usleep(time) /*время в ms*/ 21.12.01 14:48
Автор: cb <cb> Статус: Member
|
с usleep были какие-то косяки на солярке в многопоточных приложениях... что-то связанное с приходом SIGALRM. в итоге было сделано так:
int plSleep(int milliseconds)
{
int res=0;
#ifdef WIN32
Sleep((DWORD)milliseconds);
#else
timeval wait;
wait.tv_sec = milliseconds / 1000;
wait.tv_usec = (milliseconds % 1000) * 1000;
::select (0, 0, 0, 0, &wait);
#endif
return res;
}
|
| | |
WIN32: Sleep(time) UNIX: usleep(time) /*время в ms*/ 21.12.01 16:59
Автор: XR <eXtremal Research> Статус: The Elderman
|
> с 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()
правильно я понимаю что можно заменить 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);
}
или имеется в виду что-то другое?
> PS: select разумеется хороший вариант
;))
я его в ace подсмотрел.. каюсь... ;))
cb.
|
| | | | |
WIN32: Sleep(time) UNIX: usleep(time) /*время в ms*/ 21.12.01 18:47
Автор: XR <eXtremal Research> Статус: The Elderman
|
> > Это в солярке 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); > } > > или имеется в виду что-то другое?
там чуть иначе - вот пример
#include <stdio.h>
#include <pthread.h>
#include <sys/time.h>
void pthread_sleep(long int time, long int ntime) {
pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
struct timeval now;
struct timezone tz;
struct timespec timeout;
int retcode;
pthread_mutex_lock(&mtx);
gettimeofday(&now,&tz);
timeout.tv_sec = now.tv_sec + time;
timeout.tv_nsec = now.tv_usec + ntime;
retcode = 0;
while ( retcode != 110) {
retcode = pthread_cond_timedwait(&cond, &mtx, &timeout);
}
pthread_mutex_unlock(&mtx);
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&mtx);
};
void* _routine(void* ptr)
{
printf("wait 1 sec\n");
pthread_sleep(1,0);
};
int main(int argc, char** argv)
{
pthread_t tid;
int i;
for(i=1;i<100;i++)
{
pthread_create(&tid,NULL,_routine,NULL);
pthread_join(tid,NULL);
}
return 0;
};
---
|
|
|