![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли передавать из одного потока в другой хендл открытого
EgorovAlex © (2009-02-24 15:32:00)файла? Почему спрашиваю - есть код, который много лет работал под NT/2000/XP/2003, так же нормально работает под Vista и 7 beta, а вот под Server 2008 не работает - после того, как я передаю хендл в поток - операция чтения из этого хендла возвращает, что нет такого хендла :(
Что может быть?
тимохов (2009-02-25 10:51:00) [21]Не знаю в этом ли ошибка, но так писать незя вообще (правда от версии Дельфи зависит - у них менялась реализация).
При этом я думаю, что ты неверно идентифицируешь ошибку, кстати.
Смотри, что происходит:
1. При вызове Resume начинает работать функция ThreadProc из classes.
2. Они быстро выполняет Execute.
3. Все это заканчивается тем, что еще до выхода из Createit поток уже закончил работу и уничтожен :)
Что делать? Написать вот так:
constructor TSaveThread.CreateIt(const hFile: Cardinal);
begin
inherited Create(False);
TestHandle(hFile); // нормально
Self.hFile := hFile;
TestHandle(Self.hFile); // нормально
FreeOnTerminate := True;
end;
Palladin (2009-02-25 08:52:00) [22]У меня никакой ошибки не возникает. Ищи закрытие хендла в других местах.
EgorovAlex (2009-02-25 08:42:00) [23]Нет, закрытие у меня именно в потоке происходит, в основном коде закрытия нет, и ещё раз - этот код не работает только под Windows Server 2008, под всеми остальными осями работает :(
Я уже пару дней не могу разобраться, в VMWare все оси поставил для тестов
Palladin (2009-02-25 08:34:00) [24]Это может произойти если ты сразу же, после создания потока, в основном закрыл handle.
EgorovAlex (2009-02-25 07:52:00) [25]Вот код:
procedure TestHandle(const hTest: Cardinal);
var
BytesRead: Cardinal;
Buf: array[0..102399] of Byte;
begin
SetFilePointer(hTest, 0, nil, FILE_BEGIN);
if not ReadFile(hTest, Buf, 1024, BytesRead, nil) then
MessageBox(0, PChar(SysErrorMessage(GetLastError)), '', MB_OK);
end;
type
TSaveThread = class(TThread)
hFile: Cardinal;
protected
constructor CreateIt(const hFile: Cardinal);
procedure Execute; override;
end;
constructor TSaveThread.CreateIt(const hFile: Cardinal);
begin
inherited Create(True);
TestHandle(hFile); // нормально
Self.hFile := hFile;
TestHandle(Self.hFile); // нормально
FreeOnTerminate := True;
Resume;
end;
procedure TSaveThread.Execute;
begin
TestHandle(hFile); // выдаёт Invalid File Handle
end;
guav (2009-02-24 23:10:00) [26]
> Что может быть?
Race condition :-)
тимохов (2009-02-24 17:06:00) [27]что под потоком имеется в виду?
файл? хендл файла можно передавать.
и вообще - код приведи :)