Школоло / Говнокод #27031 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
// добавляем новые ссылки
  for i := 0 to ATags.Count - 1 do
  begin
    // так мне кажется лучше
    Application.ProcessMessages;

кому или чему лучше кроме тебя, автор ?

Запостил: xoodoo xoodoo, (Updated )

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

  • Что делает Application.ProcessMessages? Диспатчит WM_ сообщения окну? У автора впереди долгий цикл, и он хотел обработать существующие сообщения?
    Ответить
  • Юзеру лучше, видимо. Винда не ругается, что окно не отвечает.
    Ответить
    • Зачем делать что-то тяжелое на главном треде, если ты не игра?
      Ответить
      • В делфи не было удобных абстракций над тредами. Ну и многопоточность опять же тянет за собой лочки и т.п.

        Заблочить UI прогрессбаром (чтобы юзер никуда не тыкнул) и дёргать ProcessMessages (чтобы не висело) на порядок проще.
        Ответить
        • Да их много где не было. В джаве их не было до шестерки вроде или до пятерки, например.

          Это какая-то блин кооперативная многозадачность почти: чуть-чуть посчитал что-то, процесснул меседжи, еще чуть-чуть посчитал..
          Ответить
          • > кооперативная многозадачность

            Скорее эмуляция старой доброй однозадачной системы. Когда можно было просто нарисовать юзеру прогрессбар с кнопочкой отмены и заняться расчётами, периодически проверяя мышку с клавой.
            Ответить
            • Даже DOS не был в полном смысле однозадачным: TSRы же были
              Ответить
              • Причём по аппаратному прерыванию задача TSR вытесняла все остальные задачи. В принципе, программа могла потеснить TSR'ы, выполнив инструкцию CLI. Однако, было немаскируемое прерывание №2 (NMI), которое этой инструкцией не маскировалось. Однако, и его можно было замаскировать, перепрограммировав контроллер прерываний.

                Блядь, как всё сложно.
                Ответить
                    • Так не честно. От явного вызова int ты ничем не замаскируешься.
                      Ответить
                      • Кстати, контроллер прерываний я зря упомянул. Он же обрабатывает только IRQ (прерывания 0x08 — 0x0F и 0x70 — 0x77, если я не путаю). А сигнал для NMI приходит по другим ножкам. И маскируются NMI они через какой-то отладочный регистр. Придётся гуглить, короче.
                        Ответить
                        • Короче странное это NMI, по сути аналог нынешнего MCE - репорт о том, что железу совсем хуёво.
                          Ответить
                    • Честных способов получается два:

                      - послать сигнал снаружи через соотв. пин процессора
                      - кинуть IPI через APIC (но во времена DOS его не было)
                      Ответить
                      • >> The first APIC was the 82489DX – it was a discrete chip that functioned both as local and I/O APIC. The 82489DX enabled construction of symmetric multiprocessor (SMP) systems with the Intel 486 and early Pentium processors.

                        Во времена «четвёрок» и первых «пней» «DOS» ещё активно использовали.
                        Ответить
                        • Офигеть, они его ради серверов запилили? На десктопе в то время SMP явно никто не юзал.
                          Ответить
                          • > На десктопе в то время SMP явно никто не юзал.

                            Лол, ты мне напомнил очень смешное предсказание создателя OCaml [1]:

                            Самая мякотка:

                            > Shared-memory multiprocessors have
                            never really "taken off", at least in the general public. For large
                            parallel computations, clusters (distributed-memory systems) are the
                            norm. For desktop use, monoprocessors are plenty fast. Even if you
                            have a 4-processor SMP machine, it isn't clear whether you should
                            write your program using shared memory or using message passing -- the
                            latter is slightly more expensive, but scales to clusters...

                            > What about hyperthreading? Well, I believe it's the last convulsive
                            movement of SMP's corpse 🙂 We'll see how it goes market-wise. At
                            any rate, the speedups announced for hyperthreading in the Pentium 4
                            are below a factor of 1.5; probably not enough to offset the overhead
                            of making the OCaml runtime system thread-safe.

                            [1] https://groups.google.com/forum/?_escaped_fragment_=msg/fa.caml/0CN8LIYDX0Y/xMsXNbB5csoJ
                            Ответить
                            • То есть мультиядра и гипертрединг на бытовых компьютерах — это мошенничество, чтобы содрать с покупателей побольше денег?
                              Ответить
                              • OCaml на это мошенничество до сих пор не повёлся, хотя подвижки есть вроде. Плавающий питух — тоже мошенничество, ибо только двойной питух масштабируется на кластеры.
                                Ответить
                                • Нет тредов - нет проблем с ними. В общем-то норм ход с точки зрения предсказуемости кода.
                                  Ответить
                                  • Ну окамл и создавался изначально для символьных вычислений. Их можно тупо майкфайлом параллелить. Это потом его за каким-то хером потащили в задний конец.
                                    Ответить
                                • А какую архитектуру создатель OCaml'а считает единственной вменяемой?
                                  Ответить
                            • >not enough to offset the overhead
                              of making the OCaml runtime system thread-safe.

                              У гиловцев примерно такой же аргумент: поддержите мне норальную многопоточность не уронив скорость и не усложнив код
                              Ответить
                              • > у гиловцев

                                (запрещённой на территории с++ организации)

                                Не усложнив скорость и не уронив код.
                                Ответить
                                • не ускорив возрастание сложности:)
                                  Вообще это аргумент Гвидо был. Но ведь GIL есть не только в cPython, но и в MRI. Возможно, Мац думает так же.

                                  Оба языка появились, когда большинство компов были однопроцессорными, и смысла в параллельно работающих тредах не имали
                                  Ответить
                                • Ну они таки ускорили GIL. Первый был вообще анскилльным и трешил ядра от любой многопоточной нагрузки. А от ctrl-c вместо выхода превращался в cpu burn.
                                  Ответить
                                  • Поэтому я за "Erlang". SMP там был со времён царя гороха, эриксоновцы просто взяли и запилили.
                                    Ответить
                                  • ты его форсил, я помню, и я проверял, и получились очень крутые результаты

                                    но джитится, понятное дело, далеко не всё)
                                    Ответить
                        • APIC работает в режиме эмуляции PIC, если его явно не переключить.
                          Дос не переключал, и думал, что он работает с 8259.

                          Это конечно не давало ему возможности использовать SMP (и еще таймеры какие-то), но досу было похуй
                          Ответить
                          • В теории я могу запустить APIC и пробудить остальные ядра, а потом сделать вид, что ничего не было...
                            Ответить
                            • а остальные ядра будут крутиться, и греть воздух?

                              Емнип, там нужно поставить в памяти спец трамплин, и послать IPI другим ядрам. Они проснутся, полезут в трамплин, ну и дальше куда он их направит
                              Ответить
                              • Дык я подставлю им трамплин в свой код и буду их юзать. А "DOS" об этом не узнает.
                                Ответить
                                  • Да нет, просто можно тогда не пердолиться со всякими dos extender'ами. Запустился на втором ядре, настроил себе там уютное 32-битное окружение и работаешь.
                                    Ответить
                                    • типа одно ядро в реальном, а второе нет? Ого)
                                      А IOPIC сдюжит?
                                      Ответить
                                      • Да APIC'у то насрать, он интеррапт зарепортит ядру, дальше не его проблема. Другое дело, что DOS офигеет от того, что эмуляция PIC'а отвалилась.
                                        Ответить
                                        • ну да, офигеет: ведь протокол работы у PIC другой.

                                          А еще нужно, чтобы дос случайно не затер какие-то структуры.. защищенному режиму вообещ нужен первый мегабайт?
                                          Ответить
                                          • > защищенному режиму вообещ нужен первый мегабайт

                                            Нет. Можно всё повыше закинуть. Ну кроме трамплинов в реалмод и обратно, если они нужны.
                                            Ответить
                                      • > Приведи реальный пример кода

                                        Код по запуску второго ядра у меня где-то был. А вот флешки с досом, к сожалению, нету.
                                        Ответить
                            • Типа как «нереальный режим», когда переключаешься в защищённый, ставишь лимиты по 4 гига, а потом возвращаешься и делаешь вид, что ничего не было?
                              Ответить
                              • да, но это хак конечно, но многим помогал

                                а вот идея держать два ядра в разных режимах -- этолул, я такого еще не видел
                                Ответить
                                  • и это тоже

                                    я впервые увидел мать с двумя сокетами в 2002 где-то году, кажется это была мать под пень OverDrive (помнишь его?)

                                    А много позже я увидел тему на форуме про "как писать под два процессора? нужно два main()?"
                                    Ответить
                                      • ты видел эту тему? а как мне ее найти?
                                        Ответить
                                              • Там еще был такой коммент: "я один раз видел программу под мощный сервер с 64-мя ядрами, так там было 64 main"

                                                Нон коммент не точный, так что не нагуглить
                                                Ответить
                                                • Мне всегда интересно было, покажет ли слака 64 пингвина на 64 ядрах (это же фича ванильного ядра?)
                                                  Ответить
                                        • Там, кстати, есть реально рабочий код на «Паскале»:
                                          Begin               Begin               Begin              Begin              Begin
                                           Begin               Begin               Begin              Begin              Begin
                                            Write('H   H ');    Write('EEEEE ');    Write('L     ');   Write('L     ');   Writeln(' OOO ');
                                            Write('H   H ');    Write('E     ');    Write('L     ');   Write('L     ');   Writeln('O   O');
                                            Write('HHHHH ');    Write('EEE   ');    Write('L     ');   Write('L     ');   Writeln('O   O');
                                            Write('H   H ');    Write('E     ');    Write('L     ');   Write('L     ');   Writeln('O   O');
                                            Write('H   H ');    Write('EEEEE ');    Write('LLLLL ');   Write('LLLLL ');   Writeln(' OOO ');
                                           End;                End;                End;               End;               End;
                                          End;                End;                End;               End;               End.
                                          Ответить
                                        • А ещё там была шиза про торсионные поля и вихревое программирование:
                                                   . . }          
                                                 .    ( .         
                                               {   1     .)       
                                              )  i    (..)   {    
                                             .      0      {   .  
                                             .  a  n     v  .     
                                             (     i      o  . .  
                                             2   m  a    i   .    
                                              n       m d   }  .  
                                               i   d      v       
                                                a    i  o    }    
                                                  m        v      
                                                     d i o
                                          Ответить
                                        • инью, ты не читал что-ли?

                                          Советую прочитать первые пять-шесть страниц минимум, там очень крутые комменты
                                          / на пять процессоров
                                          
                                          Begin               Begin               Begin              Begin              Begin
                                           Begin               Begin               Begin              Begin              Begin
                                            Write('H   H ');    Write('EEEEE ');    Write('L     ');   Write('L     ');   Writeln(' OOO ');
                                            Write('H   H ');    Write('E     ');    Write('L     ');   Write('L     ');   Writeln('O   O');
                                            Write('HHHHH ');    Write('EEE   ');    Write('L     ');   Write('L     ');   Writeln('O   O');
                                            Write('H   H ');    Write('E     ');    Write('L     ');   Write('L     ');   Writeln('O   O');
                                            Write('H   H ');    Write('EEEEE ');    Write('LLLLL ');   Write('LLLLL ');   Writeln(' OOO ');
                                           End;                End;                End;               End;               End;
                                          End;                End;                End;               End;               End.
                                          Ответить
                                          • Чтобы на CUDA писать нужно как минимум 100 мониторов, иначе каждую строчку по горизонтали скроллить придётся пять минут.
                                            Ответить
                                            • Код под CUDA на плоскости показать не получится. Нужно что-то в духе стопки из сотни-другой полупрозрачных мониторов, на каждом из которых видно код для 16 тредов.
                                              Ответить
                                              • Не обязательно. SIMD код просто редактируют с помощью Sublime Text, там лучшая поддержка multi-cursor editing.
                                                Ответить
                                            • причем там все mainы будут одинаковые, single instruction же. Заебешься копипастить...

                                              А если они разные, то это нарушение ODR, и UB:(
                                              Ответить
                                              • Не все. Только в пределах одного варпа (тех самых 16 "тредов").

                                                На других экранах ты можешь другой код написать при желании.
                                                Ответить
                                                • То есть я могу взять 16 курсоров по совету Снаута, и писать целиком под варп?
                                                  Ответить
                                                  • А теперь представь сколько тредов тебе придётся написать для пост-обработки каждого пикселя на 4к экране.

                                                    Геймдев - очень скучное занятие, походу.
                                                    Ответить
                                                    • А если я пишу под разные ядра, то мне еще нужно синхронизировать код.

                                                      Например, в одном мейне я установил переменную в шареной памяти, и чтобы она была видна в другом, нужно чтобы строчка была ниже.

                                                      Я иногда переводами строк добиваю второй мейн, чтобы он совпадал.. Один раз случайно включил в редакторе soft wrap, длинные строчки перенеслись, и код сломался(
                                                      Ответить
                                                      • Для синхронизации тебе нужно провести барьер:
                                                        // примерно так
                                                            a[0] = 1;    a[1] = 1;
                                                        // -----------------------
                                                            x = a[1];    y = a[0];
                                                        Ответить
                                                        • а если я не хочу остальные треды тормозить об этот барьер, я вроде могу сделать вот такую воронку:
                                                          // примерно так
                                                              a[0] = 1;    a[1] = 1; some_Fun()
                                                          // ------------------------\                   /-----
                                                              x = a[1];    y = a[0];


                                                          но там нужно название функции по короче выбрать, иначе не пролезет. Потому в сишке такие короткие названия обычно?
                                                          Ответить
                                                          • Ну да, ты даже можешь изогнуть его для оптимизации, чтобы пустыми строками не разбавлять код:
                                                            // вот так
                                                               a[0] = 1;    a[1] = 1;     a[2] = 1;
                                                            // -----------------------\\  a[2] += 1; 
                                                               x = a[1];    y = a[2]   \\-------------
                                                               x *= 2;      y *= 2;       z = a[0];
                                                            Ответить
                                                            • А вообще почему исполние идет сверху вниз? потому что intel?
                                                              Вот стек же может на разных архитектурах в разную сторону расти, и байтордер может быть разный.
                                                              Если я пишу под Sparc, то у меня код вверх идет, или в бок?
                                                              Ответить
                                                              • > байтордер
                                                                int x;char y;int z; // эти переменные упакованы
                                                                int x; char y; int z; // а между этими есть паддинг
                                                                
                                                                gnol x; // little-endian
                                                                long x; // big-endian
                                                                nglo x; // pdp-endian
                                                                Ответить
                                                                • Я так структуру оптимизировал для 32-х битного режима.
                                                                  struct foo {
                                                                      uint8_t a;
                                                                      uint8_t b;
                                                                  //1   
                                                                  //2    
                                                                     uint32_t c;
                                                                  }

                                                                  А потом под 64 пришлось переделывать
                                                                  struct foo {
                                                                      uint8_t a;
                                                                      uint8_t b;
                                                                  //1   
                                                                  //2
                                                                  //3   
                                                                  //4
                                                                  // 5
                                                                  // 6
                                                                     uint32_t c;
                                                                  }


                                                                  думаю, препроцессор использовать, чтобы он эти переносы строк встапвлял
                                                                  Ответить
                                                    • > А теперь представь сколько тредов тебе придётся написать для пост-обработки каждого пикселя на 4к экране.

                                                      Пиксельные шейдеры на Piet программируют, в MS Paint.
                                                      Ответить
                                      • Почему этого кода нет на "Говнокоде"?
                                        Ответить
  • Автор есть говнокодер по неуважительной причине - никто кроме него не знает по какому чиху он воткнул в цикл обработку очереди оконных сообщений, да он и сам вряд ли знает, ему всего лишь "кажется".. Начитался букварей и воткнул)

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

    Сам же по себе Application.ProcessMessages не есть проблема, если он используется по уму, осознанно и только там где без него действительно сложно обойтись по объективным причинам
    Эти причины говнокодеру и следовало хотя бы кратко изложить ув комменте вместо своего школотного "кажется"
    Ответить
      • Носовский Пилюлькин всех касторкой лечил, а ты свой пхп тычешь к месту и не к месту, даже не вдупляя о чём идёт речь)
        Рекомендую не рекомендовать.
        Ответить
        • "PHP" - это единственный язык программирования, который не ебёт мозги программисту. Ты просто набираешь код, загружаешь его на сервер и течёшь от наслаждения. Никаких доёбов до типов данных, никаких компиляций - просто спокойное, течное программирование.
          Ответить
          • В пхп есть типы данных и компиляция.

            Типов данных нет в языке Fort. Компиляции нет в языке Bash. И в TCL. Но в TCL, к сожалению, есть типы данных. Целых три.
            Ответить
    • В корне неверный подход и автор далеко не говнокодер. Он пытается обойтись дрочкой, не прибегая к вульгарному совокуплению.
      Процессмессагес можно смело юзать, не забывая блокировать контролы, иначе возможен повторный вход в обработчики.

      Можно было сделать так:

      // добавляем новые ссылки
        for i := 0 to ATags.Count - 1 do
        begin
          // цикл - блокирующая операция
          Application.ProcessMessages;
          if Application.Terminated then Break;


      После чего форма начинает корректно реагировать на закрытие. Правда, больше ничего с ней сделать нельзя. И тем не менее, это не говнокод.
      Ответить
  • Смешной багор: один heavyweight компонент в свинге скролится мышкой в обратную сторону, причем только на винде, вызывая у всех бугор.

    heavyweight это нативное окошко операционки, которое получает от нее события, и перенаправляет их в джаву.

    Внимательный читатель сразу доагадется, чего не учли авторы компонента:
    https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseWheelEvent.html#getWheelRotation()
    https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mousewheel (wParam)
    Ответить
  • На какой язык backend-разработки лучше всего переходить с уёбищного PHP?
    Ответить
      • Каковы его достоинства и для чего конкретно он подойдёт?
        Ответить
        • > Каковы его достоинства

          Асинхронный код выглядит как обычный код, а не целебный обмаз колбэками.

          > и для чего конкретно он подойдёт?

          Для любого сетевого кода
          Ответить
          • Зачем нужен асинхронный код, если можно запустить ещё один инстанс "PHP" и течь?
            Ответить
            • Совершенно верно. Все фоновые задачи нужно сохранать в "май эс ку эл" и выполнять по крону.
              Ответить
            • Ты ведь понимаешь, что мои призывы писать скрипты на PHP были всего лишь воплем отчаяния и я латентно мечтал перейти на более профессиональный язык?
              Ответить
                • Это я и есть. Просто "троллинг" про элитарность PHP и помешанность на кавычках уже давно себя изжили и стали крайне унылы. Кстати, когда-то всё это мне действительно было свойственно, но постепенно я убедился в том, что PHP - устаревшее говно, а с тоннами кавычек я со стороны выгляжу полным дебилом. Но озарение пришло, а образ остался (должен был кто-то ворошить это гнездо, в которое уже десять лет никто со стороны не приходит).
                  Ответить
              • А я что-то уже заебался, если честно. На нём в последнее время ничего годного не написать. Действительно, как я писал ранее, - язык для кулинарных блогов.
                Ответить
                • Залей же ещё одну гостевуху по «FTP», да выпей чаю.
                  Ответить
            • Go сделан для гоферов, которым гугл боится доверить в руки стеклянный хуй. Erlang сделан для про, которые заходят в REPL на живой ноде и делают sys:replace_state.
              Ответить
              • То есть, в Erlang можно писать как попало (я привык к этому в PHP и мне сложно привыкнуть к той ректальной огороженности каждой строки, которая есть в Go)? Я имею в виду - импортировать библиотеки и временно не использовать их, комментировать одну строку без комментирования десятка других и т.д.
                Ответить
                • Erlang доверяет программисту. Чекеры у него идут в комплекте (xref, dialyzer), но их можно не включать, лол.
                  Ответить
              • > гугл боится доверить в руки стеклянный хуй.
                ну да, там же вроде такой аргумент и был: "мы не можем ждать, что к нам придут С++ программмисты, нам нужен язык для быдла"

                алсо
                а разве за заход программиста на живой сервер не отрезают руку?
                Ответить
                • > а разве за заход программиста на живой сервер не отрезают руку?

                  Если анальные логи ведутся и формально допуск к данным одобрен, то не отрезают. Девопс культура, мать её.
                  Ответить
                  • А если у него палец дрогнет, и он всё сломает?
                    Ответить
                    • Ну починит обратно к утру, что делать. Сегодня девопсу предстоит трудная ночь.
                      Ответить
                    • Как у долбоёба, несколько лет назад удалившего базу данных GitHub (если я правильно помню это события).
                      Ответить
                    • Всё самопочинится. На прошлом месте я от скуки писал тесты, которые брали и рандомные места в коде ломали.
                      Ответить
                      • А если оно не в то состояние самопочинится, как гитхаб?
                        Ответить
                      • Есть такие тесты на тесты

                        Они ломают куски кода, и смотрят -- упадут-ли тесты

                        Если не упали, значит тесты -- говно
                        Ответить
            • Кстати, Go бы тебе подошел.

              Он не сложный, и по идее ПХП программисту не должно быть с ним тяжко.
              Ответить
              • Можно ли переносить скомпилированную программу на другой сервер той же архитектуры и запускать её там без установки самого Go?
                Ответить
                • да, можно.

                  Go линкуется статически, и получается огроооомный файл. Но один.

                  Например yourproject.exe.
                  Ты просто запускаешь его, и течешь.
                  Ответить
                  • Ещё нужно перезапускать, если программа упала.
                    Ответить
                  • Повлечёт ли активное использование interface в структурах значительную утечку памяти?
                    Ответить
                    • Я не знаю как это работает в go, к сожалению.

                      Виртуальные методы через указатель в целом медленнее по понятным причинам, но например в Java все методы виртуальные, и ты всё равно получаешь invokevirtual даже если у тебя класс закрытый и не может иметь детей
                      Ответить
                • Да, там вроде всё статически линкуется, можно прогу закинуть на сервак и течь. Ставить "го" будешь только на свою тачку.
                  Ответить
    • попробуй сначала аккуратно питон или руби
      там много ваших
      Ответить
      • Пиздец, у тебя хоть что-то человечное есть?
        Если я обращусь тебе с советом как мне лучше покончить собой, ты мне расскажешь как, или попытаешься отговорить?
        Ответить
        • Если вдруг решишься, то помни, что резать нужно вертикально, а не горизонтально, не смотря на то, как это принято в массовой культуре
          Ответить
          • > резать нужно вертикально, а не горизонтально

            Ты про масштабирование серверов?
            Ответить
            • Масштабировать как раз лучше горизонтально. Это Фаулер еще в 2003-м году писал, за долго до облаков и вообще хардварной виртуализации
              Ответить
              • Дык ты и делаешь вертикальные разрезы чтобы масштабировать горизонтально.
                Ответить
                • а) типа запускаю N виртуалок/контейнеров/микросервисов на одном сервере?
                  Ответить
              • Фаулер, который придумал класть пациентов в промежуточное положение между лежачим и сидячим, или Фаулер, который изобрёл выдвижные закрылки самолёта?
                Ответить
                • Воспитанник «Ливерпуля», один из наиболее выдающихся футболистов в истории клуба
                  Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8