Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.05;
Скачать: CL | DM;

Вниз

Цикл в отдельном потоке   Найти похожие ветки 

 
Dmitry_177   (2007-05-25 16:18) [0]

Если в программе будет созданн отдельный поток, в котором выполняется бесконечный цикл, т.е. выполняется что-то на протяжении всей работы программы в цикле.. После программу выключают, но что будет с этим отдельным потоком? Выгрузится ли он вообще из памяти?


 
Dmitry_177   (2007-05-25 16:19) [1]

А еще выгрузятся ли все переменные которые были созданы в нем? И параметр который был передан в функцию потока?


 
Германн ©   (2007-05-25 16:22) [2]

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


 
Dmitry_177   (2007-05-25 16:24) [3]

Т.е. если программу выключить, а параметр который был передан в функцию всеравно останется в памяти?


 
Германн ©   (2007-05-25 16:33) [4]


> Dmitry_177   (25.05.07 16:24) [3]
>
> Т.е. если программу выключить, а параметр который был передан
> в функцию всеравно останется в памяти?
>

Ес-сно. А при выключении компьютера Windows  запомнит его в реестре и вспомнит при следующем включении.


 
Dmitry_177   (2007-05-25 16:35) [5]

Вот к примеру:

function ThreadProc(sock: TSocket): DWORD; stdcall;
var
 s: pchar;
begin
 getmem(s, ...);

 while true do
   begin
     ...
   end;

 freemem(s);
 CloseSocket(sock);
 Result := 0;
end;

procedure Button1Click();
var
 sock: TSocket;
 idThread: DWORD;
begin
 sock := ... ;
 CloseHandle(CreateThread(nil, 0, @ThreadProc, Pointer(sock), 0, idThread));
end;


В функцию потока передается созданный сокет, и поток уже с ним работает.. Еще в этой функции выделяется память для s: PChar, но это может быть любая другая переменная, это я для примера написал. Так вот при закрытии программы что произойдет с этом потоком и что будет с переменными sock и s? удалятся ли они из памяти?


 
Германн ©   (2007-05-25 16:37) [6]

"Ну где же эти долбаные пчёлы?" (с)


 
ANB ©   (2007-05-25 18:22) [7]


> Dmitry_177   (25.05.07 16:35) [5]

1. При завершении процесса его память виндовс самостоятельно убивает (точнее разрушает адрессное пространство виртуальной машины).
2. Если поток не завершился, то закрыть по человечески приложение будет проблематично.
3. Если приложение (процесс) завершить аварийно, то см. п.1, однако некоторые системные ресурсы (не относящиеся к памяти процесса) могут остаться занятыми.
Вывод - при завершении приложения завершай поток по человечески. Пример есть прямо в справке.


 
Однокамушкин   (2007-05-26 09:24) [8]

В Windows NT 4 программа не завершалась, пока явно не завершались все потоки, а вот в более поздних версиях досаточно завершить главный поток, и система сама прибьёт остальные потоки и освободит связаные с ними ресурсы...


 
Loginov Dmitry ©   (2007-05-26 09:30) [9]

> а вот в более поздних версиях досаточно завершить главный
> поток, и система сама прибьёт остальные потоки и освободит
> связаные с ними ресурсы


Вот только на СОМ-сервера это правило почему-то не всегда действует. Пока крутится хоть один клиентский поток, даже Halt"ом программу фик снимешь. (TerminateProcess помогает :) )



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

Текущий архив: 2007.08.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
15-1183538222
IMHO
2007-07-04 12:37
2007.08.05
Слово о Ботвиннике (шахматах и переборных задачах)


15-1184139827
pasha_golub
2007-07-11 11:43
2007.08.05
Статья по принципам работы многопользовательских СУБД


6-1167216373
Romas81
2006-12-27 13:46
2007.08.05
просматреть список истории IE


15-1183819065
Витян
2007-07-07 18:37
2007.08.05
Минимальные знания программиста для оплачиваемой работы


15-1183719967
nord489
2007-07-06 15:06
2007.08.05
Работа с 3D