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

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

Можно ли передавать из одного потока в другой хендл открытого


Страницы:   1 2

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]

что под потоком имеется в виду?

файл? хендл файла можно передавать.

и вообще - код приведи :)


Страницы:   1 2

Наверх

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