реализовать временную задержку в c

Я не знаю точно, как это назвать поиском... так что мне не повезло найти что-либо... :S

Мне нужно реализовать временную задержку в C.

например, я хочу что-то сделать, затем подождите, скажем, 1 минуту, затем продолжайте делать что-то.

Это имело смысл? Может кто-нибудь мне помочь?


person developer    schedule 14.10.2010    source источник


Ответы (17)


В стандартном C (C99) для этого можно использовать time(), например:

#include <time.h>
:
void waitFor (unsigned int secs) {
    unsigned int retTime = time(0) + secs;   // Get finishing time.
    while (time(0) < retTime);               // Loop until it arrives.
}

Кстати, это предполагает, что time() возвращает значение разрешения в 1 секунду. Я не думаю, что это предусмотрено стандартом, поэтому вам, возможно, придется приспособиться к этому.


Чтобы уточнить, это единственный известный мне способ сделать это с ISO C99 (и вопрос помечен не чем иным, как «C», что обычно означает, что портативные решения желательны, хотя, конечно, решения для конкретного поставщика все еще могут быть предоставлены).

В любом случае, если вы работаете на платформе, которая обеспечивает более эффективный способ, используйте его. Как указывалось в нескольких комментариях, могут возникнуть определенные проблемы с таким тесным циклом, связанным с процессором. использования и времени автономной работы.

Любая приличная ОС с временным разделением сможет снизить динамический приоритет задачи, которая постоянно использует свой полный временной интервал, но заряд батареи может быть более проблематичным.

Однако C ничего не указывает о деталях ОС в размещенной среде, и этот ответ предназначен только для ISO C и ISO C (поэтому не используются вызовы sleep, select, Win32 API или что-то в этом роде).

И имейте в виду, что POSIX sleep может прерываться сигналами. Если вы собираетесь пойти по этому пути, вам нужно сделать что-то вроде:

int finishing = 0; // set finishing in signal handler 
                   // if you want to really stop.

void sleepWrapper (unsigned int secs) {
    unsigned int left = secs;
    while ((left > 0) && (!finishing)) // Don't continue if signal has
        left = sleep (left);           //   indicated exit needed.
}
person paxdiablo    schedule 14.10.2010
comment
Да, будет нагрузка на ЦП, но любая приличная ОС (предполагающая упреждающую многозадачность) обнаружит это и соответственно снизит динамический приоритет. И, если это не так, загрузка ЦП не имеет значения (если это совместное многозадачное выполнение, вы можете изучить функцию yield). Причина, по которой я опубликовал это, заключается в том, что нет переносимого способа сделать это с помощью ISO-C, а вопрос помечен только как C (sleep, хотя и полезен, но не стандарт). - person paxdiablo; 14.10.2010
comment
@paxdiablo: Нет, на самом деле не будет ... Тактовая частота одного из процессоров вырастет до 100%. И нагрузка на ЦП имеет значение, особенно если вы работаете на ноутбуке, когда ЦП работает на полную мощность, он выделяет тепло, а тепло сокращает срок службы компьютеров. На старом стационарном компьютере это, вероятно, не имеет значения, так Windows справляется с этим (бесконечный цикл ничего не делает, когда делать нечего). Я предполагаю, что сегодня операционные системы используют передовые технологии энергосбережения, но я знаю, что ядро ​​Linux выпустило инструкцию hlt, то же самое сделал я, когда мне было 12 лет. - person Frank; 14.10.2010
comment
@paxdiablo: пусть retTime будет типа time_t. Какие системы вы имеете в виду? Это почти не ударит по процессору в любой системе. Разве это не имеет значения для вас? Кроме того, это типичная задача для ОС, а не для языка. - person jweyrich; 14.10.2010
comment
sleep( sec ), по-видимому, является стандартом ISO / IEC 9945-1: 1990 (POSIX 1), только Microsoft делает свое дело, в то время как остальной мир делает одно... - person Frank; 14.10.2010
comment
@ Фрэнк, если ты говоришь, что динамический приоритет Windows не будет изменен, ты ошибаешься. Потоки, которые добровольно отказываются от ЦП, имеют повышенный динамический приоритет. У тех, кто вытесняется после использования всего своего временного интервала, приоритеты снижаются (хотя и не ниже базового уровня, по памяти). Это будет иметь тенденцию отдавать предпочтение приложениям с хорошим поведением по сравнению с другими. Вы правы, что он по-прежнему будет потреблять ЦП, но опять же, если вы работаете в ОС, которая позволяет sleep помещать ваш процесс в очередь ожидания (и останавливает ЦП, когда выполняется только бездействующая задача), используйте его. Это еще не стандарт. - person paxdiablo; 14.10.2010
comment
@jweyrich, да, это сильно ударит по процессору. И есть ситуации, когда это не имеет значения (скажем, встроенная система без многозадачности или даже рабочие столы с надлежащей динамической настройкой приоритета). Смотрите мой комментарий к Фрэнку. Вопрос помечен как C без упоминания о Linux или Windows. Вот почему я опубликовал этот ответ, потому что это единственный известный мне способ добиться этого только с помощью C. Если вы найдете что-то в C99, в котором говорится об обратном, я буду рад удалить ответ. - person paxdiablo; 14.10.2010
comment
Не стесняйтесь пояснять, @Frank, но единственная часть моего комментария, на которую ваш ответ Нет, на самом деле, это не имело смысла, была любая приличная ОС ... немного. - person paxdiablo; 14.10.2010
comment
У меня действительно хорошая ОС, она более чем достойная. И обычно не бывает каких-то дурацких программ, кроме Adobe Flash Player. Большинство людей, использующих мою ОС, будут жаловаться автору, если их программа ведет себя неправильно, и, возможно, даже пришлют патч или вообще не будут использовать программу. - person Frank; 14.10.2010
comment
Я не совсем понимаю, что ты хочешь этим сказать, Фрэнк, мне это показалось немного неуместным. Я не осуждаю ваш выбор ОС. Если вы хотите указать, к какому именно моему тексту относится ваше «Нет, на самом деле, это не будет комментарием», мы можем это обсудить. Я уже указал, почему опубликовал этот ответ. Если вы не находите это полезным в вашей (на мой взгляд, ограниченной) концепции среды C, не стесняйтесь проголосовать за нее, в конце концов, для этого и предназначена система голосования. - person paxdiablo; 14.10.2010
comment
[...] любая приличная ОС (предполагающая упреждающую многозадачность) обнаружит это и соответственно сбросит динамический приоритет. А если нет, то загрузка процессора не имеет значения [...] это то, что я сказал Нет, на самом деле, он не будет включен. И я уже проголосовал против. И я уже говорил, почему загрузка процессора имеет значение. Не то, чтобы он нагревается, он также истощает энергию. Угадай, что? Аккумулятор моего ноутбука работает дольше, так как я выбрасываю Windows в окно. И у меня есть всякие 3D-десктопные эффекты, которые, наверное, истощают их долю. Батарея все равно держит дольше. - person Frank; 14.10.2010
comment
@paxdiablo: я поддерживаю утверждение о том, что стандартного способа не существует, но ИМХО решение цикла, предложенное в waitFor, никогда не должно использоваться в любой многозадачной системе, которая предоставляет механизмы ожидания / приостановки. Я не понизил голос, потому что в конце концов ответ не является неправильным. Просто не хватало информации о том, что вы включили @ ревизию 4. - person jweyrich; 14.10.2010
comment
@Frank: ну, тогда это имеет больше смысла, если это не так, загрузка ЦП не имеет значения, комментарий. Однако я по-прежнему остаюсь при своем ответе. Вы вольны голосовать, как хотите. Я надеюсь, что правки, внесенные некоторое время назад, включающие предостережение о том, что вы должны использовать лучший способ, если он предоставлен, повлияют на вас, но если нет, мы можем просто согласиться не согласиться. Ваше здоровье. - person paxdiablo; 14.10.2010
comment
Нет проблем, @jweyrich, если бы мы все согласились, ТАК было бы довольно скучным местом :-) - person paxdiablo; 14.10.2010
comment
@paxdiablo: Думаю, это ты минусуешь мой ответ. - person Frank; 14.10.2010
comment
Я предпочитаю не делать этого из-за конкурирующих ответов, хотя должен признать, что у меня есть соблазн :-) Сообщество может определить относительные достоинства. - person paxdiablo; 14.10.2010
comment
Заворачивать сон через какое-то время таким образом довольно плохо, если сон был прерван сигналом, то его, вероятно, следует уважать. Пользователь может на самом деле захотеть завершить программу — кто захочет ждать минут, прежде чем программа закроется? - person Frank; 14.10.2010
comment
Достаточно справедливый комментарий. Я добавил способ исправить это, хотя я не сомневаюсь, что кто-то сможет найти дыры в этом методе. Важная вещь, которую я пытался поднять, заключалась в том, что вы не должны полагаться на то, что sleep действительно соблюдает запрошенную задержку. Способы исправить это - проблема реализации. - person paxdiablo; 14.10.2010
comment
@Frank, иногда задержки возникают по причинам, связанным с реальными процессами. Если для охлаждения печи требуется 10 минут, то может быть очень важно, чтобы программа ждала все эти 10 минут. Конечно, я провожу дни внутри встроенных систем и обычно не работаю над программным обеспечением для настольных компьютеров, поэтому моя точка зрения искажена... - person RBerteig; 14.10.2010
comment
@RBerteig: я вас понимаю, и теперь paxdiablo тоже немного исправил свою функцию. Но все еще думает, что он должен пометить переменную volatile. - person Frank; 14.10.2010
comment
@Frank, я думаю, что volatile sig_atomic_t finishing - правильное объявление для переменной, совместно используемой обработчиком сигналов и основным потоком. Я просто хотел отметить, что часто существуют внешние требования, которые необходимо соблюдать... - person RBerteig; 14.10.2010
comment
Почему вы не объявили retTime ? - person Amin NAIRI; 13.04.2016

Вот как вы можете сделать это на большинстве настольных систем:

#ifdef _WIN32
    #include <windows.h>
#else
    #include <unistd.h>
#endif

void wait( int seconds )
{   // Pretty crossplatform, both ALL POSIX compliant systems AND Windows
    #ifdef _WIN32
        Sleep( 1000 * seconds );
    #else
        sleep( seconds );
    #endif
}

int
main( int argc, char **argv)
{
    int running = 3;
    while( running )
    {   // do something
        --running;
        wait( 3 );
    }
    return 0; // OK
}

Вот как это можно сделать на микрокомпьютере/процессоре без таймера:

int wait_loop0 = 10000;
int wait_loop1 = 6000;

// for microprocessor without timer, if it has a timer refer to vendor documentation and use it instead.
void
wait( int seconds )
{   // this function needs to be finetuned for the specific microprocessor
    int i, j, k;
    for(i = 0; i < seconds; i++)
    {
        for(j = 0; j < wait_loop0; j++)
        {
            for(k = 0; k < wait_loop1; k++)
            {   // waste function, volatile makes sure it is not being optimized out by compiler
                int volatile t = 120 * j * i + k;
                t = t + 5;
            }
        }
    }
}

int
main( int argc, char **argv)
{
    int running = 3;
    while( running )
    {   // do something
        --running;
        wait( 3 );
    }
    return 0; // OK
}

Переменные цикла ожидания должны быть точно настроены, они действительно работали довольно близко для моего компьютера, но масштаб частоты делает его очень неточным для современной настольной системы; Так что не используйте там, если вы не голы до металла и не делаете таких вещей.

person Frank    schedule 14.10.2010
comment
+1, чтобы компенсировать незаслуженное понижение ИМХО. С другой стороны, вы явно предполагаете, что ОС имеет полезные системные вызовы, а в самом вопросе упоминается только стандартный C, в котором, как указывает Пакс, отсутствует какой-либо вызов задержки. Очень большое количество кода C выполняется на платформах без операционных систем. Хотя некоторый механизм, подобный sleep(), часто полезно создавать на таких платформах, он не требуется ни одним из стандартов C. - person RBerteig; 14.10.2010
comment
Я думал написать, как это сделать на микропроцессорах без ОС, но не совсем решил. Не совсем моя сфера. - person Frank; 14.10.2010
comment
@Frank, даже без ОС у вас часто есть аппаратно реализованный счетчик, который подсчитывает циклы некоторых часов. Таким образом, один из способов — прочитать этот счетчик, предсказать будущее значение и вращаться в цикле, пока счетчик не достигнет значения. Это работает для достаточно коротких ожиданий, когда счетчик не переворачивается более одного раза во время ожидания. В небольших процессорах вам иногда приходится прибегать к настраиваемым вручную циклам, когда вы точно знаете, сколько циклов потребляется за одну итерацию. Способ всегда есть, но он может быть некрасивым. - person RBerteig; 14.10.2010
comment
Точнее, не всегда может быть красивым. Но, что интересно, неужели нет микрокомпьютеров, на которых можно установить прерывание и выдать hlt для экономии энергии? - person Frank; 14.10.2010
comment
@Frank: у некоторых это есть. Например, PIC32MX имеет 2 типа таймеров. Тип A имеет собственный осциллятор, а B — нет. Оба позволяют выбрать предварительный делитель. - person jweyrich; 14.10.2010
comment
Для первого я бы предложил число с плавающей запятой вместо целого числа. - person Aetricity; 02.02.2016
comment
Затенение системного вызова wait может быть нежелательным; возможно, использовать другое имя. - person tripleee; 21.04.2016

Проверьте справочную страницу sleep(3) или MSDN для сна

person Community    schedule 14.10.2010

Хотя во многих реализациях функция time возвращает текущее время в секундах< /em>, нет гарантии, что каждая реализация будет делать это (например, некоторые могут возвращать миллисекунды, а не секунды). Таким образом, более переносимым решением является использование функции difftime.

Стандарт C гарантирует, что difftime возвращает разницу во времени в секундах между двумя значениями time_t. Таким образом, мы можем написать переносимую функцию задержки времени, которая будет работать во всех реализациях, совместимых с стандартом C.

#include <time.h>

void delay(double dly){
    /* save start time */
    const time_t start = time(NULL);

    time_t current;
    do{
        /* get current time */
        time(&current);

        /* break loop when the requested number of seconds have elapsed */
    }while(difftime(current, start) < dly);
}

Одно предостережение относительно функций time и difftime заключается в том, что стандарт C никогда не определяет степень детализации. Большинство реализаций имеют гранулярность одна секунда. Хотя это нормально для задержек, длящихся несколько секунд, наша функция задержки может ожидать слишком долго для задержек, длящихся менее одной секунды.

Существует переносимая стандартная альтернатива C: функция clock.

Функция clock возвращает наилучшее приближение реализации к процессорному времени, используемому программой с начала определяемой реализацией эры, связанной только с вызовом программы. Чтобы определить время в секундах, значение, возвращаемое функцией clock, нужно разделить на значение макроса CLOCKS_PER_SEC.

Решение функции clock очень похоже на наше решение функции time:

#include <time.h>

void delay(double dly){
    /* save start clock tick */
    const clock_t start = clock();

    clock_t current;
    do{
        /* get current clock tick */
        current = clock();

        /* break loop when the requested number of seconds have elapsed */
    }while((double)(current-start)/CLOCKS_PER_SEC < dly);
}

В этом случае есть предостережение, аналогичное тому, что было в time и difftime: гранулярность функции clock остается на усмотрение реализации. Например, машины с 32-битными значениями для clock_t с разрешением в микросекундах могут в конечном итоге упаковать значение, возвращаемое clock, через 2147 секунд (около 36 минут).

Таким образом, рассмотрите возможность использования реализации функции задержки time и difftime для задержек продолжительностью не менее одной секунды и реализации clock для задержек продолжительностью менее одной секунды.

Последнее предостережение: clock возвращает время процессора, а не календарное время; clock может не соответствовать фактическому прошедшему времени (например, если процесс спит).

person Vilhelm Gray    schedule 29.07.2013

Для задержек до одной минуты хорошим выбором будет sleep().

Если когда-нибудь вы захотите сделать паузу с задержкой менее одной секунды, вы можете рассмотреть poll() с тайм-аутом.

Оба POSIX.

person mouviciel    schedule 14.10.2010

Попробуйте sleep(int number_of_seconds)

person waffle paradox    schedule 14.10.2010

sleep(int) работает как хорошая задержка. На минуту:

//Doing some stuff...
sleep(60); //Freeze for A minute
//Continue doing stuff...
person Community    schedule 14.10.2010

В стандартной библиотеке C до C11 нет функций sleep(), но POSIX предоставляет несколько вариантов.

Функция POSIX sleep() (unistd.h) принимает аргумент unsigned int для желаемого количества секунд. спать. Хотя это не функция стандартной библиотеки, она широко доступна, и glibc поддерживает ее даже при компиляции с более строгими настройками, такими как --std=c11.

Функция POSIX nanosleep() (time.h) принимает два указателя на timespec структурирует как аргументы и обеспечивает более точное управление продолжительностью сна. Первый аргумент определяет продолжительность задержки. Если второй аргумент не является нулевым указателем, он содержит оставшееся время, если вызов будет прерван обработчиком сигнала.

Программы, использующие функцию nanosleep(), возможно, должны включать макрос тестирования функций для компиляции. Следующий пример кода не будет компилироваться в моей системе Linux без макроса проверки функций, когда я использую типичный вызов компилятора gcc -std=c11 -Wall -Wextra -Wpedantic.

Когда-то в POSIX была функция usleep() (unistd.h), которая принимала аргумент useconds_t для указания продолжительность сна в микросекундах. Для этой функции также требовался макрос проверки функций при использовании со строгими настройками компилятора. Увы, usleep() устарел с выходом POSIX.1-2001 и больше не должен использоваться. Сейчас рекомендуется использовать nanosleep() вместо usleep().

#define _POSIX_C_SOURCE  199309L     // feature test macro for nanosleep()

#include <stdio.h>
#include <unistd.h>    // for sleep()
#include <time.h>      // for nanosleep()

int main(void)
{
    // use unsigned sleep(unsigned seconds)
    puts("Wait 5 sec...");
    sleep(5);

    // use int nanosleep(const struct timespec *req, struct timespec *rem);
    puts("Wait 2.5 sec...");
    struct timespec ts = { .tv_sec = 2,          // seconds to wait
                           .tv_nsec = 5e8 };     // additional nanoseconds
    nanosleep(&ts, NULL);
    puts("Bye");

    return 0;
}

Приложение:

C11 имеет заголовок threads.h, обеспечивающий thrd_sleep(), который работает идентично nanosleep(). GCC не поддерживал threads.h до 2018 года, когда была выпущена glibc 2.28. Сложно вообще было найти реализации с поддержкой threads.h (Clang его давно не поддерживал, но я не уверен в текущем положении дел там). Вам придется использовать эту опцию с осторожностью.

person ad absurdum    schedule 17.12.2018

Is it timer?

Для WIN32 попробуйте http://msdn.microsoft.com/en-us/library/ms687012%28VS.85%29.aspx

person ruslik    schedule 14.10.2010

вы можете просто вызвать функцию delay(). Итак, если вы хотите задержать процесс на 3 секунды, вызовите delay(3000)...

person Owen    schedule 14.10.2010

Если вы уверены, что хотите подождать и вас никогда не прервут, используйте спящий режим в POSIX или спящий режим в Windows. В POSIX сон занимает время в секундах, поэтому, если вы хотите, чтобы время было короче, есть разновидности, такие как usleep(), которые используют микросекунды. Сон в Windows занимает миллисекунды, редко вам нужна более тонкая детализация.

Возможно, вы хотите подождать какое-то время, но хотите разрешить прерывания, возможно, в случае чрезвычайной ситуации. сон может быть прерван сигналами, но в этом случае есть лучший способ сделать это.

Поэтому на практике я обнаружил, что вы ждете события или условной переменной с тайм-аутом.

В Windows ваш вызов WaitForSingleObject. В POSIX это pthread_cond_timedwait.

В Windows вы также можете использовать WaitForSingleObjectEx, а затем вы можете фактически «прервать» свой поток любой задачей в очереди, вызвав QueueUserAPC. WaitForSingleObject(Ex) вернет код, определяющий, почему он вышел, поэтому вы будете знать, когда он вернет статус «TIMEDOUT», что он действительно истек. Вы устанавливаете Событие, которого оно ожидает, когда вы хотите, чтобы оно завершилось.

С помощью pthread_cond_timedwait вы можете передавать сигнал переменной условия. (Если несколько потоков ожидают одного и того же, вам нужно будет выполнить широковещательную рассылку, чтобы разбудить их всех). Каждый раз, когда он зацикливается, он должен проверять условие. Ваш поток может получить текущее время и посмотреть, прошло ли оно, или он может посмотреть, было ли выполнено какое-то условие, чтобы определить, что делать. Если у вас есть какая-то очередь, вы можете проверить это. (В вашем потоке автоматически будет заблокирован мьютекс, который он использовал для ожидания переменной условия, поэтому, когда он проверяет условие, он имеет к нему единственный доступ).

person CashCow    schedule 18.02.2011

// Предоставляет метод ANSI C для задержки x миллисекунд

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void delayMillis(unsigned long ms) {
    clock_t start_ticks = clock();
    unsigned long millis_ticks = CLOCKS_PER_SEC/1000;
    while (clock()-start_ticks < ms*millis_ticks) {
    }
}    

/* 
 * Example output:
 * 
 * CLOCKS_PER_SEC:[1000000]
 * 
 * Test Delay of 800 ms....
 * 
 * start[2054], end[802058], 
 * elapsedSec:[0.802058]
 */
int testDelayMillis() {

    printf("CLOCKS_PER_SEC:[%lu]\n\n", CLOCKS_PER_SEC);
    clock_t start_t, end_t;
    start_t = clock();
    printf("Test Delay of 800 ms....\n", CLOCKS_PER_SEC);
    delayMillis(800); 
    end_t = clock();
    double elapsedSec = end_t/(double)CLOCKS_PER_SEC;
    printf("\nstart[%lu], end[%lu], \nelapsedSec:[%f]\n", start_t, end_t, elapsedSec);

}

int main() {    
    testDelayMillis();
}
person Craig D    schedule 28.05.2019

C11 имеет функцию специально для этого:

#include <threads.h>
#include <time.h>
#include <stdio.h>

void sleep(time_t seconds) {
    struct timespec time;
    time.tv_sec = seconds;
    time.tv_nsec = 0;
    while (thrd_sleep(&time, &time)) {}
}

int main() {
    puts("Sleeping for 5 seconds...");
    sleep(5);
    puts("Done!");
    return 0;
}

Обратите внимание, что это доступно только начиная с glibc 2.28.

person leo60228    schedule 29.01.2020

для использования C в gcc. #include ‹windows.h›

затем используйте Sleep(); /// Sleep() с заглавной S. не sleep() с s .

//Сон(1000) равен 1 сек /// возможно.

clang поддерживает sleep(), sleep(1) для задержки/ожидания в 1 секунду.

person shyed2001    schedule 14.07.2020

Какую операционную систему вы используете?
Я знаю, что в Windows вы можете сделать что-то вроде этого:

//include crap
#include <windows.h>

int main () {
  //do things
  Sleep(/* ur wait time in ms */);// wait for param1 ms
  //continue to do things
}
person COArSe D1RTxxx    schedule 04.08.2020
comment
При добавлении ответа на старый вопрос с шестнадцатью существующими ответами, включая принятый ответ, очень важно указать, к какому новому аспекту вопроса относится ваш ответ. Также маловероятно, что ответ, начинающийся с вопроса, получит ответ через девять лет. - person Jason Aller; 04.08.2020

Для коротких задержек (скажем, несколько микросекунд) в ОС Linux вы можете использовать usleep:

// C Program to perform short delays
#include <unistd.h>
#include <stdio.h>

int main(){
    printf("Hello!\n");
    usleep(1000000); // For a 1-second delay
    printf("Bye!\n);
    return 0;
person Sina    schedule 11.02.2021
comment
usleep был POSIX (вот почему вы можете найти его в Linux), но устарел двадцать лет назад и был полностью удален из спецификации POSIX более десяти лет назад; даже справочные страницы Linux говорят то же самое. Вам следует использовать более новые функции POSIX sleep и nanosleep, которые также поддерживаются в Linux. Мой ответ на этой странице подробно описывает эти проблемы и даже дает некоторые советы по использованию. - person ad absurdum; 11.02.2021

Напишите этот код:

void delay(int x)
{   int i=0,j=0;
    for(i=0;i<x;i++){for(j=0;j<200000;j++){}}
}

int main()
{
    int i,num;

    while(1) {

    delay(500);

    printf("Host name");
    printf("\n");}

}
person Shagun verma - Developer    schedule 06.11.2016
comment
Добавьте некоторое объяснение с ответом о том, как этот ответ помогает ОП в устранении текущей проблемы. - person ρяσѕρєя K; 06.11.2016
comment
компиляция с включенной оптимизацией удалит всю функцию задержки - person Tommylee2k; 15.11.2016