|
|
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
Добрый день. У меня есть приложение на Delphi, в котором создается поток BEGIN Hndl:=CreateThread(nil,0,@DispThreadFunc,nil,0,ThID); if Hndl=0 then showmessage('No thread'); END В функции DispThreadFunc происходят различные действия, обращения к БД и пр.. Приложение рассчитано на то, чтобы быть запущенным по несколько суток и отрабатывать все действия в потоке. Однако оно валится с ошибкой Out of memory. No thread. при достижении в диспетчере задач в поле memory определенного значения(уходит на это часов 5-6, может и меньше), - обычно порядка 160 с лишним мб. Поле memory копится при этом и при достижении значения все валится.... Подскажите пожалуйста куда копать в данном случае, memory так и должен увеличиваться в диспетчере? Это нормально? Я проверял все действия в функции, - везде память высвобождается, к примеру при обращении к БД и пр. Есть ли способ с помощью потоков высвобождать память из потока либо другой способ реализации данной задачи? RAM при этом не перегружен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 13:44:57 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
Rustam88, Код: pascal 1. А еще лучше, последовать совету Рихтера и никогда не вызывать самому CreateThread; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 13:49:26 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Добавил вот таким образом IsMultiThread := True; Hndl:=CreateThread(nil,0,@DispThreadFunc,nil,0,ThID); if Hndl=0 then showmessage('No thread'); Память в диспетчере растет также ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 14:14:51 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, наверное подожду понаблюдаю выпадет ошибка или нет, растет она но уже вроде не так стремительно.... А какой альтернативный вариант можно использовать для этих целей вместо этой потоковой api функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 14:16:37 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Код: pascal 1. Эта переменная и так включается автоматом, смысла её выставлять нет. Rustam88А какой альтернативный вариант можно использовать для этих целей вместо этой потоковой api функции? Уже есть обертка над потоком: TThread. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 14:23:42 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
Данное решение прекрасно работало на windows xp, windows 7, там конечно возникали иногда такие же ошибки, но очень редко, а тут windows server 2012 64 разрядная. Хотя компилирую я на 32-х разрядной предварительно, может из-за этого... Попробую скомпилить на 64 разрядной и поищу альтернативное решение для реализации потока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 14:46:55 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
Rustam88, Что приходит на ум 1)Выделение памяти большими кусками. Сталкивался с кодом - выделение\освобождение памяти блоками по ~100 мегов. Симптомы те же - падение через несколько часов работы с Out of memory. Происходила фрагментация памяти, свободной дофига, но непрерывным блоком в 100 мег выделить невозможно. 2)Для потока задан размер стека по умолчанию, ЕМНИМ это 1 мегабайт. Возможно на каком-то этапе стек переполняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 15:15:17 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
wadmanЭта переменная и так включается автоматом, смысла её выставлять нет.Угу. В функции BeginThread. А автор решил сразу дернуть CreateThread Rustam88А какой альтернативный вариант можно использовать для этих целей вместо этой потоковой api функции?Хотите извращений - вызывайте BeginThread. Хотите по человечески - работайте с TThread ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 15:26:06 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
wadman_Vasilisk_ Код: pascal 1. Эта переменная и так включается автоматом, смысла её выставлять нет. Она выставляется автоматом только при вызове BeginThread, которая в свою очередь вызывается в конструкторе TThread. Когда я писал Dll, в которой функция вызывалась в разных потоках, то ловил странные ошибки, пока вручную не выставил ее в True, т.к. в Dll не было использования TThread. Подробнее тут to Rustam88 Зачем вы используете грабли, если есть класс обертка TThread надо нитями? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 15:29:02 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Угу. В функции BeginThread. Некоторые вещи со временем начинают восприниматься как само собой разумеющееся. Потоки практически всегда использую, хоть для чтения/записи файлов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 15:40:29 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
Rustam88, К потокам, способу их порождения, IsMultiThread и т.п. утечки памяти не имеют ни малейшего отношения. Ищи, где ты память выделенную тобой не освобождаешь - это единственный выход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 19:05:59 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
Rustam88Я проверял все действия в функции, - везде память высвобождается Значит твоя проблема неразрешима, можно увольняться. Rustam88Есть ли способ с помощью потоков высвобождать память из потока Это набор букв. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 19:07:55 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
YuRockIsMultiThread и т.п. утечки памяти не имеют ни малейшего отношениВообще говоря имеет. Представь как будет работать менеджер памяти на многопотоке, который заточен на однопоточную работу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 19:29:30 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_YuRockIsMultiThread и т.п. утечки памяти не имеют ни малейшего отношениВообще говоря имеет. Представь как будет работать менеджер памяти на многопотоке, который заточен на однопоточную работу Как-как. Недолго) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 19:30:18 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 19:36:47 |
|
||
|
CreateThread и out of memory в delphi 7
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_X-CiteПодробнее тут Тут еще более печально. Три года ошибку искал Это ответ на вопрос, зачем IsMultiThread включать вручную, если она включается автоматом. В dll её ручное включение вообще строго обязательно, я бы сказал, т.к. заранее часто неизвестно, откуда и когда будут вызываться её функции в будущем. За исключением, конечно, случаев, когда менеджер памяти (на который влияет IsMultiThread) не используется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2017, 20:01:53 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39541153&tid=2041685]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
423ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 727ms |

| 0 / 0 |
