[ Delphi / Pascal ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by begin_end, 28 Apr 2015.

  1. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Здравствуйте, такая проблема что из Button1 не хочет обращаться к одной из процедур потока, вызывает ошибку "Эта форма вызвала метод всех разрешённых методов класса" а почему непонятно

    Code:
     type  th = class(TThread)
      private
      public
      procedure Strcr;
      procedure sync;
    protected
      constructor create(createsuspended:boolean);
      procedure Execute; Override;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    var
    threads:integer;
    begin
     th.Strcr; //[Error] Unit1.pas: This form of method call only allowed for class methods
    end;
    
    procedure th.Strcr;
    begin
    memo1.lines.add('Status:work');
    end;
    
    
     
  2. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,108
    Likes Received:
    8,496
    Reputations:
    25
    Экземпляр класса th создать подобало-бъ.

    my_class : th;
    my_class.Strcr;
     
  3. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Неверный дескриптор 6 почему ?
    Code:
    type  th = class(TThread)
      private
      public
      stringlist:tstringlist;
      procedure sync;
    protected
      constructor create(createsuspended:boolean);
      constructor crstr;
      procedure Execute;
      Override;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    th.crstr;
    end;
    
    constructor th.crstr;
    begin
    stringlist:=tstringlist.Create;
    end;
    
     
  4. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,108
    Likes Received:
    8,496
    Reputations:
    25
    В реализации конструктора Create скорее всего не хватает inherited.
    Зачем юзать другой конструктор тоже еще вопрос ну да б-г с ним :)
    Вот этого не хватает:

    Code:
    constructor th.create(createsuspended:boolean);
    begin
      inherited;
    end;
    В любом случае поток вылетает при попытке resume скорее всего и глубоко ему пофик на stringlist. Код базового конструктора не выполняется. ИМХО в этом трабла.
     
  5. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Понятно что можно и
    Code:
    constructor th.create(createsuspended:boolean);
    begin
    stringlist:=tstringlist.Create;
    end;
    
    Да только представь если 1000 потоков и каждый будет создавать stringlist ?
    А inherited
    стоит
    Code:
    constructor th.create(createsuspended:boolean);
    begin
    inherited Create(CreateSuspended);
      freeonterminate:=true;
      Free;
    end;
    
     
    #325 triblekill, 19 Sep 2018
    Last edited: 19 Sep 2018
  6. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,108
    Likes Received:
    8,496
    Reputations:
    25
    Если стоит 1000 потоков и каждому нужен stringlist - нужно заранее поднять массив из 1000 stringlist'ов и выдавать их в пользование этим потокам. Типо "на тебе дорогой стринглист нумбер 500". Итого время на создание тратится только один раз.
    А ежели inherited стоит, выполняется оно или нет ?

    Может надо так ?
    Code:
    constructor th.crstr;
    begin
      Create(false);
      stringlist:=tstringlist.Create;
    end;
    =======================
    Короче без полного кода ванговать приходится, но сам дельфиний код эту ошибку 6 берет из GetLastError, и если он это делает где-то в радиусе создания треда - то обычно это связано с попыткой вызова Resume, не очень удачной.
    А значит экземпляр класса th не создан, а значит где-то там надо и копать.

    Кстати зачем Free прямо в конструкторе - тоже загадка и тоже послужит причиной вылета с ошибкой или зависания (зависит от createsuspended).
     
    triblekill likes this.
  7. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    С Free это эксперимент был =)
     
    DartPhoenix likes this.
  8. Jopashnik

    Jopashnik New Member

    Joined:
    27 Oct 2010
    Messages:
    9
    Likes Received:
    4
    Reputations:
    0
    Приветствую, знатоки подскажите пожалуйста, есть софт на делфи, многопоток, на одном дедике робит норм, ставлю на пк, с новой виндой, все в ерроры, ставлю на дедике где тоже ток поставил винду, тож все в еррор. В чем может быть проблема, что не хватает ?
     
  9. spiner

    spiner Member

    Joined:
    8 Jul 2015
    Messages:
    74
    Likes Received:
    56
    Reputations:
    4
    софт работает с сетью? конкретно SSL (сайт с https) используется? если да, то не хватает библиотек (ssleay32.dll и libeay32.dll)
     
  10. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Скрины в студию, либо вопрос на битву экстрасенсов
     
  11. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Здравствуйте я написал многопоточную программу которая добавляет в memo1 полученные результаты
    url:tstrings;
    Memo1.Addstrings(url);
    Через некоторое время программа как будто перестаёт работать, а при сохранении out of memory и результаты не сохраняются ( сделал пока так но не знаю насколько это правильно да и через некоторое время программа просто вылетает
    Code:
    const
    IMAGE_FILE_LARGE_ADDRESS_AWARE = $0020;
    implementation
    
    {$R *.dfm}
    {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
    
    procedure th.sync;
    var
    url:tstrings;
    begin
    
    case rez of
    
    1:begin
    memo1.addstrings(url)
    //Good
    end;
    
    2:begin
    
    //Bad
    end;
    end;
    Application.ProcessMessages;
    Waitmessage;
    end;
    
     
  12. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    Я тебе еще 2 года назад сказал, что ты работаешь с потоками каким-то извращенским методом. Отсюда у тебя и разнообразные утечки памяти, глюки и т.д. Если хочешь, чтобы программа работала стабильно, делай рефакторинг костылей, это очень полезно. Я рефакторил пару своих проектов после нескольких лет и удивлялся с того, какие костыли я впихивал и как это вообще работало. По окончании, я наглядно увидел разницу в качестве и скорости работы.

    Как я понял, ты используешь это для отрисовки обновленных данных на форме, но это не правильно. Все манипуляции, связанные с потоками и обработкой, должны проводиться вне MainThread'a, тогда тебе не придется перерисовывать форму.
     
  13. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Мдаа ну ты и нагородил конечно, я использовал smemo1 (alphaskins) вместо memo1 и всё работает
     
    #333 triblekill, 24 Jul 2019
    Last edited: 24 Jul 2019
  14. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,108
    Likes Received:
    8,496
    Reputations:
    25
    Работать-то может и работает... но есть немалый шанс что будут искажаться данные и все это дело будет вылетать в зависимости от фазы луны в козероге :)
     
  15. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Вроде не искажаются проверял работает как швейцарские часы !
     
  16. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    И что же конкретно я нагородил?
     
  17. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Не знаю тебя нужно спросить что к чему ты написал