1. C++ / Говнокод #21362

    −21

    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
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    // Этот код отрабатывает при старте программы.
    // Он запускает некоторое количество потоков
    
    for (int ThrNum=0; ThrNum<=(MAX_THREADS-1); ThrNum++){ // threads loop
    DWORD ThreadID;
    hEventsArrayRdy[ThrNum] = CreateEvent(NULL,TRUE,FALSE,NULL);
    hEventsArrayRqst[ThrNum] = CreateEvent(NULL,TRUE,FALSE,NULL);
    hThreadArray[ThrNum] = CreateThread(NULL,0,RuskThrdFunc1,0,0,&ThreadID);
    }
    
    
    
    
    
    // Вот эта радость основная функция, которую движок запускает на n потоков. Скажем, на 16.
    // Тут поток ожидает команды на выполнение полезной нагрузки
    // И здесь же ставит флаг о том, что полезная нагрузка выполнена.
    // Как видно, он ищет еще не занятую область экрана после того, как отработал предыдущую.
    
    DWORD WINAPI RuskThrdFunc1( LPVOID lpParam ){    // standart function for one thread
    int THRD_num,RunNew,ScrAr;
    AvoidWarn=lpParam;                               // warning avoid
    // > detect thread num
    EnterCriticalSection(&RuskMTSec);                // enter to critical section
    ThreadNumb++;THRD_num=ThreadNumb;                // for thread num detect
    LeaveCriticalSection(&RuskMTSec);                // leave critical section
    // < detect thread num
    // > main thread wait time
    more:;
    DWORD dwWaitResult = WaitForSingleObject(hEventsArrayRqst[THRD_num],INFINITE); // wait for request
    if (dwWaitResult==WAIT_OBJECT_0){                // request is correct, so start it realization
    ResetEvent(hEventsArrayRqst[THRD_num]);          // no more wait for request
    // < main thread wait time
    //
    //
    // >> main calculation
    goto startcalc;                                  // jump to entry point
    calcmore:;
    //    > calculate calls
    if (GlThr_RequestId==THREQ_3dbasil){rusk.B3D_putThrds(SCRARMT,RunNew);} // __ put all =3d-basil= direct
    if (GlThr_RequestId==THREQ_gingerbr){rusk.GBputThrds(SCRARMT,RunNew);}  // __ put all =gb system= pics
    if (GlThr_RequestId==THREQ_user01){rusk.User01Mult(SCRARMT,RunNew);}    // __ request for user 01 private multithr func
    //    < calculate calls
    //    > search for uncalculated screen area
    startcalc:;
    EnterCriticalSection(&RuskMTSec);                // enter to critical section
    RunNew=-1;                                       // no screen part for calculate by default
    for (ScrAr=0; ScrAr<SCRARMT; ScrAr++){           // loop all screen parts
    if (ScrAreaReq[ScrAr]==0){ScrAreaReq[ScrAr]=1;RunNew=ScrAr;break;} // find next free area for calculating it
    }
    LeaveCriticalSection(&RuskMTSec);                // leave critical section
    if (RunNew>=0){goto calcmore;}                   // screen area for calculating is found
    //    < search for uncalculated screen area
    // << main calculation
    //
    //
    // > put rdy signal and go to wait time
    SetEvent(hEventsArrayRdy[THRD_num]);             // set flag, that request is done
    }
    goto more;                                       // go to wait for next request
    // < put rdy signal and go to wait time
    return 0;
    }
    
    
    
    
    
    // А вот так движок посылает сигнал всем запущенным потокам, что пора просыпаться и работать.
    // Здесь же движок ожидает завершения работы всех потоков.
    
    GlThr_RequestId=THREQ_3dbasil;                   // request id for threads
    for (int ScrAr=0; ScrAr<SCRARMT; ScrAr++){ScrAreaReq[ScrAr]=0;} // ini screen areas flags
    for(int i=0; i<=(MAX_THREADS-1); i++){SetEvent(hEventsArrayRqst[i]);} // request all theads to calculate
    WaitForMultipleObjects(MAX_THREADS, hEventsArrayRdy, TRUE, INFINITE); // wait for all threads
    for(int i=0; i<=(MAX_THREADS-1); i++){ResetEvent(hEventsArrayRdy[i]);} // wait all threads no more

    - У тебя есть примеры как многопоточку реализовывать?
    - Могу рассказать, как у меня сделано...

    Запостил: Povelitel, 07 Октября 2016

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

    • А правда,тока goto и не хватало в многопоточном-то коде на с++
      Стиль кодирования -"феерия"
      Ответить
      • Там и с++ почти нет. Даже rusk.B3D_putThrds может быть сишной структурой с полем-указателем на функцию.
        Ответить
    • Омг омг омг никому не пожелаю такое читать и отлаживать. Стена букв.
      Ответить
      • Так его никто кроме автора и не читает и не отлаживает. Так что все норм.
        И да, на сходочке он еще куски показывал, там даже отступ в одном месте был. Или в двух. На проект.
        Ответить
    • показать все, что скрытоПросьба не критиковать код. Его автор делает удивительные игры и не навязывает свой стиль кодирования, а Povelitel, запостивший его сюда поступил подло, а еще он возможно трансгендер http://www.gamedev.ru/users/?id=71586 .
      Ответить
      • Что тут подлого? Запостил код ну и что? тут все так делают и им не стыдно за это!
        Так что пошел нахуй обоссаная защеканская шлюха Мухосранска.
        Ответить
        • Хорошо, что ты представился в последнем предложении. Уважаю людей за то, что говорят о себе как есть и не стесняются этого.
          Ответить
          • Сам собой разговаривать не очень, шизик
            Ответить
      • Постю где хочу и законом не запрещено.
        Ответить
      • Писать такой код может только говноед.
        Ответить
      • автор, залогинься
        Ответить
    • Дело не в стиле ,а в goto . Первый раз в многопоточность коде такое вижу
      Ответить
      • Гость, чем готу в многопоточном коде отличается от готу в однопоточном?
        Ответить
        • показать все, что скрытоGoTo - плохая практика. Однопоточные проги проще отлаживать, по причине линейности. А в многопоточном использование GoTo - неприемлемо и опасно, затрудняет отладку и может стать причиной UB.
          Ответить
          • Давай, поучи меня программировать, минусатор.
            Ответить
            • показать все, что скрытоЯ не минусую, о чем это ты?
              Ответить
              • О твоих ботах-минусаторах
                Ответить
                • показать все, что скрытоНе смей поминать моих ботов, погибших смертью храбрых.
                  Не забыл, не удалил, не Страйко затёр - наебнулись вместе с диском. Неслыханно.
                  Ответить
                  • Фу бля, фу нахуй.
                    Пойду забекаплю свои сорцы и ботов.

                    Кстати, я своим дал одинаковые пароли, и однотипные имена. Восстановить будет легче
                    Ответить
                    • например pdro1:123, pdro2:123, pdro3:123?
                      Ответить
                      • не, это не мои
                        но пароль от моих первых ботов ты отгадал правильно
                        Ответить
                        • Его невозможно было не отгадать.
                          Ответить
                          • Мне кажется, ты намеренно задаёшь такие простые пароли.
                            Вопрос: зачем? Ты стройко?
                            Ответить
                            • показать все, что скрытоНа самом деле, Страйко-это я,но Ваша модель сознания слишком примитивна, чтобы понять это. Ваш ум слишком несовершенен, чтобы уместить мои грандиозные замыслы. И вообще, почитайте про агностицизм.
                              Ответить
                  • Я так и знал что ты СТЕРТОР
                    Ответить
    • показать все, что скрыто>>EnterCriticalSection(&RuskMTSec); // enter to critical section
      ThreadNumb++;THRD_num=ThreadNumb; // for thread num detect
      LeaveCriticalSection(&RuskMTSec);

      - InterlockedIncrement? Не, не слышал.
      Ответить
      • А еще можно номер потока давать в поток в качестве аргумента, тогда не будет нужно AvoidWarn=lpParam;
        Ответить
      • What are you talking about? What "InterlockedIncrement"?
        How about
        ```
        std::atomic<int> ThreadNumb;
        //...
        ThreadNumb++;
        ```
        ?
        Ответить
    • Кто болеет за сборную камеруна по футболу?
      Ответить
    • > CreateThread
      Сжечь нахуй.
      Ответить
      • Прально, _beginthreadex же.
        "A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread; this requires the use of the multithreaded version of the CRT. If a thread created using CreateThread calls the CRT, the CRT may terminate the process in low-memory conditions."

        Это потому, что программист не может нормально вычислить размер стека под тред, в котором вызывается CRT, а _beginthreadex может? Или в чем дело?
        Ответить
        • CRT не будет работать иначе

          http://www.viva64.com/en/w/V513/print/
          Ответить
      • и првда

        Win32APIшный кол же для читых сей, кода с CRT не линкуешься
        Ответить

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