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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.04 c
15-1183728592
dima123
2007-07-06 17:29
2007.08.05
иконки...


15-1184069229
Вася Правильный
2007-07-10 16:07
2007.08.05
и мыло несуществующее у того варвара :(


15-1184013347
Petr V. Abramov
2007-07-10 00:35
2007.08.05
положительные стороны совка....


15-1184087467
AIK
2007-07-10 21:11
2007.08.05
Вопрос


2-1184119709
Biggelow
2007-07-11 06:08
2007.08.05
RC4





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский