Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.02 c
15-1183748062
Курдль
2007-07-06 22:54
2007.08.05
Хочу на вас заработать бонус! Ну, пожалуйста!


15-1182039230
Bell
2007-06-17 04:13
2007.08.05
Как у TPanel открыть события колеса мыши и клавиш?


1-1180529699
Margo
2007-05-30 16:54
2007.08.05
Stack Overflow на создании формы


1-1180103569
DevilDevil
2007-05-25 18:32
2007.08.05
TTabControl VS Manifest


1-1180453969
Stenfit
2007-05-29 19:52
2007.08.05
*.CHM




   Наверх