1. C# / Говнокод #8845

    +122

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    while (!requestedTermination)
    {
        // ...
        // тут  130 строк кода...
        // ...
    
        if (requestedTermination)
        {
            break;
        }
        else
        {
            // to prevent excess CPU usage
            Thread.Sleep(100);
        }
    }

    requestedTermination - Property, изменяемое другим потоком

    Мораль: не пишите длинные циклы - к концу цикла забудете, какое у него было условие завершения.

    Запостил: burdakovd, 16 Декабря 2011

    Комментарии (12) RSS

    • досрочный выход из цикла
      Ответить
      • Если убрать break, то, спустя 100 миллисекунд, мы всё равно вышли бы из цикла.
        Ответить
        • его комментарии как правило не несут вообще никакой смысловой нагрузки можно было и не отвечать
          Ответить
        • А если за эти 100 мс requestedTermination изменится?
          Ответить
          • Во-первых в данном случае оно не изменилось, извне оно может меняться только из false в true, но не обратно.

            Во-вторых, если бы оно могло измениться за 100 мс, то оно могло бы измениться и за несколько тактов между if(requestedTermination) и break.

            Не питайте иллюзий, что "мы успеем сделать %THING% прежде чем значение %VARIABLENAME% изменится".
            Ответить
    • в дисклеймере написано про сишной код, а тут ничего смишного уже давно нет
      Ответить
    • >Thread.Sleep(100);

      напоминает осла из шрека:
      -а мы приехли?
      -нет
      -а сейчас?
      -нет
      ....
      Ответить
      • Бывает, что это необходимо... скажем, если в цикле стоит recv. Есть данные? А сейчас? Да, буду спрашивать каждые 100 мс, а теперь?
        Ответить
      • Было вчера на хабре.
        Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий