Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.27;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2003.01.27;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
8-86971
Drohen
2002-10-11 09:37
2003.01.27
Кодирование DivX


4-87189
Stainer
2002-12-09 16:41
2003.01.27
темы рабочего стола


3-86678
mate
2003-01-08 13:53
2003.01.27
Очень нужна помощь


1-86854
johny
2003-01-16 10:31
2003.01.27
Совмещение кода C++ & Delphi в однов проекте


14-87133
id_privin
2003-01-10 10:16
2003.01.27
FAQ по Excel ю