Перейти к содержанию
  • Регистрация

Slym

Пользователи
  • Публикаций

    48
  • Зарегистрирован

  • Посещение

  • Победитель дней

    5

Сообщения, опубликованные Slym


  1. 8 часов назад, Tumaso сказал:

    Что, серьезно?)

    Также серьезно как и TObject(nil).Free; //no problem
    Это работает! Поверь и проверь.
    В любом вызове метода объекта передается первым параметром self, и достаточно сделать в самом начале if self=nil then exit; - и проблемы нет
    так делает TJSONValue.FindValue, так делает TObject.Free
    пример из генофонда:
     

    procedure TObject.Free;
    begin
    // under ARC, this method isn't actually called since the compiler translates
    // the call to be a mere nil assignment to the instance variable, which then calls _InstClear
    {$IFNDEF AUTOREFCOUNT}
      if Self <> nil then
        Destroy;
    {$ENDIF}
    end;

     


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


  3. function Proc(const Answerreqest:string):boolean;
    var
      JSON,AItem: TJSONValue;
      JRequest, JDistance: TJSONObject;
      JArray: TJSONArray;
      I: integer;
    begin
      JSON := TJSONObject.ParseJSONValue(Answerreqest);
      //if not Assigned(JSON) then exit(false); //<<< прикинь даже не обязательно проверять на nil :) JPath работает через FindValue - а он сам проверяет на nil
      try
        if JSON.TryGetValue<TJSONObject>('request',JRequest) then
          TabbedForm.memo3.Lines.Add('JRequest: ' + JRequest.ToString);

        if JSON.TryGetValue<TJSONObject>('distance',JDistance) then
        begin
          TabbedForm.memo3.Lines.Add('JDistance: ' + JDistance.ToString);
          TabbedForm.memo3.Lines.Add('price_1: ' + JDistance.GetValue<string>('price_1',''));
          if JDistance.TryGetValue<TJSONArray>('SomeArray',JArray) then
          begin
            TabbedForm.memo3.Lines.Add('count: ' + JArray.Count.ToString);
            for I := 0 to JArray.Count - 1 do
            begin
              AItem := JArray.Items;

              TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_id','') + ',' +
                                         AItem.GetValue<string>('obj_acc_id','') + ',' +
                                         AItem.GetValue<string>('obj_cat_id',''));
              TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_title',''));
              TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_descr',''));
              TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_address',''));
              TabbedForm.memo3.Lines.Add(AItem.GetValue<string>('obj_url',''));
            end;
          end;
        end;
      finally
        JSON.Free;
      end;
      result:=true;
    end;


  4. 5 часов назад, Александр2010 сказал:

          aJSArray := aJSObject.GetValue('distance') as TJSONArray;     // дальше хочу полчить хоть 1 элемент json но даже не ругается просто  request

    ни одного TJSONArray в ответе нет
    так же нет ничего из этого:

    TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_id').Value + ',' + aJSObjArr.GetValue('obj_acc_id').Value + ',' +
                    aJSObjArr.GetValue('obj_cat_id').Value);
                  TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_title').Value);
                  TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_descr').Value);
                  TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_address').Value);
                  TabbedForm.memo3.Lines.Add(aJSObjArr.GetValue('obj_url').Value);

    бросай те вы уже эти  as TJSONArray as TJSONObject - где проверки на существование? жесткого приведения требует только разве что TJSONArray, а остальное выше TJSONValue приводить не обязательно.
    используйте нотацию TJSONValue.GetValue<string>('obj_title','').- не найдено встанет значение по умолчанию... не нравится возьми TryGetValue
    даже jpath(указание пути названий узлов) работает JSONValue.GetValue<integer>('
    request.people_count,0)  - даже с массивами...
    касаемо массивов - можно указать тип искомой ноды SONValue.GetValue<TJSONArray>('
    request.distance',nil)


  5. Под андроид идет опция AUTOREFCOUNT - все объекты имеют счетчик ссылок...
    любое присваивание - это +/- ссылки, даже Free не честное:
    procedure TObject.Free;
    begin
    // under ARC, this method isn't actually called since the compiler translates
    // the call to be a mere nil assignment to the instance variable, which then calls _InstClear
    {$IFNDEF AUTOREFCOUNT}
      if Self <> nil then
        Destroy;
    {$ENDIF}
    end;
    т.е. Free ничего не делает!!!  - экземпляр остается в зомбирежиме (ты его убил а оно ходит) пока счетчик до 0 не до тикает.
    TObject(TreeItem);  - пытается найти методы подсчета ссылок (Это же объект!) и не находит т.к. это не объект вовсе.
    TTreeItem = record меняем на TTreeItem = class, честно создаем и не забываем убить, хотя под AUTOREFCOUNT - оно само должно помереть если циклической ссылочности нет.


  6. аяяй! Совсем разленились try юзать, все на RefCounting надеетесь...
    ну-ну... а под вендой мемлики плодятся :) (если файла нет -  Surf куда?)
    не-не... переделать! а то студенты накопипастят...
     

    procedure TBitmapAsyncLoader.LoadImageAsync(const AFilePath:string; Callback: TProc);
    begin
      TTask.Run(
        procedure
        var ABitmapSurface : TBitmapSurface;
        begin
          ABitmapSurface:=TBitmapSurface.Create;
          try
            if TBitmapCodecManager.LoadFromFile(AFilePath, ABitmapSurface, CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) and assigned(Callback) then
              TThread.Synchronize(nil, Callback);
          finally
            ABitmapSurface.Free;
          end;
        end);
    end;



     


  7. ну в общем воркеры имеются... например TTask и запускаются в пуле...
    и можно запускать много тасков и они из общего пула не вылезут и делать к примеру так:
    данный код не бест и может ломать пикчу, и поэтому вопрошаю кто как... пользую TBitmap а не Surface что тоже не оптимально, но обратно совместимо с vcl (в дефайн обернуть?)

    procedure LoadImageAsync(const Name:string; Callback: TProc<TBitmap>);
    begin
      TTask.Run(
        procedure
        var Bitmap:TBitmap;
        begin
          Bitmap:=TBitmap.Create;
          try
            Bitmap.LoadFromFile(ImagePath+Name);
            TThread.Synchronize(nil,
              procedure
              begin
                Callback(Bitmap);
              end);
          finally
            Bitmap.Free;
          end;
        end);
    end;
      
    procedure TmainForm.FormShow(Sender: TObject);
    begin
      LoadImageAsync('logo1.png',
        procedure(Bitmap:TBitmap)
        begin
          Image1.Bitmap.Assign(Bitmap);
          Image1.Invalidate;
        end);
      LoadImageAsync('logo2.png',
        procedure(Bitmap:TBitmap)
        begin
          Image2.Bitmap.Assign(Bitmap);
          Image2.Invalidate;
        end);
      LoadImageAsync('logo3.png',
        procedure(Bitmap:TBitmap)
        begin
          Image3.Bitmap.Assign(Bitmap);
          Image3.Invalidate;
        end);
    end;
    

     


  8. Доп вопрос в тему: Как вы с fs загружаете картинки?
    по тутору андрюши любой доступ к fs желательно поточить, а тут еще и декод... а декод можно параллелить на кучи ядер смартфона
    но все поголовно не заморачиваются и тупо LoadFromFile в главном потоке. как правильно? на косяки TBitmap в потоке тоже нарывался прозрачность портит/чернит
    1. допустим есть форма и TImage на ней, и в него надо положить logo.png
    2. тоже самое но 10-20 images (параллельный декод)
     


  9. У меня IPhone6 вдулся от постоянного висения на шнурке...
    Теперь правило вечером отключить... но нет! нет отладки - нет зарядки и садится в ноль!
    Теперь правило в понедельник всегда на зарядку...


  10. Не делайте слепое приведение типов...
     

    var JObj:TJSONObject;
    begin
      JObj:=TJSONObject(TJSONObject.ParseJSONValue('0'));
      try
        try
          if assigned(JObj) then
            JObj.AddPair('Access','violation');
        except
          ShowMessage('Surprise MF!: '+JObj.ClassName);
        end;
      finally
        JObj.Free;
      end;
    end;

    ParseJSONValue возвращает TJSONValue, и необходима или проверка типа или использование только в рамках TJSONValue чего в большинстве случаев вполне достаточно.


  11. procedure TForm2.Button1Click(Sender: TObject);
    var Iters:integer;
    begin
      Iters:=100000000;
      TThread.CreateAnonymousThread(
        procedure
        var
        i:integer;
        a:real;
        begin
         for i := 0 to Iters do
         begin
           a:=i/3;
           if i mod 1000000 = 0  then
           begin
             TThread.Queue(nil,
              procedure
              begin
                ProgressBar1.Value:=ProgressBar1.Value+1;
              end);
           end;
          end;
        end).Start;
    end;
    

    и не надо никаких доп классов...
    еще есть TTask... тоже полезно


  12. Procedure TServerConnectionTH.RecieveData();
    // сюда приходя данные со сканера
    //Data - это данные в виже TBytes
    //str - строка со считанным штрихкодом
    var
      Intent: JIntent;
      str:String;
    begin
      str:=TEncoding.UTF8.GetString(Data);
      Form1.DisplayR.Lines.Add(Str);
      Form1.DisplayR.GoToTextEnd;
      Intent := TJIntent.Create;
      Intent.setAction(StringToJString('com.google.android.c2dm.intent.RECEIVE'));
      Intent.putExtra(StringToJString('text'),StringToJString('1')); 
      Intent.putExtra(StringToJString('title'),StringToJString('1C')); 
      Intent.putExtra(StringToJString('data'),StringToJString(str)); 
      TAndroidHelper.Context.sendBroadcast(Intent);
    end;

     


  13. procedure TForm1.LoadImage(const AItem: TListViewItem; const AListItemImage : TListItemImage);
    Var AAsyncResult : IAsyncResult;
    begin
      if Not Assigned(AItem) or Not Assigned(AListItemImage) then
        exit;
      if AItem.Data['ImageState'].AsInteger <> ListViewItemImageEmpy then
        exit;
      if AItem.Data['ImageURL'].AsString.IsEmpty then
        exit;
      AItem.Data['ImageState']:=ListViewItemImageLoading;
    
      if not assigned(FHTTPClient) then exit;
    
      TMonitor.Enter(listview1);
      try
        AItem.TagObject:=
        FHTTPClient.BeginGet(
          procedure (const ASyncResult: IAsyncResult)
          Var AHTTPResponse : IHTTPResponse;
          begin
            if assigned(AItem.TagObject) then
            begin
              TMonitor.Enter(listview1);
              try
                AItem.TagObject:=nil;
              finally
                TMonitor.exit(listview1);
              end;
            end;
            if ASyncResult.IsCancelled then exit;
    
            AHTTPResponse:=THTTPClient.EndAsyncHTTP(ASyncResult);
            if AHTTPResponse.StatusCode <> 200 then
              exit;
            TThread.Queue(nil,
              procedure
              begin
                if Not Assigned(AItem) or Not Assigned(AListItemImage) then
                  exit;
                AListItemImage.BeginUpdate;
                AListItemImage.Bitmap:=TBitmap.Create;
                AListItemImage.Bitmap.LoadFromStream(AHTTPResponse.ContentStream);
                AListItemImage.EndUpdate;
                AItem.Data['ImageState']:=ListViewItemImageLoaded;
              end);
          end,
          AItem.Data['ImageURL'].AsString) as TBaseAsyncResult;
      finally
        TMonitor.Exit(listview1);
      end;
    end;
    
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var
      i:integer;
      IResult:IAsyncResult;
    begin
      TMonitor.Enter(listview1);
      try
        for i:=0 to listview1.Items.Count-1 do
          if assigned(listview1.Items[i].TagObject) then
            (listview1.Items[i].TagObject as TBaseAsyncResult).Cancel;
      finally
        TMonitor.Exit(listview1);
      end;
    
      TMonitor.Enter(listview1);
      try
        for i:=0 to listview1.Items.Count-1 do
          if assigned(listview1.Items[i].TagObject) then
          begin
            IResult:=TBaseAsyncResult(listview1.Items[i].TagObject) as IAsyncResult;
            TMonitor.Exit(listview1);
            try
              THTTPClient.EndAsyncHTTP(IResult);
            except
            end;
            TMonitor.Enter(listview1);
          end;
      finally
        TMonitor.Exit(listview1);
      end;
    end;

     


  14. В 01.02.2019 в 14:42, Евгений Корепов сказал:

    К сожалению логика асинхронности HTTPClient упускает одну важную вещь - идентификацию полученного результата

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


  15. умрет потому что используется TThread.CreateAnonymousThread, 500 потоков это не шутка...
    переделать на TTask. TTask плодит ограниченное кол-во потоков.
    или вовсе отказаться от собственных потоков и отдать на откуп асинхронному запросу THTTPClient
    1 экземпляр THTTPClient может одновременно обслуживать несколько асинхронных запросов (4-8)
    HTTPClient.BeginGet
     

×
×
  • Создать...