Вниз
Скачать: 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.016 c
15-1183717597
Nic
2007-07-06 14:26
2007.08.05
Процедура или функция в DLL


1-1180436608
malor
2007-05-29 15:03
2007.08.05
Конвертация кавычек и слэша в XML тексте. При отправке его метод


8-1162195024
dzuev
2006-10-30 10:57
2007.08.05
картинка с web камеры


2-1183895720
_user
2007-07-08 15:55
2007.08.05
Изменить пароль на Access


15-1183832856
Витян
2007-07-07 22:27
2007.08.05
Windows XP - идеальная операционная система




   Наверх