Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Vlojennie Thread [D6, WinXP]


euge ©   (2002-12-11 01:58:00) 

Hi All

Sozdau thread v glavnoi programe, a potom iz sozdannogo threada sozdau eshe odi, peredau parametr lpParameter i prinimau ego vo vtorom threade, no ne mogu s nim rabotat", oshibka pamiat".

v chem proble, ne podskajit li vseznausheiu ALL.

procedure ThreadMain(lpParameter : LPDWORD); stdcall;
procedure OnePipe(lpParameter : LPDWORD); stdcall;

procedure OnePipe(lpParameter : LPDWORD);
var
hPipe : DWORD;
begin
hPipe := lpParameter^; //I have an error here?
c := #0;
while (c <> "i") do
begin
ReadFile(hPipe, c, 1, dwRead, nil);
if (dwRead > 0) and (c <> "") then Form1.Caption
:= Form1.Caption + c;
end;
DisconnectNamedPipe(hPipe);
CloseHandle(hPipe);
end;

procedure ThreadMain(lpParameter : LPDWORD);
var
err : boolean;
hPipe : DWORD;
begin
hPipe := CreateNamedPipe("\\.\pipe\hi",
PIPE_ACCESS_INBOUND, PIPE_WAIT, PIPE_UNLIMITED_INSTANCES,
256, 256, 0, nil);
err := ConnectNamedPipe(hPipe, nil);
lpParameter := @hPipe;
CreateThread(nil, 0, @OnePipe, @hPipe, 0, lpThreadId);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
lpParameter : LPDWORD;
hPipe : DWORD;
begin
CreateThread(nil, 0, @ThreadMain, lpParameter,
0, lpThreadId);
end;


Digitman   (2002-12-11 10:29:00) [1]

Время жизни лок.переменной hPipe равно времени жизни процедуры ThreadMain()

Время жизни процедуры ThreadMain() равно времени выполнения всех операторов в ее теле.

Оператор, вызывающий ф-цию CreateThread() в теле ThreadMain(), немедленно исполняется и после этого ThreadMain() завершается, убирая за собой "мусор", в т.ч. "уничтожая" лок.переменную hPipe (размещенную в стеке на время жизни ThreadMain).

После "уничтожения" лок.переменной hPipe обращаться к ней ни по адресу ни по значению не имеет смысла и опасно - переменная уже не существует.

В то же время вызов ф-ции
CreateThread(nil, 0, @OnePipe, @hPipe, 0, lpThreadId);
приводит к старту нового потока тек.процесса, и поточной ф-ции OnePipe() передается в кач-ве параметра адрес лок.переменной hPipe (которая перестанет существовать через тысячные доли секунды, почти сразу же за завершением выполнения CreateThread в теле ThreadMain)

Вложенный поток, получив управление в поточной ф-ции OnePipe(), первым делом пытается обратиться к параметру по его адресу

hPipe := lpParameter^; //I have an error here?

что и приводит к ошибке, ибо параметр уже не существует


Наверх

Титульная страница Поиск, карта сайта Написать письмо