Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.17;
Скачать: CL | DM;

Вниз

Cогласовать вызов из разных потоков WriteFile ReadFile FilePointe   Найти похожие ветки 

 
msn777   (2007-11-05 15:09) [0]

Как согласовать одновременный вызов из разных потоков WriteFile, ReadFile и общий FilePointer

Подскажите, может, кто сталкивался с такой задачей.
Пишу приложение, которое должно в одном потоке в реальном режиме времени читать данные из внешнего устройства в ОЗУ ПК, в другом потоке записывать данные из ОЗУ ПК в файл, а в третьем потоке отображать на экране выбираемый пользователем участок данных.

Т.е. получается в потоке записи:
SetFilePointer(hSwapFile, 0, NULL, FILE_END);
WriteFile (hFile …)

В потоке прорисовки:
На основании выбранного участка данных определяем Position
SetFilePointer(hFile, Position, NULL, FILE_BEGIN);
ReadFile (hFile …)

Может ли быть, так что во время чтения, например блока данных размеров 100 KB, после прочтения 50 KB управления получит поток записи, т.е. установит FilePointer в конец файла и запишет очередной блок данных, после чего управление вернется потоку чтения, и он дочитает оставшиеся 50 KB с “правильной” позиции или с конца файла, куда будет указывать FilePointer?
Следит ли Windows за тем что бы, например если ReadFile была прервана (если она прерывается) то не дочитанный кусок был дочитан с той позиции, на которой чтение было прервано? Или нужно использовать какой-то флажок взаимнозапрещающий одновременно запить / чтение.

Спасибо.


 
MetalFan ©   (2007-11-05 18:57) [1]


> Следит ли Windows

имхо не следит. операции с файлами непотокобезопасны и следить за обращением из разных потоков наверняка стоит самому...


 
Leonid Troyanovsky ©   (2007-11-06 12:59) [2]


> msn777   (05.11.07 15:09)  

> Пишу приложение, которое должно в одном потоке в реальном
> режиме времени читать данные из внешнего устройства в ОЗУ
> ПК, в другом потоке записывать данные из ОЗУ ПК в файл,
> а в третьем потоке отображать на экране выбираемый пользователем
> участок данных.

Начать надо с того, что если в целевой системе не более 1 процессора,
то все эти доп. потоки излишни (особенно в "реальном режиме").

--
Regards, LVT.


 
tesseract ©   (2007-11-06 17:15) [3]


> имхо не следит. операции с файлами непотокобезопасны и следить
> за обращением из разных потоков наверняка стоит самому..
> .


Самому конечн, рекомендую критические секции на запись в ОЗУ.  Гарантировано не будет  пересечений.


 
msn777   (2007-11-07 12:02) [4]

Спасибо за советы.

> Начать надо с того, что если в целевой системе не более 1 процессора,
> то все эти доп. потоки излишни (особенно в "реальном режиме").

Понятно что настоящего Real Time в Windows нет, а потоки необходимы для выполнения 3-х почти параллельных действий.

> Самому конечн, рекомендую критические секции на запись в ОЗУ.  Гарантировано не будет  пересечений.

Не ясно зачем КС на запись в ОЗУ?

Может разумно использовать 2 дескриптора одно и тоже файла, один для записи, другой для чтения.


 
Сергей М. ©   (2007-11-07 12:23) [5]


> зачем КС на запись в ОЗУ?


Как ты вообще собрался что-то там записывать в ОЗУ ?
Прикладной процесс не имеет доступа к физ.памяти, только к виртуальной.


 
tesseract ©   (2007-11-07 14:39) [6]


> Не ясно зачем КС на запись в ОЗУ?


Про коллизии слышал  - ты точно уверен, что у тебя запись в озу не пересечёться с чтением? И что ты кучку мусора не считаешь?.


 
Leonid Troyanovsky ©   (2007-11-07 14:45) [7]


> msn777   (07.11.07 12:02) [4]

> Понятно что настоящего Real Time в Windows нет, а потоки
> необходимы для выполнения 3-х почти параллельных действий.

Почему параллельных?
Чтение - отображение - запись.

Потоки здесь (на 1 процессорной машине) - overhead.

--
Regards, LVT.


 
msn777   (2007-11-07 15:45) [8]

> Как ты вообще собрался что-то там записывать в ОЗУ ?
> Прикладной процесс не имеет доступа к физ.памяти, только к виртуальной.

Пишу просто много для микроконтроллеров, привык память называть ОЗУ.
Запись идет в большой буфер виртуальной памяти, используемой как FIFO, с двумя указателями чтения и записи и количеством байт в FIFO, все прекрасно работает и правильно синхронизировано между собой.

> Про коллизии слышал  - ты точно уверен, что у тебя запись в озу не пересечёться с чтением? И что ты кучку мусора не считаешь?.

Да уверен. За полгода работы проги нареканий не было.  Коллизий нет, там где нужно используются Interlocked функции.

Вопрос был по использованию общего FilePointer в потоках, а не использовании памяти.

> Почему параллельных?
> Чтение - отображение -.

Потому что внешнее устройство работает асинхронно от ПК, пользователь работает асинхронно, а запись идет не по 1K-2K, а по 1-2МБ, т.е. может быть так:
Чтение
Чтение
Чтение
Отображение
Чтение
Чтение
Отображение
Чтение
Запись


 
DiamondShark ©   (2007-11-07 16:49) [9]


> msn777   (05.11.07 15:09)  

А что б тебе не открыть два хэндла к одному файлу, через один пейсать, а через другой читать?


 
DiamondShark ©   (2007-11-07 16:54) [10]


> Потоки здесь (на 1 процессорной машине) - overhead.

Без фанатизма, пожалуйста.

UI и IO -- самые лучшие кандидаты на распараллеливание по потокам не зависимо от количества процессоров. Именно по причине того, что большую часть времени эти задачи как раз не занимают процессор, а ждут реакции внешних устройств.


 
Leonid Troyanovsky ©   (2007-11-07 19:49) [11]


> msn777   (07.11.07 15:45) [8]

> Потому что внешнее устройство работает асинхронно от ПК,
>  пользователь работает асинхронно, а запись идет не по 1K-
> 2K, а по 1-2МБ, т.е. может быть так:

Да хоть и так. Что здесь выправят доп. потоки?

А юзера распутились, работают, понимаешь, асинхронно.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-11-07 19:51) [12]


> DiamondShark ©   (07.11.07 16:54) [10]

> Без фанатизма, пожалуйста.

Без глупостей, плиз.

--
Regards, LVT.


 
DiamondShark ©   (2007-11-09 12:04) [13]


> Leonid Troyanovsky ©   (07.11.07 19:51) [12]

Обоснования будут, или спишем на "лапнул не подумав"?


 
Leonid Troyanovsky ©   (2007-11-09 12:50) [14]


> DiamondShark ©   (09.11.07 12:04) [13]

Обоснования будут, или спишем на "лапнул не подумав"?

Кто первый начал, тот и первый обоснуй.

--
Regards, LVT.


 
MetalFan ©   (2007-11-11 23:09) [15]

ну вот) начались переводы стрелок ;)
уж обоснуйте плиз оба! интересно почитать )))


 
miek   (2007-11-12 20:53) [16]

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


 
Leonid Troyanovsky ©   (2007-11-12 21:31) [17]


> MetalFan ©   (11.11.07 23:09) [15]

> уж обоснуйте плиз оба! интересно почитать )))

А чего там обоснуешь, если информации о задаче мало.
Ясно одно, что просмотр и запись конкурируют за доступ
к диску, и приоритет должен быть выше у записи, чтоб не терять
данные, которые можно разглядывать и после того.
Учитывая, что, видимо, данные с устройства тоже нельзя терять,
то главный цикл это чтение-запись (исполнение запросов побочно)

Лучше всего, IMHO, организовать было б так:
сбрасывать данные на отдельно стоящий SQL сервер,
и читать его отдельным клиентом.
Если клиент работает на одной машине с читателем,
то приоритет писателя д.б. выше.

Ну, а можно и в одном потоке: чтение, запись (синх.) и, если осталось
время (до таймера, до event) - мож что-то и покажем.

И, ясно, что 3 потока - здесь оверхед, только на переключении
контекстов. Да и, синхронизировать будет не очень удобно,
если учесть, что  VCL-потоку нужно (?) приоритет понизить.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-11-12 21:48) [18]


> miek   (12.11.07 20:53) [16]

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

Допустим, что у потоков-читателей есть r/o mapping файла,
и они писателю не мешают (мешают, конечно, мешают).
Но, и в этом случае, извещать-то их об изменениях нужно.
А двух писателей, все равно, разделять надо.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2007-11-13 09:00) [19]

> Leonid Troyanovsky  (12.11.2007 21:48:18)  [18]

Должна быть идеология аналогичная TMultiReadExclusiveWriteSynchronizer.


 
Leonid Troyanovsky ©   (2007-11-13 10:44) [20]


> Anatoly Podgoretsky ©   (13.11.07 09:00) [19]

> Должна быть идеология аналогичная TMultiReadExclusiveWriteSynchronizer.

После D5, IMHO, borland существенно переработал изначальный
вариант, написанный, видимо, двоечниками. Но, все равно,
прежде чем использовать, лучше его тщательно изучить.

Гораздо прозрачней объект Рихтера: Single writer multiply readers
guardian object (SWMRG), откуда и взять идеологию, бо, хоть он
и рассчитан на межпроцессную синхронизацию, работал гораздо
надежней чем MREWS.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2007-11-13 12:20) [21]

> Leonid Troyanovsky  (13.11.2007 10:44:20)  [20]

Так я с учетом конференции и не говорю, об его использовании.



Страницы: 1 вся ветка

Текущий архив: 2008.08.17;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.034 c
2-1215717991
flaxe
2008-07-10 23:26
2008.08.17
Картинки в DBF


2-1215500811
matriza
2008-07-08 11:06
2008.08.17
Excel. Узнать координату ячейки


10-1148780842
y307
2006-05-28 05:47
2008.08.17
Вызов GetActiveOleObject или CreateOleObject


15-1214862362
Petr V. Abramov
2008-07-01 01:46
2008.08.17
Софт - отстой.


2-1215767508
ekto
2008-07-11 13:11
2008.08.17
Как разбить текст на строки?