информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Страшный баг в WindowsСетевые кракеры и правда о деле Левина
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
как сделать паузу? 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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach