![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли передавать из одного потока в другой хендл открытого
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 долго возмущался, что крит. секция в висте не так работает). Вот и получается, что у тебя отдается приоритет проснувшемуся потоку.