Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];

Вниз

api-потоки, создание-разрушение   Найти похожие ветки 

 
Незнайка Винидиктович   (2009-03-30 10:22) [40]

т.е. в cli_sock нето значение получаеться


 
Сергей М. ©   (2009-03-30 10:34) [41]


> procedure cli_thread(param: pointer); stdcall;


function cli_thread(hClientSocket: TSocket): Integer; //никаких stdcall !!
var
 cli_sock: TSocket;
begin
 cli_sock := hClientSocket;
..
end;


 
Вариант   (2009-03-30 10:37) [42]


> Незнайка Винидиктович   (30.03.09 10:21) [39]
>      accepted_sock:=Accept(srv_sock,@Addr,@addr_size);
>      BeginThread(nil, 0, @cli_thread, pointer(accepted_sock),
>  0, h);
>
> а в потоке так:
>
> procedure cli_thread(param: pointer); stdcall;
> var
>        cli_sock: integer;
>        ......
> begin
>        cli_sock:=integer(param);
>        ......
>
>
> так вот работало с CreateThread. с бегинтред нихочет, даже
> делал по ману через указатель и передачу адреса, всеравно
> нето (


function cli_thread(param: pointer):Integer;   - A stdcall надо убрать;

Смотрим хелп по BeginThread
type TThreadFunc = function(Parameter: Pointer): Integer;


 
Незнайка Винидиктович   (2009-03-30 17:08) [43]

Люди! Списибо с параметрами теперь все ок!
Теперь надо найти из-за чего увеличиваеться(и потом не возвращается обратно) размер приложения в памяти.

Зделал просто ради экспиремента:

function func(param: pointer): integer;
var
       n: integer;
begin
       n:=integer(param);

       EndThread(0);
end;

.......

for t:=0 to 1000 do BeginThread(nil, 0, @func, pointer(t), 0, h);


Потоки рождаються и умирают нормально. Но вот примерно через 12K отработавших потоков размер памяти увеличиваеться на 4КБ, нормально это или нет(тупо незнаю из-за малого опыта программирования)???

А вот немного переделал, тоже ради экспиримента:

function func(param: pointer): integer;
var
       n: integer;
       buf: string;
begin
       n:=integer(param);

       buf:=IntToStr(n);

       EndThread(0);
end;

..........

for t:=0 to 1000 do BeginThread(nil, 0, @func, pointer(t), 0, h);

Так вот теперь через каждые отработавших потока, размер увеличиваеться на 16КБ, что это значит?

Извините, если это откровенная глупость...


 
DVM ©   (2009-03-30 17:36) [44]


> Теперь надо найти из-за чего увеличиваеться(и потом не возвращается
> обратно) размер приложения в памяти.

Ты хендлы закрываешь?

BeginThread возвращает хэндл, какова его дальнейшая судьба у тебя?


 
Сергей М. ©   (2009-03-30 17:45) [45]


> Незнайка Винидиктович   (30.03.09 17:08) [43]


Утечка происходит как минимум из-за незакрытия тобой хэндлов создаваемых потоков.


> buf:=IntToStr(n);
>


Вот как раз эти граблища рано или поздно больно хлобыстнули бы тебя, если бы IsMultiThread был равен False


 
Незнайка Винидиктович   (2009-03-30 18:36) [46]


> Утечка происходит как минимум из-за незакрытия тобой хэндлов
> создаваемых потоков.

Т.е. EndThread(0); в потоке не достаточно? Нужно обязательно закрывать хедл снаружи? изнутри никак чтоли?


 
Незнайка Винидиктович   (2009-03-30 18:48) [47]


> Т.е. EndThread(0); в потоке не достаточно? Нужно обязательно
> закрывать хедл снаружи? изнутри никак чтоли?

Даже если так то, почему такая разница между двумя примерами?


 
Сергей М. ©   (2009-03-30 20:53) [48]


> изнутри никак чтоли?


Чтоли


> почему такая разница между двумя примерами?


Утечка не здесь


 
DVM ©   (2009-03-30 22:41) [49]


> Т.е. EndThread(0); в потоке не достаточно? Нужно обязательно
> закрывать хедл снаружи? изнутри никак чтоли?

Поток он сам по себе, а его хендл сам по себе. Поток ты уничтожил, но хендл надо закрыть CloseHandle()


 
Незнайка Винидиктович   (2009-03-31 04:01) [50]


> > изнутри никак чтоли?Чтоли

Что из нутри никак это плохо (( Что за всеми потоками следить чтоли?


> > почему такая разница между двумя примерами?Утечка не здесь

Так а где если не здесь, все что есть в этих двух вариантах все тут...


 
Сергей М. ©   (2009-03-31 08:15) [51]


> Что за всеми потоками следить чтоли?
>


Не надо - не следи, никто не заставляет.
Получил хэндл, тут же закрыл его и забыл про него как страшный сон)


> через 12K отработавших потока


> через каждые 1К отработавших потока


Как ты узнал что они отработали ?
У тебя ж никакой синхронизации нет , "за ненадобностью" ..


 
Незнайка Винидиктович   (2009-04-01 07:54) [52]


> Не надо - не следи, никто не заставляет.Получил хэндл, тут
> же закрыл его и забыл про него как страшный сон)

Т.е. можно закрыть хедл и работать в потоке дальше, это не как не повлият на работу потока ?


> > через 12K отработавших потока
> > через каждые 1К отработавших
> потокаКак ты узнал что они отработали ?У тебя ж никакой
> синхронизации нет , "за ненадобностью" ..

Узнал смотря в диспетчер задач и в дебаггер в самой делфи, это не достоверно?


 
Незнайка Винидиктович   (2009-04-01 07:56) [53]


> > > почему такая разница между двумя примерами?Утечка не
> здесьТак а где если не здесь, все что есть в этих двух вариантах
> все тут...

Вопрос так и не нашёл ответа ? )


 
Незнайка Винидиктович   (2009-04-01 07:57) [54]

т.е. из предложенных двух примеров не видно где утечка ?


 
Сергей М. ©   (2009-04-01 09:31) [55]


> это не как не повлият на работу потока ?


Никак.


> из предложенных двух примеров не видно где утечка ?


В них при IsMultiThread=True утечки нет.


 
Незнайка Винидиктович   (2009-04-01 11:53) [56]


> > из предложенных двух примеров не видно где утечка ?В них
> при IsMultiThread=True утечки нет.

Ну так я там использую бегинТред, значит IsMultiThread=True, следовательно утечки не должнобыть по вашим словам, но тем не мение...


 
Сергей М. ©   (2009-04-01 12:54) [57]

Приводи полный код ..


 
Незнайка Винидиктович   (2009-04-01 15:42) [58]

так выше представленный код и есть полный... больше там ничего нету
это чисто экспиримент


 
Сергей М. ©   (2009-04-01 15:51) [59]


> так выше представленный код и есть полный


Так а какого же лешего ты не внял рекомендациям по закрытию хэндлов ?


 
Незнайка Винидиктович   (2009-04-01 16:41) [60]

Внял )) Но как ты говорил что утечка не из-за них ))


 
Незнайка Винидиктович   (2009-04-02 14:10) [61]

так у ThreadId тип cadinal а не обжект? а CloseHandle(тут обжект) ... ну так это не обязатльно ты же говорил что не из-за этого утечка ?


 
Незнайка Винидиктович   (2009-04-02 14:18) [62]

ООочень странная ситуация получаеться.
в примере(см.выше) делаем так:

function func(param: pointer): integer;
var
       n: integer;
       buf: string;
begin
       n:=integer(param);
       buf:=IntToStr(n);

       Func:=0;
       //EndThread(0);
end;


Т.е. убераем EndThread(0); и память не увеличивается  ))
вообще магия какая-то, вот тебе и течка памяти )


 
Незнайка Винидиктович   (2009-04-02 14:19) [63]

Хедл так и не понял как закрывать, и вообще зачем, это переменная, тем более она перезаписавается, что с неё будет ?


 
Сергей М. ©   (2009-04-02 14:30) [64]


> у ThreadId тип cadinal а не обжект? а CloseHandle(тут обжект)


Причем тут ThreadId ?
Это глобально уникальный идентификатор треда, а не его хэндл.

CloseHandle требует параметром хэндл треда, а не его идентификатор.


> убераем EndThread(0); и память не увеличивается  ))
> вообще магия какая-то


"Магия" тут очень простая - вызывав EndThread ты потребовал от системы немедленного и безусловного завершения работы текущего треда, в то время как фактическая финализация переменной buf (читай - освобождение памяти, распределенной под строковые данные при IntToStr) произойдет лишь при любом трех условиях:

1. Выполнение оператора Exit
2. Выполнение оператора End
3. Необработанная в теле поточной ф-ции исключительная ситуация.


 
Незнайка Винидиктович   (2009-04-04 12:25) [65]

Как я уже написал выше, что без exitthread или endthread память как оказалось утекает меньше намного(почти не утекает), а с exitthread или endthread утекает ваще жостко, наверно решение где-то здесь?

Полность утечку не удалось прекратить ((


 
DVM ©   (2009-04-04 14:26) [66]


> что без exitthread или endthread память как оказалось утекает
> меньше намного(почти не утекает), а с exitthread или endthread
> утекает ваще жостко, наверно решение где-то здесь?

Кто тебя вообще научил exitthread использовать. Поток должен умирать сам или по указке извне, но тоже сам. Т.е. поток должен периодически проверять флаг ПОРА ЗАКРУГЛЯТЬСЯ и если он ИСТИНА, то поток подчищаетвсе свои ресурсы и закругляется. Это единственный правильный способ. Все остальные способы будут приводить к утечкам.


 
мимо   (2009-04-04 22:46) [67]

Про Handle потока, оторый следует закрывать:
Handle есть описатель (читай указатель) на некую служебную информацию, которая система использует для управления потоком. Для каждого объекта (в данном случае потока) система ведет счетчик ссылок. Пока сей счетчик не равен 0 система не уничтожит (не освободит память) объект "поток" (структуру данных в памяти). Счетчик ссылок увеличивается при создании объекта (становится равным 1) и при вызове некоторых функций - таких как DuplicateHandle и уменшается при закрытии описателей. Соответственно, если не вызвать CloseHandle и не закрыть описатель потока - память не будет освобождена (от отбъекта "поток") до тех пор, пока не завершится все приложение (процесс). По сему, если этот описатель нигде больше не использется его следует сраз закрыть.

О завершении потоков:

Поток завершается вызовом функции ExitThread, TerminateThread либо выходом из функции потока (который приводит к вызову ExitThread с кодом завершения 0). Т.е. если явно не вызывать ExitThread то она будет вызвана после выполнения функции потока.

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


 
Сергей М. ©   (2009-04-04 22:57) [68]


> Хедл так и не понял как закрывать


closehandle(то что ты получил результатом вызова BeginThread)


> и вообще зачем, это переменная


Какая еще нахрен переменная ?

Closehandle(BeginThread(..)) - это даже ежу понятно..


 
мимо   (2009-04-05 03:08) [69]


> Closehandle(BeginThread(..)) - это даже ежу понятно..

Очень умно. А если поток не удалось создать?


 
Palladin ©   (2009-04-05 09:45) [70]


> мимо   (05.04.09 03:08) [69]

и что же будет если поток не удалось создать?


 
мимо   (2009-04-05 11:12) [71]

Как минимум - будет логическая ошибка, при которой программа преполагает запушенный поток, которого не будет.


 
Palladin ©   (2009-04-05 11:20) [72]

А как максимум?


 
мимо   (2009-04-05 11:44) [73]

А как максимум - советую для разнообразия подумать самому. Мыслительный процесс он иногда полезен (по крайней мере - некоторым).


 
Palladin ©   (2009-04-05 12:00) [74]

То есть ты не знаешь. )


 
мимо   (2009-04-05 12:32) [75]

Если Вас это успокоит и даст Вам возможность спать спокойно и с достоинством носить голубенький (С) - считайте, что я не знаю.


 
Сергей М. ©   (2009-04-05 14:56) [76]


> мимо   (05.04.09 03:08) [69]


Ну не удалось и не удалось. Катастрофы не случится.
Автора пока заботят утечки, а не "удачность запуска потока"


 
only_wmz ©   (2009-04-07 07:53) [77]

Т.е. выходит из потока тогда, когда возвращает значение функция, я так и думал...

Ток вот странно, запустил через мемпруф, все ресурсы освобождаються все ок, кроме того что число потоков не уменьшаеться, хотя ресурсов они(потоки) занимают ноль, и главно если в дибагфиндов посматреть там пишеться что потоки завершаються. щас скрины короч сниму


 
only_wmz ©   (2009-04-07 07:56) [78]

http://s54.radikal.ru/i143/0904/4c/0e0585e83372.jpg
кол-во потоков не уменьшается, но ресурсов они занимают ноль )

http://i036.radikal.ru/0904/c4/8216f033000f.jpg
хотя здесь пишет что завершаются


 
brother ©   (2009-04-07 08:00) [79]

а в трее то что творится? ;)


 
only_wmz ©   (2009-04-07 08:10) [80]

добавил CloseHandle(BeginThread(...));

В мемпруфе стало показывать что потоков 0, но на память никак не повлияло



Страницы: 1 2 3 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.008 c
15-1237993387
Showmessage
2009-03-25 18:03
2009.05.24
Матрица


2-1239102808
Alexandra
2009-04-07 15:13
2009.05.24
Locate и поиск далее..


2-1239438704
Strelok
2009-04-11 12:31
2009.05.24
picture on click


4-1210141335
Игорь
2008-05-07 10:22
2009.05.24
Привилегии в Windows Vista


4-1203581655
Начинающий
2008-02-21 11:14
2009.05.24
Кто обрабатывает нажатие на кнопку в MessageBox ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский