Главная страница
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.011 c
1-86854
johny
2003-01-16 10:31
2003.01.27
Совмещение кода C++ & Delphi в однов проекте


1-86918
Andrey V.
2003-01-16 15:20
2003.01.27
dinamyc arrays


4-87203
Youri
2002-12-10 12:13
2003.01.27
Telephony API header translation!


3-86638
Flagman
2003-01-06 22:56
2003.01.27
Удаление записей через триггер


3-86671
Young_01
2003-01-08 16:08
2003.01.27
Ошибка при открытии dbf файлов