Задать вопрос
  • Symfony многоядерность?

    IgorPI
    @IgorPI Автор вопроса
    Михаил Рыбалка, Да нет же.
    Обратите внимание на
    5d8b9a52e5ff1771045296.png

    И в папке Controllers формально можно держать несколько одинаковых роутеров и их имён
    Мы даже бендлы грузим соответствующие конфигурации.

    И когда мы загружаем одно из ядер.
    Мы также пробегаемся по всем контроллерам, которые принадлежат ядру.
    Например может быть 2 контроллера, с одинаковыми роутерами, но делающие разные задачи.

    Например

    admin.rusaddress.local/user.getById?id=1
    api.rusaddress.local/user.getById?id=1

    При этом будут задействованы 2 разных контроллера, с одинаковыми аннотациями.
  • Symfony многоядерность?

    IgorPI
    @IgorPI Автор вопроса
    Каждый роут должен быть уникален.

    В моём проекте роуты не уникальны.

    Как бы, я имею 2 одинаковых контроллера, но с разными ядрами.

    Почему так?
    Один из контроллеров может пойти по другому пути развития и схема ответа может поменяться и всё что угодно.

    В итоге я имею вот такой API

    api.rusaddress.local/user.get
    admin.rusaddress.local/user.get
  • Symfony многоядерность?

    IgorPI
    @IgorPI Автор вопроса
    Напоминаю, я реализовал многоядерность.
    По идеи я должен загрузить только те контроллеры которые относятся к тому или иному окружению.

    Моя ошибка на изображении

    5d8b4ba4cb794349033598.jpeg
  • Что такое модель в ООП в веб?

    IgorPI
    @IgorPI
    Я забыл добавить.
    Это как раз связанно с моделями.

    Например вы можете с помощью репозитория загнать данные в модель

    $repository = $this->getDoctrine()->getManager()->getRepository("App:Organization");
    
    // $organization - это объект класса модели
    /** @var Organization $organization */
    $organization = $repository->getById($request->get("id"));
    
    // в лево отдаём ещё одну модель 
    // $country - это объект класса модели
    /** @var Country $country */
    $country = $organization->getCountry();
    
    // Название города 
    // getName()  это геттер объекта модели country
    echo $country->getName();
  • Ошибка в Symfony в окружении dev?

    IgorPI
    @IgorPI Автор вопроса
    Алексей Скобкин, я сделал вот так

    proxy_dir: '%kernel.project_dir%/var/cache/dev/doctrine/orm/Proxies'


    Но меня смущает вот это ../dev/..

    Я ещё не совсем понимаю как Symfony загружает конфигурацию

    5d8273a874ad5876397281.png

    Имея на вооружении
    config/api/packages/dev
    config/api/packages/prod

    Можно же как то разделить конфигурацию для разных окружений?
  • Как получить координаты нужного километра на трассе или по километрам?

    IgorPI
    @IgorPI
    Может быть это?

    API построения оптимальных маршрутов объезда нескольких точек — сервис для построения оптимального маршрута объезда нескольких точек (задача коммивояжера) и оптимального распределения точек по нескольким маршрутам. Например, сервис позволяет распределить оптимальным образом заказы по машинам с учётом окон доставки и других ограничений.

    Матрица расстояний — сервис для расчета попарных маршрутов между многими точками с учётом текущей ситуации на дорогах, а также прогноза на заданное время.

    Получение деталей маршрута — сервис для получения геометрии и деталей маршрута по заданному набору точек.
  • Delphi Thread try finally?

    IgorPI
    @IgorPI Автор вопроса
    Ок, массу ошибок исправил.
    Всё время негодовал, да что же это такое, программа просто вылетала без предупреждения и всяких там AV.
    При чём всё вроде бы правильно.

    Да, к компонентам я всегда обращался с Synchronize

    Я действительно думал, что к переменным MainThread можно обращаться и потоков.

    Но теперь то мы заживём!
  • Ошибка в Symfony в окружении dev?

    IgorPI
    @IgorPI Автор вопроса
    И ещё одна особенность.
    Папку с кешем нельзя удалить.

    Её что-то блокирует даже если я останавливаю докер O_o
    Вот это поворот.
  • Ошибка в Symfony в окружении dev?

    IgorPI
    @IgorPI Автор вопроса
    Следует выяснить, что вызывает причину двойного выполнения скрипта.
  • Ошибка в Symfony в окружении dev?

    IgorPI
    @IgorPI Автор вопроса
    Daria Motorina, Нет, не в этом дело.
    В докере все под рутом!

    И если бы не было разрешений, то и в prod такая же байда была бы.
  • Ошибка в Symfony в окружении dev?

    IgorPI
    @IgorPI Автор вопроса
    Daria Motorina, Я заметил одну странную особенность

    Всё это дело крутится в докере.

    И если не открепляться от консоли, то можно наблюдать логи в реал тайм.
    При выполнении одного запроса из клиента, почему-то выполняется 2, вместо одного.

    В окружении прод такого нет.
  • Delphi Thread try finally?

    IgorPI
    @IgorPI Автор вопроса
    Hemul GM, Да, конечно.
    Про синхронизацию мне известно.
    Но вот только я был уверен в том что не визуальные компоненты можно делить между потоками.
    Хз почему так думал. Но теперь мне понятно, что между потоками без синхронизации делить нечего не нужно.

    Я остановился на варианте предложенный zedxxx

    Вариант предложенный zedxxx идеально подошёл!
    Проблема исчезла, как бабушка пошептала.
  • Delphi Thread try finally?

    IgorPI
    @IgorPI Автор вопроса
    zedxxx, оформите как ответ.
    Я отмечу решением.
  • Delphi Thread try finally?

    IgorPI
    @IgorPI Автор вопроса
    zedxxx, Капец :)

    + в карму
  • Delphi Thread try finally?

    IgorPI
    @IgorPI Автор вопроса
    Ок, хорошо.
    А как тогда быть здесь?

    while ThreadCounter >= 3 do
          begin
            Application.ProcessMessages;
            Sleep(300);
          end;


    Мы в главном потоке обращаемся к переменной ThreadCounter
    Которая может быть заблокирована.
  • Delphi Thread try finally?

    IgorPI
    @IgorPI Автор вопроса
    Спасибо, действительно, я вообще не где не поставил ThreadCounter := 0;
    Хотя был уверен, что я это сделал, невнимательность.
  • Delphi Thread try finally?

    IgorPI
    @IgorPI Автор вопроса
    zedxxx, Я тоже )))
  • Delphi Thread try finally?

    IgorPI
    @IgorPI Автор вопроса
    zedxxx, Есть подозрения.

    Дело в том, что иногда работает, а иногда просто стопориться.
    Как в рулетке.

    Не знал о существовании InterlockedDecrement() and InterlockedIncriment();
  • Delphi Thread try finally?

    IgorPI
    @IgorPI Автор вопроса
    Полная версия
    procedure TMainForm.CollectUrl;
    var
      KWEnum: TStringsEnumerator;
      Thread: TCollectUrlThread;
      ThreadCounter: Integer;
      ProjectId: Integer;
    begin
      try
        if moKeywords.Lines.Text.Length = 0 then
        begin
          raise Exception.Create('Нет не одного ключевого слова, действие отменено!');
        end;
    
        KWEnum := moKeywords.Lines.GetEnumerator;
    
        ProjectId := Dm.settings.ReadInteger('CurrentProject', 'id', 0);
    
        if ProjectId = 0 then
          raise Exception.Create('Проект не существует, действие отменено!');
    
        Progress.Max := moKeywords.Lines.Count;
        Progress.Visible := true;
        lbStatustext.Text := 'Загрузка контента...';
        while KWEnum.MoveNext do
        begin
          Progress.Value := Progress.Value + 1;
          Thread := TCollectUrlThread.CreateAnonymousThread(
            procedure
            var
              Content: string;
              uri: TURI;
              i: integer;
              KRUrl: TKRUrl;
              KRUrls: TArray<TKRUrl>;
              KRUrlsCollection: TArray<TKRUrl>;
              mce: TMatchCollectionEnumerator;
    
              this: TCollectUrlThread;
            begin
              this := TThread.Current as TCollectUrlThread;
    
              TThread.Synchronize(this,
                  procedure
                  begin
                    mNoFindByKeyword.Lines.Add(format('Thread start: %d', [this.ThreadID]));
                  end);
              
              try
               // https://site/search/?q=%D0%9A%D1%80%D0%B0%D1%81%D0%BA%D0%B0&how=r
                uri := TURI.Create('https://www.site.ru');
                uri.Path := '/search/';
                uri.AddParameter('q', this.keyword);
    
                try
                  Content := GetContent(uri.ToString);
                  KRUrls := ParseUrls(Content);
    
                  try
                    for KRUrl in KRUrls do
                    begin
                      SetLength(KRUrlsCollection, Length(KRUrlsCollection) + 1);
                      KRUrlsCollection[Length(KRUrlsCollection) - 1].article := KRUrl.article;
                      KRUrlsCollection[Length(KRUrlsCollection) - 1].title := KRUrl.title;
                      KRUrlsCollection[Length(KRUrlsCollection) - 1].url := KRUrl.url;
                      KRUrlsCollection[Length(KRUrlsCollection) - 1].position := 0;
                    end;
                  except
                    on E: Exception do
                      OutputDebugString(PWideChar(E.Message));
    
                  end;
    
                  if TRegEx.IsMatch(Content, '\/search\/\?.*?(")', [roSingleLine]) then
                  begin
                    mce := TRegEx.Matches(Content, '\/search\/\?.*?(")', [roSingleLine]).GetEnumerator;
    
                    while mce.MoveNext do
                    begin
                      try
                        Content := GetContent(Format('https://www.site.ru%s', [mce.Current.Value]));
                        KRUrls := ParseUrls(Content);
    
                        for KRUrl in KRUrls do
                        begin
                          SetLength(KRUrlsCollection, Length(KRUrlsCollection) + 1);
                          KRUrlsCollection[Length(KRUrlsCollection) - 1].article := KRUrl.article;
                          KRUrlsCollection[Length(KRUrlsCollection) - 1].title := KRUrl.title;
                          KRUrlsCollection[Length(KRUrlsCollection) - 1].url := KRUrl.url;
                          KRUrlsCollection[Length(KRUrlsCollection) - 1].position := 0;
                        end;
    
                      except
                        on E: Exception do
                          OutputDebugString(PWideChar(E.Message));
                      end;
                    end;
                  end;
    
                except
                  mNoFindByKeyword.Lines.Add(this.keyword);
                end;
    
                for i := 0 to length(KRUrlsCollection) - 1 do
                  KRUrlsCollection[i].position := i + 1;
    
                if length(KRUrlsCollection) = 0 then
                  mNoFindByKeyword.Lines.Add(this.keyword);
    
                try
                  UrlsPush(this.project_id, KRUrlsCollection, this.keyword);
                except
                  on E: Exception do
                    OutputDebugString(PWideChar(E.Message));
                end;
    
              finally
                TThread.Synchronize(this,
                  procedure
                  begin
                    mNoFindByKeyword.Lines.Add(format('Thread end: %d', [this.ThreadID]));
                    ThreadCounter := ThreadCounter - 1;
                  end);
              end;
            end);
    
          Inc(ThreadCounter);
          Thread.keyword := KWEnum.Current;
          Thread.project_id := ProjectId;
          Thread.Resume;
    
          while ThreadCounter >= 1 do
          begin
            Caption := ThreadCounter.ToString;
            Application.ProcessMessages;
            Sleep(300);
          end;
        end;
    
        while ThreadCounter <> 0 do
        begin
          Application.ProcessMessages;
          Sleep(100);
        end;
    
      finally
        if Assigned(KWEnum) then
          FreeAndNil(KWEnum);
    
        Progress.Visible := false;
        Progress.Value := 0;
        lbStatustext.Text := '';
      end;
    end;
  • Delphi Thread try finally?

    IgorPI
    @IgorPI Автор вопроса
    Такое ощущение, что поток просто умирает, не выполнив секцию в finally