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

Ты это к тому что они не только ленивые но и криворукие? ;)
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39896490
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Они криворукие и потому ленивые осторожные
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39902422
Мозг кипит и плавиться из-за безграмотности.
Мне вот тут выше посоветовали вызывать финальную процедуру только тогда, когда счетчик потоков дойдет до нужного (и тут я косякнул и наловил проблем с тем, что счетчик мог понизиться сразу у всех потоков и все потоки бы вызвали процедуры, но это я победил, наверно).

Но суть текущего вопроса вот в чем, по окончании работы Потока я всегда вызываю событие в главном потоке, передаю считанные данные главному потоку. Если потоков много и они почти одновременно вызывают события, то при каком-то стечении обстоятельств (видимо когда накапливается слишком много ожидающих) - вылетает "конец памяти".
Хорошо тестируется в чистой программе, где вызвать 100 потоков и назначить событие Onterminate с какими-нибудь действиями.

Помимо этого для отлова ошибок я во все ключевые процедуры вначале вставил процедуру в которой отправляю сообщение в "ЛОГ" (вызывая тоже некоторое число процедур для ведения ЛистВиева и сохранения в файл)
Код: pascal
1.
 PostMessage (DebugForm.Handle,ERROR_DATA_MESSAGE,DWORD(PChar(Er_Message)),DWORD(PChar(Discription)));


И, судя по всему, в моменты каллапса с событиями эти сообщения этот каллапс ещё больше увеличивают и всё быстрее падаетс "Концом памяти".
Товарищи пряморукие - подскажите, как можно решить таки проблемы?.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39902427
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13.12.2019 11:40, Андрей Игоревич пишет:
>
> Мозг кипит и плавиться из-за безграмотности.

Курсы русского языка для взрослых
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39902474
Мимопроходящий

13.12.2019 11:40, Андрей Игоревич пишет:
>
> Мозг кипит и плавиться из-за безграмотности.

Курсы русского языка для взрослых

Как всегда спасибо за дельный и своевременный совет, вы как всегда крайне желанны в любой моей теме.
П.С. За ошибку стыдно, как раз отвлекли и писал максимально быстро сообщение, зря.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39902475
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич, вы сможете подготовить приложение (для тестов, с одной кнопкой), в котором бы воспроизводилась проблема и выложить исходники здесь?
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39902476
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13.12.2019 12:54, DmSer пишет:
> выложить исходники здесь?

гы-гы
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39902494
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

Если не хватает памяти, можно попробовать x64, ее сразу станет больше.
Либо не заниматься перевыделением памяти, выделять один раз и потом использовать, передавать только ссылки на нее.

P.S. PostMessage (DebugForm.Handle,ERROR_DATA_MESSAGE,DWORD(PChar(Er_Message)),DWORD(PChar(Discription))); - плохая идея, если Er_Message и Discription не статичны, возможен вариант, что сообщение ушло, память под строки освободилась, и только тут сообщение начинает обработку.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39902537
DmSer
Андрей Игоревич, вы сможете подготовить приложение (для тестов, с одной кнопкой), в котором бы воспроизводилась проблема и выложить исходники здесь?

Точно причину не пойму, сейчас в отдельном приложении, вроде, работает, но не хватает времени потестить почему работает, не работало же :), но суть проблемы, что в таком коде периодически вылетает "Конец памяти".

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
  for i:=1 to 1000 do
   begin
    MyTread:=TMYTread.Create(True);
    MYTread.FreeOnTerminate:=true;
    MyTread.OnMyEvent:=MyEvent;
    MyTread.Resume;
   end;
end;

procedure TForm1.MyTerminate(Sender: TObject);
Begin
Memo1.Lines.Add('END');

Unit2...

....
    property  OnMyEvent  :   TNotifyEvent read FMyEvent    write FMyEvent;
....

procedure TMYTread.Execute;
begin
  DoMyEvent;
end;

procedure TMYTread.DoMyEvent;
begin
 if Assigned(FMyEvent) then FMyEvent(Self);
end;

end;



А, стоп, яж в событии делаю так

Код: pascal
1.
2.
3.
4.
5.
var
  LocOpenResultFiles:TOpenResultFiles;
begin 
     if not (Sender is TOpenResultFiles) then Exit;
    LocOpenResultFiles:= Sender as TOpenResultFiles;



А LocOpenResultFiles у меня 300-500 метров.... Тогда может и в этом делало, а не событиях :)

Zelius
Андрей Игоревич,

Если не хватает памяти, можно попробовать x64, ее сразу станет больше.
Либо не заниматься перевыделением памяти, выделять один раз и потом использовать, передавать только ссылки на нее.

P.S. PostMessage (DebugForm.Handle,ERROR_DATA_MESSAGE,DWORD(PChar(Er_Message)),DWORD(PChar(Discription))); - плохая идея, если Er_Message и Discription не статичны, возможен вариант, что сообщение ушло, память под строки освободилась, и только тут сообщение начинает обработку.


64 использую уже повсеместно (хотя хз, вылетает ли там это сообщение, я там только финально компилирую). А вот про сообщение большое спасибо, то-то у меня периодически какая-то ересь приходило. Как более корректно передавать такие данные?
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39902561
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Как более корректно передавать такие данные?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
p: PString;
New(p);
p^:=s;
PostMessage(...p)

...
p := PString(Msg.lParam);
...
Dispose(p)
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39902640
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Мне вот тут выше посоветовали вызывать финальную процедуру только тогда, когда счетчик потоков дойдет до нужного (и тут я косякнул и наловил проблем с тем, что счетчик мог понизиться сразу у всех потоков и все потоки бы вызвали процедуры, но это я победил, наверно)
Вы же вот так 22022741 делали? Правда?
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39902829
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2
Андрей Игоревич
Как более корректно передавать такие данные?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
p: PString;
New(p);
p^:=s;
PostMessage(...p)

...
p := PString(Msg.lParam);
...
Dispose(p)


можно так, а если главный поток ничем не занят, то можно не заморачиваться и сделать SendMessage
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39902954
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
можно не заморачиваться и сделать SendMessage

а еще можно вызвать потокобезопасные Synchronize/Queue. Немного не изящно, но надежно :)
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39906018
Наконец, появилась миллисекунда свободного времени.
Zelius

можно так, а если главный поток ничем не занят, то можно не заморачиваться и сделать SendMessage

Очень часто бывает так, что прям ну очень занят, потому не хотелось бы.
Кстати, а можно ли как-то форму целиком запихнуть в отдельный поток, или это слишком сложно, и ну его нафиг?

Василий 2
Андрей Игоревич
Как более корректно передавать такие данные?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
p: PString;
New(p);
p^:=s;
PostMessage(...p)

...
p := PString(Msg.lParam);
...
Dispose(p)



Пока не очень дружил с указателями. Правильно же?
такая передача сообщений корректна, real - как пример передачи других данных
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
procedure TForm1.SendMessage;
var
  TestStr  :string;
  TestReal :Real;
  pStr:   ^string;
  pReal:  ^Real;
begin
  TestStr:=  'Message';
  TestReal:=12345.6789;
  New(pStr);  
  New(pReal);
  pStr^:=TestStr;   pReal^:=TestReal;
  PostMessage (Form1.Handle,MY_MESSAGE1,Integer(pStr),Integer(pReal));
end;

procedure TForm1.INMessage (var msg: TMessage);
var
 psrt:^string;
 pRl:^real;
begin
 New(psrt);
 psrt:=Pointer(msg.WParam);
 pRl:=Pointer(msg.LParam);
 memo3.Lines.Add((psrt^)+' '+floattostr(pRl^));
 Dispose(psrt); Dispose(pRl);
end;


Но возникает вопрос два вопроса, первый может ли очередь формируемая PostMessage переполниться (например принимающий поток сильно занят) и к чему это приведет? Если сообщение "не доходит" по тем или иным причинам - не будет ли утечки памяти, так как код "Dispose" у нас только в принимающем обработчике.

_Vasilisk_
Андрей Игоревич
Мне вот тут выше посоветовали вызывать финальную процедуру только тогда, когда счетчик потоков дойдет до нужного (и тут я косякнул и наловил проблем с тем, что счетчик мог понизиться сразу у всех потоков и все потоки бы вызвали процедуры, но это я победил, наверно)
Вы же вот так 22022741 делали? Правда?

Не совсем так, у меня код чуть помудренее, ну я там накосячил и уже сам поправил, но теперь вообще всё хочу фундаментально переделать :). (Хочу отдельный поток, который будет запускать другие потоки по очереди и по завершении последнего уже вызывать событие, просто иначе слишком сложные пересечения сообщений и событий в коде между потоками, я просто тону в них)
Док
Zelius
можно не заморачиваться и сделать SendMessage

а еще можно вызвать потокобезопасные Synchronize/Queue. Немного не изящно, но надежно :)

Синхронайз же будет зависеть от "свободности" главного потока - не хотелось бы, Queue - по не знаю что это пока. (Пока, если честно, как раз через синхронайз и message и передаю данные между потоками, но хочу переделать).
Думаю начать освоение применения критической секции, но как я понимаю, для передачи сообщений она не подходит :).
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39906022
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Кстати, а можно ли как-то форму целиком запихнуть в отдельный поток, или это слишком сложно, и ну его нафиг?

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

переполниться может. из MSDN про PostMessage:
авторIf the function fails, the return value is zero. To get extended error information, call GetLastError. GetLastError returns ERROR_NOT_ENOUGH_QUOTA when the limit is hit.
так что надо результат отправки обрабатывать. по умолчанию лимит 10 000.

кроме Synchronize есть еще TThread.Queue
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39906198
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
GUI всегда в основном потоке и только в нём.
Не всегда. Но это достаточно геморройно
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39906258
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич

Пока не очень дружил с указателями. Правильно же?

...

Но возникает вопрос два вопроса, первый может ли очередь формируемая PostMessage переполниться (например принимающий поток сильно занят) и к чему это приведет? Если сообщение "не доходит" по тем или иным причинам - не будет ли утечки памяти, так как код "Dispose" у нас только в принимающем обработчике.

Правильно, только лучше не называть переменные по имени типа (PReal), типы-указатели уже объявлены (^string => PString), и приводить в PostMessage лучше не Integer(), а W/LPARAM().
Вопросы хорошие, очередь конечно может переполниться, т.ч. надо всегда делать
Код: pascal
1.
2.
if not PostMessage then
  Dispose(p)
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39906407
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Синхронайз же будет зависеть от "свободности" главного потока - не хотелось бы, Queue - по не знаю что это пока. (Пока, если честно, как раз через синхронайз и message и передаю данные между потоками, но хочу переделать).

чтобы не заморачиваться: Synchronize - потокобезопасный "SendMessage"; Queue - потокобезопасный "PostMessage". И тот, и другой методы позволяют вызывать процедуру доп.потока, где идет работа с основным потоком. Как-то так:



В аттаче говнокод, просто для иллюстрации.

зы. проект собран на DXE (в семерке Queue еще нет, пусть картинка не вводит в заблуждение :) )
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39906558
Док,

Нужная штука, но, блин, плохо что в 7 нет. Уж больно мне интерфейс 7ки нравиться (точнее 10ки не нравиться, а перебирать разные версии в поисках хорошей как-то не хочется).

А такой вопрос, в каком потоке будет выполнена процедура CallProcedure

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
   Thread1:TThread1; 
   Thread2:TThread2; 

//вызываемая процедура
Procedure TTread1.CallProcedure;
Begin
//какой-нибудь код
End; 

Procedure TThread2.Execute;
Begin
Thread1.CallProcedure; //в каком потоке будет выполнен код внутри процедуры?
end;



И как правильно передавать сообщение уже между отдельными потоками, а не между главным и второстепенными? Просто на форуме видел фразу "вызвать процедуру соответствующего потока, она точна в нужном потоке будет выполнена?
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39906562
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Код: pascal
1.
2.
3.
4.
Procedure TThread2.Execute;
Begin
Thread1.CallProcedure; //в каком потоке будет выполнен код внутри процедуры?
end;

Thread2
Андрей Игоревич
И как правильно передавать сообщение уже между отдельными потоками
Зависит от того, какие именно сообщения. Первое, что приходит в голову - PostThreadMessage(). Но поток должен ждать сообщения. Само по себе работать не будет
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39906864
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Док,

Нужная штука, но, блин, плохо что в 7 нет. Уж больно мне интерфейс 7ки нравиться (точнее 10ки не нравиться, а перебирать разные версии в поисках хорошей как-то не хочется).

ИМХО, зря, лучше перейти на новое и привыкнуть. в новых дельфах очень много полезного. один юникод чего стоит с TEncoding... Delphi 7 только для легаси, только то что трогать боязно...

Второе, что приходить в голову, это использовать дельфевые очереди, тогда с виндовой не надо заморачиваться. Поставил в TThreadedQueue сообщение, а поток сам его заберет когда освободится.
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39906959
Zelius
Андрей Игоревич
Док,

Нужная штука, но, блин, плохо что в 7 нет. Уж больно мне интерфейс 7ки нравиться (точнее 10ки не нравиться, а перебирать разные версии в поисках хорошей как-то не хочется).

ИМХО, зря, лучше перейти на новое и привыкнуть. в новых дельфах очень много полезного. один юникод чего стоит с TEncoding... Delphi 7 только для легаси, только то что трогать боязно...

Второе, что приходить в голову, это использовать дельфевые очереди, тогда с виндовой не надо заморачиваться. Поставил в TThreadedQueue сообщение, а поток сам его заберет когда освободится.

Видимо придется, так как в 7ке вот такой код (код чисто тестовый, искал ошибку и тут нашел)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
//это крутиться не в главном потоке, но, наверняка, главный поток не успевал обработать все сообщения
While 0=1 do 
 begin
   Tread:=TThread.Create(false);
   sleep (10);
 end;

...
TThread.Create (..)
Var
 p:Pointer;
Begin
  New(p);
  if not PostMessage(.,.,.,.,.) then Dispose(p);
end;

Почти сразу вылетает с ошибкой конца памяти (при том, что в дипетчере программа занимает жалкие мегабайты (даже с учётом некорректности диспетчера - всё равно мало));

В 10ке (ну или всё дело в 64х) такой код крутиться вечно...

Ну значит скоро будет от меня темы: "а как в 10ке сделать всё красиво?" "а почему в х64 компилятор нельзя остановить на строке" и т.п. :)
Мне бы хотя бы автоматическое дописывание переменных, их выделение в коде всех сразу и исправление их по Enter согласно написанbю в var, уж больно я к этому привык, жуть как помогает, в мечтах я бы вообще хотел делать код разноцветным, мол "критический код", "проверенный", "доработать", "временный" и прочее подобное, комментарии это конечно круто, но цвета - круче, никто такого не делал под 10ку?
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39906993
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

тут ничего не понятно (while 0 = 1), много потоков?

на конец памяти влияет подход s := s + 'abc'... в больших циклах
...
Рейтинг: 0 / 0
Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
    #39907009
Zelius
Андрей Игоревич,

тут ничего не понятно (while 0 = 1), много потоков?

Та я это от балды написал, чтоб показать, что цикл бесконечный. По идее, даже с таким циклом всё равно код
Код: pascal
1.
2.
New(p);
  if not PostMessage(.,.,.,.,.) then Dispose(p);


Должен корректно, хоть и бесконечно работать. (в приемке сообщений Dispose(p) естественно есть).
а, тупанул, забыл про FreeAndNil написать,
В упрощенном формате:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
While 0=1 do 
 begin
   Tread:=TThread.Create(false);
   Tread.WaitFor;
   FreeAndNil(Tread);
   sleep (10);
 end;



ну по сути код а реальности вот так он выглядит в реальности
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  for i:=0 to InListResultLoad.Count-1 do
    begin
              OpenResultFilesInTread:=TOpenResultFiles.Create(InListResultLoad[i],Integer(InListResultLoad.Objects[i]), False);    //поток считывания результатов
              OpenResultFilesInTread.OnCurentResultLoad:=   CoreShell.OnOpenCurrentFile;    //события выгрузки результатов
              OpenResultFilesInTread.OnSelectedResultLoad:= CoreShell.OnOpenSelectedFile;   //события выгрузки результатов
              OpenResultFilesInTread.Resume;
              OpenResultFilesInTread.WaitFor;    //ждем выполненения
              FreeAndNil(OpenResultFilesInTread);  //убиваем законченный
              sleep(10); ждем всякого на всякий
    end;




Как уже написал, в 7ке вылетает с нехваткой памяти, в 10ке и после многих сотен тысяч операций - работало.
...
Рейтинг: 0 / 0
25 сообщений из 135, страница 5 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Много малых вопросов о работе с памятью при работе с динамическими массивами и классами.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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