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-26 00:54:00) [1]


> Leonid Troyanovsky ©   (25.02.09 18:57) [26]
>
>
> > Германн ©   (25.02.09 18:46) [25]
>
> > Почему?
>
> Видимо, паранойя :)

А ну да. Пиши всегда [0] и на все случаи застрахован! То бишь главное "не политурить" (с) Р. Шекли.
:)


> И чего он такого размера, если читают всего ничего?
>

Видимо шизофрения :)
Или какой-то подвид нумерологии. Ибо я не могу никак понять смысл чисел
102399 и 102400!


Leonid Troyanovsky   (2009-02-25 18:57:00) [2]


> Германн ©   (25.02.09 18:46) [25]

> Почему?

Видимо, паранойя :)

--
Regards, LVT.


Германн   (2009-02-25 18:46:00) [3]


> Leonid Troyanovsky ©   (25.02.09 18:38) [24]


> Buf[0]

Почему?


Leonid Troyanovsky   (2009-02-25 18:38:00) [4]


> EgorovAlex ©   (25.02.09 07:52) [3]

>  if not ReadFile(hTest, Buf, 1024, BytesRead, nil) then

Buf[0]
И чего он такого размера, если читают всего ничего?

--
Regards, LVT.


тимохов   (2009-02-25 16:46:00) [5]


> EgorovAlex ©   (25.02.09 16:26) [21]
>
> 2тимохов
> пробовал - результат тот-же, но Execute действительно начинает
> работать после выхода из моего конструктора


Он может закончится до конца конструктора :)

Мне лень писать пример. Ну, хотя бы сделай sleep после resume в твоем варианте на 5 сек., увидишь, что execute успеет отработать, соответственно к концу Create объекта уже нет :)

скорее всего это вряд ли причина именно твоей ошибки, но это точно источник потенциальных ошибок. причем трудно выводимых.

надо, конечно, немного подумать, чтобы ошибку гарантировано получить, но в твоем случае класс потома может быть уничтожен до выполнения, скажем TThread.AfterConstruction, где есть обращения к членам класса, а если объект уничтожен, то потенциально может быть AV.


Сергей М.   (2009-02-25 16:36:00) [6]


> или вместо GetCurrentProcess лучше GetCurrentThread?


Нет, именно GetCurrentProcess


EgorovAlex   (2009-02-25 16:26:00) [7]

2тимохов
пробовал - результат тот-же, но Execute действительно начинает работать после выхода из моего конструктора


тимохов   (2009-02-25 16:23:00) [8]

2Автор.

Ты попробовал сделать что я тебе сказал?

У тебя в коде потенциальная ошибка 100%.
Даже если не она причина, все равно поправь.


EgorovAlex   (2009-02-25 16:15:00) [9]

Примерно так:? или вместо GetCurrentProcess лучше GetCurrentThread?

DuplicateHandle(GetCurrentProcess, hFile, GetCurrentProcess, @hDup, 0, True, DUPLICATE_SAME_ACCESS);


Сергей М.   (2009-02-25 15:56:00) [10]


> EgorovAlex ©   (25.02.09 15:54) [17]


FILE_FLAG_DELETE_ON_CLOSE
Indicates that the operating system is to delete the file immediately after all of its handles have been closed, not just the handle for which you specified FILE_FLAG_DELETE_ON_CLOSE.


> что-то очень много параметров у функции


Что не понятно ?


EgorovAlex   (2009-02-25 15:54:00) [11]

У меня файл создаётся с флагом DELETE_ON_CLOSE, если я создам дубликат,  а оригинальный хендл закрою, это нормально пройдёт, файл не удалится?

И ещё, как правильно сделать дубликат, там что-то очень много параметров у функции


Сергей М.   (2009-02-25 15:27:00) [12]


> EgorovAlex


Что ж ты так мучаешься ?)
Ну сделай ты дубликат хэндла и передай его конструируемому потоку, а оригинал смело удаляй..


тимохов   (2009-02-25 11:41:00) [13]


> EgorovAlex ©   (25.02.09 10:59) [9]
>
> А в приведённом коде не получится так, что после вызова
>
> inherited Create(False);
>
> метод Execute выполнится раньше, чем произойдёт инициализация
> данных?


реально потом все равно создается отстновленным, а запускается в AfterConstruction.

Смотри исходники.


тимохов   (2009-02-25 11:34:00) [14]


> Palladin ©   (25.02.09 11:11) [12]
>
>
> > тимохов   (25.02.09 10:51) [7]
>
> А если подумать получше? Ты написал все с точностью до наоборот.
>


блин, ты исходники посмотри, а потом говори. ок?

обрати внимание на procedure TThread.AfterConstruction.

вообще я уверен, что проблема в чем я сказал :)

-----

это тонкое место, на нем ломались многие. мне первый раз на него обратил внимание Александр Шахнов (кажется). я тогда сам прибалдел немного. однако я прав. писать надо false в конструкторе, либо не пиисать FreeOnTerminate.


EgorovAlex   (2009-02-25 11:14:00) [15]

После дополнительного тестирования получилось так - при удалённой отладке (remote debug) не работает, а без отладки работает... странно как-то вышло


Palladin   (2009-02-25 11:11:00) [16]


> тимохов   (25.02.09 10:51) [7]

А если подумать получше? Ты написал все с точностью до наоборот.


Palladin   (2009-02-25 11:06:00) [17]


> EgorovAlex ©   (25.02.09 10:59) [9]

А, в этом случае да, конечно, после Inherited(False) Execute сразу пойдет на выполнение. Этого делать нельзя.


Palladin   (2009-02-25 11:05:00) [18]

Нет, конструктор выполняется в основном потоке, Execute начинает выполнятся после Resume.


EgorovAlex   (2009-02-25 10:59:00) [19]

А в приведённом коде не получится так, что после вызова

inherited Create(False);

метод Execute выполнится раньше, чем произойдёт инициализация данных?


тимохов   (2009-02-25 10:53:00) [20]

Пояснение - не делать поток suspended = true (см. параметр inherited Create).

Вообще, очень похоже, что я прав, т.к. в разных Windows, видимо, разные немного планировщики потоков (помню тут Piter долго возмущался, что крит. секция в висте не так работает). Вот и получается, что у тебя отдается приоритет проснувшемуся потоку.


Страницы:   1 2

Наверх

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