Форум: "WinAPI";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
ВнизVlojennie Thread Найти похожие ветки
← →
euge (2002-12-11 01:58) [0]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) [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?
что и приводит к ошибке, ибо параметр уже не существует
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c