Главная страница
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.022 c
2-1183875434
Igor Mish
2007-07-08 10:17
2007.08.05
Работа с COM 1


15-1184140812
db2admin
2007-07-11 12:00
2007.08.05
Опять судят за использование не лицензионного ПО в школе. Rjve


15-1183813273
Тень отца Гамлта
2007-07-07 17:01
2007.08.05
Медленно удаляются файлы


15-1183812054
Piter
2007-07-07 16:40
2007.08.05
Есть у кого опыт обладания скутером?


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