powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
25 сообщений из 135, страница 3 из 6
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39892736
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Василий 2
3. Если хочется проверить, завершился ли поток, то есть например
.Finished, который поток выставляет сам.

Кстати да, спасибо.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39892757
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Ты в потроха TObject.Free загляни и узнаешь великую тайну - чем он отличается от .Destroy :)

Ну, таки-да:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
      procedure TObject.Free;
        begin
           // the call via self avoids a warning
           if self<>nil then
             self.destroy;
        end;
              


Тем не менее, без проверки на существование объекта ТС получает AV :)
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39892822
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

AV он получает по совсем другому поводу :)
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39892830
Kast2K#22022404
Kast2K
Андрей Игоревич,

может так проще будет:

автор
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
var
  Form1: TForm1;
  MyThread:Thread;
implementation

{$R *.xfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyThread:=Thread.Create(True);
  MyThread.FreeOnTerminate:=True;
  MyThread.OnTerminate:=MyThreadStop;
  MyThread.Resume;
end;

procedure TForm1.MyThreadStop(Sender: TObject);
begin
  MyThread:=nil;
end;



А внутреннюю очистку как-то самостоятельно...

Выглядит понятно и приятно, попробую так использовать. Очистка это понятно, тут без вопросов.

alekcvp
Василий 2
3. Если хочется проверить, завершился ли поток, то есть например
.Finished, который поток выставляет сам.

Надо изучить и попробовать.


Ну а всё-таки, глобальный то вопрос в чем - есть куча потоков, которые заканчиваются в разное неизвестное время (открываются и обрабатываются результаты разных расчётов), как по окончании всех потоков вызвать только одно событие, желательно не организую новый поток и не останавливая вызывающий (так я могу).
Ну или в радикальном случае, как гарантировать последовательное выполнение кода события (чтоб при окончании одного потока его событие не влезло в середину предыдущего, попробовал через критическую секцию - но не получилось, но, вероятно, что-то я сделал не так, может как-нибудь иначе можно?)

Ну и вопрос просто о правильности кода (ибо есть сомнения). Я сделал так, что в конце потока я генерирую событие в основной форме,вызов события делаю через Sinhronize:

Примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
.....
//в конце кода потока
Synchronize(DoCurentResultLoad)
....

procedure TOpenResultFiles.DoCurentResultLoad;
begin
 if Assigned(FCurentResultLoad) then FCurentResultLoad(Self);
      //КОД ДЛЯ СОБЫТИЯ
       {var
        LocOpenResultFiles:TOpenResultFiles;
      begin
        if not (Sender is TOpenResultFiles) then Exit;
        LocOpenResultFiles:= Sender as TOpenResultFiles;
        SetLength(Result.Calculation,Length(Result.Calculation)+1);
        Result.Calculation[Length(Result.Calculation)-1]:=LocOpenResultFiles.InTreadResult;
      end;     }
end;




Событием сделал потому, что стараюсь все модули сделать максимально независимыми (желательно полностью) и подключаемыми через библиотеки делфи, так у меня мозг не закипает всех взаимных связей в программе, ну и я могу тестировать модули в отдельных программах.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39892880
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
есть куча потоков, которые заканчиваются в разное неизвестное время (открываются и обрабатываются результаты разных расчётов), как по окончании всех потоков вызвать только одно событие,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var
  Counter: Integer;

constructor TMyThread.Create;
begin
  inherited Create;
  AtomicIncrement(Counter);
end;

destructor TMyThread.Destroy;
begin
  inherited Destroy;
  if AtomicDecrement(Counter) = 0 then
    DoFinished;
end;
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39892881
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно из потока при завершении дергать основной модуль и ему пихать результаты.
Или можно из основного модуля ждать, пока поток закончит, считывать результаты из поля объекта и удалять его.
Если отправка результатов происходит только единожды за время жизни потока - на мой взгляд, лучше второй вариант.
+ не нужен Synchronize
+ главный модуль все равно следит за состоянием потоков, ему не проблема при завершении забрать данные
+ нет передачи управления, или как там оно правильно называется - не знаток терминологии паттернов и прочих абстракций.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39893081
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
+ не нужен Synchronize

К слову, на лазарусовском форуме тамошние олдфаги настоятельно рекомендуют использовать именно встроенные механизмы общения доп.потока с основным в противовес sendmessages/postmessages. Особенно с учётом кроссплатформенности. И после некоторого своего опыта ия вынужден был согласиться с их доводами
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39893094
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
К слову, на лазарусовском форуме тамошние олдфаги настоятельно рекомендуют использовать именно встроенные механизмы общения доп.потока с основным в противовес sendmessages/postmessages. Особенно с учётом кроссплатформенности. И после некоторого своего опыта ия вынужден был согласиться с их доводами

Олдфаги такие... олдфаги. Они ж сделали мультиплатформенную очередь сообщений, почему бы его не применять. Да и банальный ThreadQueue никто не отменял

На Praxis, кстати, тамошние олдфаги имеют прямо противоположное мнение насчет синхронайза
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39893096
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Особенно с учётом кроссплатформенности
Ну дык какие sendmessages/postmessages на кроссплатформе? Там вообще про модуль Windows нужно забыть
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39893140
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
kealon(Ruslan)
пропущено...
Но таких ситуаций ничтожно мало.
У меня бывали пару раз :)

kealon(Ruslan)
Кроме того, при выходе из программы стопорнуть поток как правило всё равно надо, и тут начинаются проблемы.
Насколько я помню, дельфя такие потоки в массив складывает и при закрытии сама удаляет. Впрочем, проблемы все равно возможны.
Если надо все же вручную закрывать - значит FreeOnTerminate не подходит.

Да, там есть такая фигня, но вот незадача, если есть куча используемых в этом потоке юнитов и они финализируются, могут начаться "чудеса". Особенно это актуально при сопровождении такого кода, когда идёт кусочная добавка и вполне работающий код может превратиться в тыкву.
У меня тоже бывало, что иначе ещё хуже выходит, но если при баге вижу что это вбито просто так, я лучше перепишу от греха подальше.

Делал как-то трюк с record + interface для финализации что бы не использовать напрямую такое недоразумение как TThread. Вполне живо было, но выходило слишком громоздко.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39893147
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич, _Vasilisk_,

еще лучше разобраться с WaitForMultipleObjects:
https://stackoverflow.com/questions/6867105/waiting-for-multiples-threads-using-waitformultipleobjects
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39893158
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon
еще лучше разобраться с WaitForMultipleObjects:
А, что там разбираться? И главное зачем? Завесить программу, пока остальные потоки работают? Я думаю, что это не то, чего хотел TC. Можно прикрутить MsgWaitForMultipleObjects и реализовать локальный оконный цикл, но опять таки зачем?

Дальше, там ограничение в 64 хэндла, а ТС хочет потоки запускать и останавливать. Ну и никакого FreeOnTerminate (или предварительный вызов DuplicateHandle())

В общем для этой задачи атомарный инкремент/декремент гораздо правильное решение
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39893234
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Там вообще про модуль Windows нужно забыть

Не совсем так. Методы описаны в LCLInfl и LCLType, формально работают на кроссплатформе, но... я уже писал про это выше ;)
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39894583
Всё указанные способы попробовал, всё работает, огромное спасибо.

Теперь следующий вопрос в познании программирования :). А надо ли очищать память при выходе из программы, у меня в главном потоке в процессе работы создается (и используется) огромное число разнообразных классов - нужно ли их высвобождать при закрытии, или система всё зачистит и так?

Вопрос совсем не в тему, но мелоковат на отдельную тему.
Есть программы, которые периодически скидывают данные в текстовые файлы, есть одна программа, которая периодически эти данные считывает.
Записываются файлы классическим WriteLn, считываются TSringList.LoadFromFile();
Но! Иногда при считывании вылетала ошибка о том, что файл открыт на запись (что логично), на данный момент обыграл функцией проверяющей доступность файла, вроде не вылетает ошибка, но может просто везет.
функция проверки доступности FileIsUse
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function FileIsUse(fName: string): boolean;   //проверка файла на открытия не запись
  var
    HFileRes: HFILE;
  begin
    Result := false;
    if not FileExists(fName) then exit;
    HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    Result := (HFileRes = INVALID_HANDLE_VALUE);
    if not Result then CloseHandle(HFileRes);
  end;



В коде делают так
Код: pascal
1.
2.
     while FileIsUse (FilePath) do Sleep(10);
     ListFile.LoadFromFile(FilePath);


Но как-то сомнения, что так правильно.

Ну и обратный вопрос LoadFromFile() не блокирует файл для записи? (что гораздо страшнее, так записывающую программу ломать очень не хочется)
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39894614
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
нужно ли их высвобождать при закрытии
Нужно.
Андрей Игоревич
или система всё зачистит и так?
Система освободит занимаемую память и некоторые ресурсы, но деструкторы не вызовутся. Например, атомы глобальны и системой не освобождаются
Андрей Игоревич
Вопрос совсем не в тему,
Так создайте отдельный вопрос
Андрей Игоревич
Код: pascal
1.
 while FileIsUse (FilePath) do Sleep(10);

это полные бред
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39894675
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич

В коде делают так
Код: pascal
1.
2.
     while FileIsUse (FilePath) do Sleep(10);
     ListFile.LoadFromFile(FilePath);



можно сделать так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  if FileExist(FilePath)
  repeat
    try
     ListFile.LoadFromFile(FilePath);
    except // тут еще по-хорошему надо ловить именно ошибки совместного доступа, плюс счетчик, чтобы не зациклилось
      Sleep(10);
    end;
  until False;



LoadFromFile блокирует, если надо, чтобы не блокировал - TFileStream и FileMode
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39894699
Василий 2
Андрей Игоревич

В коде делают так
Код: pascal
1.
2.
     while FileIsUse (FilePath) do Sleep(10);
     ListFile.LoadFromFile(FilePath);



можно сделать так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  if FileExist(FilePath)
  repeat
    try
     ListFile.LoadFromFile(FilePath);
    except // тут еще по-хорошему надо ловить именно ошибки совместного доступа, плюс счетчик, чтобы не зациклилось
      Sleep(10);
    end;
  until False;



LoadFromFile блокирует, если надо, чтобы не блокировал - TFileStream и FileMode

Обработку исключений в принципе уже видел на всех форумах, но не слишком ли это? И нет никаких проблем при обработке исключений в потоке? TFileStream и FileMode подумаю, просто где-то на форумах видел утверждение, что LoadFromFile не блокирует, но утверждение уровне комментария на ответы.майл.ру :). Надо подумать...
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39894700
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичИ нет никаких проблем при обработке исключений в потоке?

Проблемы неизбежны если НЕ обрабатывать исключения в потоке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39894714
Dimitry Sibiryakov

Андрей ИгоревичИ нет никаких проблем при обработке исключений в потоке?

Проблемы неизбежны если НЕ обрабатывать исключения в потоке.

Сам код естественно заключен в try except, но именно как защита от ошибок, просто всегда понимал исключения именно как что-то к чему прибегают в "исключительных" случаях, а не как часть функционала процедуры.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39894726
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Сам код естественно заключен в try except, но именно как защита от ошибок, просто всегда понимал исключения именно как что-то к чему прибегают в "исключительных" случаях, а не как часть функционала процедуры.

1. Главное чтобы в блоке except не было ничего, что может хотя бы в теории вернуть необработанное исключение.
2. try ... finally / except не рекомендуется использовать в циклах, т.к. это не самый быстрый код (во всяком случае в x86), но вне их они не критичны. Есть даже такая команда Abort , которая вызывает "тихое" исключение (стандартный обработчик его не отображает), которая используется для быстрого выхода из процедур большого уровня вложенности.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39894778
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Андрей Игоревич

В коде делают так
Код: pascal
1.
2.
     while FileIsUse (FilePath) do Sleep(10);
     ListFile.LoadFromFile(FilePath);



можно сделать так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  if FileExist(FilePath)
  repeat
    try
     ListFile.LoadFromFile(FilePath);
    except // тут еще по-хорошему надо ловить именно ошибки совместного доступа, плюс счетчик, чтобы не зациклилось
      Sleep(10);
    end;
  until False;



LoadFromFile блокирует, если надо, чтобы не блокировал - TFileStream и FileMode

alekcvp
Андрей Игоревич
Сам код естественно заключен в try except, но именно как защита от ошибок, просто всегда понимал исключения именно как что-то к чему прибегают в "исключительных" случаях, а не как часть функционала процедуры.

1. Главное чтобы в блоке except не было ничего, что может хотя бы в теории вернуть необработанное исключение.
2. try ... finally / except не рекомендуется использовать в циклах, т.к. это не самый быстрый код (во всяком случае в x86), но вне их они не критичны. Есть даже такая команда Abort , которая вызывает "тихое" исключение (стандартный обработчик его не отображает), которая используется для быстрого выхода из процедур большого уровня вложенности.
меня всегда удивляет, где вы всё это находите
а ещё больше удивляет как компонуете в общем-то правильную инфу в странные выводы.

за глухой except по рукам бить надо, а при повторении ситуации возможно и интерфейсом об тейбл
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39894888
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
меня всегда удивляет, где вы всё это находите
а ещё больше удивляет как компонуете в общем-то правильную инфу в странные выводы.

А меня всегда удивляет, что люди начинают отвечать не попытавшись понять прочитанное. Я отвечал не на отрывок с кодом выше, а про обработку исключений в потоках. Где там про глухой except было?
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39894896
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
меня всегда удивляет, где вы всё это находите
а ещё больше удивляет как компонуете в общем-то правильную инфу в странные выводы.

за глухой except по рукам бить надо, а при повторении ситуации возможно и интерфейсом об тейбл

Вот только не надо ортодоксальности. Всё зависит от цели. Если цель - открыть файл, то совершенно без разницы, по какой там причине вспухло исключение. К тому же есть дополнение насчет ловли и счетчика.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895003
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

по вашему посту подчёркнуто "Главное" - Не Главное, эксепшены группируются в список, это вполне нормальная ситуация для анализа ошибки - тынц

Василий 2
kealon(Ruslan)
меня всегда удивляет, где вы всё это находите
а ещё больше удивляет как компонуете в общем-то правильную инфу в странные выводы.

за глухой except по рукам бить надо, а при повторении ситуации возможно и интерфейсом об тейбл

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

PS: если подцепить обработчик крашей вроде EurekaLog или Madshi, то сопровождение приложения заметно улучшится
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39895027
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
try ... finally/except не рекомендуется использовать в циклах, т.к. это не самый быстрый код (во всяком случае в x86)
ЕМНИП, тормоза будут только в случае исключительных ситуаций.
...
Рейтинг: 0 / 0
25 сообщений из 135, страница 3 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]