информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
как сделать паузу? 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;
};

---
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach