|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
25.05.2017, 13:31 | #1 |
Форумчанин
Регистрация: 07.08.2011
Сообщений: 576
|
Qt многопоточнсть и работа с файлами
Скажите - могут ли, два или более потоков одновременно читать файл?
Как это протестировать не придумал, по этому задаю вопрос. Последний раз редактировалось SAMOUCHKA; 25.05.2017 в 13:34. Причина: создал тему не в том разделе |
25.05.2017, 13:39 | #2 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Смотря как. А зачем?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
25.05.2017, 13:47 | #3 |
Форумчанин
Регистрация: 07.08.2011
Сообщений: 576
|
на сервере хранится файл. по запросу клиентского приложения его нужно читать и отправлять данные клиенту.
Запрос на чтение файла может придти сразу от нескольких клиентов. Там будет класс, обертка над QTcpSocket. для каждого клиента будет создаватся экземпляр этого класса и работать в своем потоке |
25.05.2017, 14:39 | #4 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Не должно быть проблем если в это же время не надо писать и т.п. файл. Просто открывать с соответствующим флагом про шаринг.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
25.05.2017, 15:18 | #5 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Мне тоже это в скором времени предстоит.
Читать могут. Вопрос только как. Что нам пишет справка по QT? http://doc.qt.io/qt-4.8/threads-reentrancy.html http://doc.qt.io/qt-4.8/threads-qobject.html В двух словах QT - обладает минимальной защитой от много-поточных приложений. Даже проще сказать её там нет. Если у вас у каждого потока разные объекты. То вы можете с ними работать безбоязненно. Если у вас общий объект для нескольких потоков то вы можете Вызывать его функции только у которых есть пометка thread-safe или то reentrant. Функции с пометкой thread-safe принимают данные на общие ресурсы через умные указатели. А функции reentrant могут принимать от каждого потока его данные. Что это значит? Это два пути. Первый путь. В каждом потоке порождать(инстацировать) свой объект. В каждым открываем файл и пусть ОС разгребает. ОС сама не может справиться, вы ей должны объяснить что это общий ресурс. В зависимости от ОС надо указать ReadOnly и/или Shared. Второй путь. Это общий объект внутри программы. Для этого потребуется сделать обёртку над QFile. Добавляем мьютекс и внутри каждой функции закрываем объект, а потом по выходу открывает. Как щеколда в туалете, ванной. Наверняка, кто-то уже готовое делал и надо просто поискать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
25.05.2017, 15:22 | #6 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Причем тут потоки? Автор не говорил ничего про работу с общими объектами в его программе.
Один и тот же QFile использовать в разных потоках конечно нельзя, да.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
25.05.2017, 15:46 | #7 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Alex11223 Автор в заголовке написал что речь про многопоточность.
И потом ещё уточнил что работать в потоке. Явно автор ведёт речь про исполняемые-поток, а не про потоки вввода/вывода. Во-вторых я рассмотрел оба случая. Путь первый это и есть когда у него разные объекты имеют доступ к одному общему ресурсу(файлу). Но насколько помню ReadOnly недостаточно и нужно ставит общий. Но чтото я в QT пока не найду как.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
25.05.2017, 15:56 | #8 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Судя по всему Shared не получится. Зато можно отобразить в память uchar* p = file.map(0, File.Size());
И передать указатель. И читать напрямую из памяти.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
25.05.2017, 16:53 | #9 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Судя по всему в QT подход следующий. Файлы всегда открываются на совместное чтения и на запись. Ничего с ними делать не надо. А вот если вы хотите их заблокировать, то есть QLockFile. Хотя так ли это на самом деле надо проверить в виндоусе и линуксе.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
25.05.2017, 17:21 | #10 |
Форумчанин
Регистрация: 07.08.2011
Сообщений: 576
|
А как практически протестировать? Видимо тут многое от ОС зависит.
Потоки - я имел ввиду многопоточную программу. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с файлами | maxwelln1 | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 15.10.2016 21:21 |
Лабораторная работа(очень простая) Структуры, работа с файлами | yurda | Фриланс | 2 | 11.06.2016 08:44 |
Работа с файлами: запись, добавление, чтение (найти ошибку в коде) / C для начинающих Надо создать программу для работы с файлами | Konlor | Общие вопросы C/C++ | 2 | 18.05.2014 12:37 |
работа с файлами | Ioane | Помощь студентам | 0 | 28.02.2012 16:52 |
Работа с файлами | prem1era | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 06.06.2010 19:28 |