Здравствуйте, такая проблема что из 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;
Неверный дескриптор 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;
В реализации конструктора Create скорее всего не хватает inherited. Зачем юзать другой конструктор тоже еще вопрос ну да б-г с ним Вот этого не хватает: Code: constructor th.create(createsuspended:boolean); begin inherited; end; В любом случае поток вылетает при попытке resume скорее всего и глубоко ему пофик на stringlist. Код базового конструктора не выполняется. ИМХО в этом трабла.
Понятно что можно и 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;
Если стоит 1000 потоков и каждому нужен stringlist - нужно заранее поднять массив из 1000 stringlist'ов и выдавать их в пользование этим потокам. Типо "на тебе дорогой стринглист нумбер 500". Итого время на создание тратится только один раз. А ежели inherited стоит, выполняется оно или нет ? Может надо так ? Code: constructor th.crstr; begin Create(false); stringlist:=tstringlist.Create; end; ======================= Короче без полного кода ванговать приходится, но сам дельфиний код эту ошибку 6 берет из GetLastError, и если он это делает где-то в радиусе создания треда - то обычно это связано с попыткой вызова Resume, не очень удачной. А значит экземпляр класса th не создан, а значит где-то там надо и копать. Кстати зачем Free прямо в конструкторе - тоже загадка и тоже послужит причиной вылета с ошибкой или зависания (зависит от createsuspended).
Приветствую, знатоки подскажите пожалуйста, есть софт на делфи, многопоток, на одном дедике робит норм, ставлю на пк, с новой виндой, все в ерроры, ставлю на дедике где тоже ток поставил винду, тож все в еррор. В чем может быть проблема, что не хватает ?
софт работает с сетью? конкретно SSL (сайт с https) используется? если да, то не хватает библиотек (ssleay32.dll и libeay32.dll)
Здравствуйте я написал многопоточную программу которая добавляет в 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;
Я тебе еще 2 года назад сказал, что ты работаешь с потоками каким-то извращенским методом. Отсюда у тебя и разнообразные утечки памяти, глюки и т.д. Если хочешь, чтобы программа работала стабильно, делай рефакторинг костылей, это очень полезно. Я рефакторил пару своих проектов после нескольких лет и удивлялся с того, какие костыли я впихивал и как это вообще работало. По окончании, я наглядно увидел разницу в качестве и скорости работы. Как я понял, ты используешь это для отрисовки обновленных данных на форме, но это не правильно. Все манипуляции, связанные с потоками и обработкой, должны проводиться вне MainThread'a, тогда тебе не придется перерисовывать форму.
Работать-то может и работает... но есть немалый шанс что будут искажаться данные и все это дело будет вылетать в зависимости от фазы луны в козероге