Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2017, 13:31   #1
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию Qt многопоточнсть и работа с файлами

Скажите - могут ли, два или более потоков одновременно читать файл?

Как это протестировать не придумал, по этому задаю вопрос.

Последний раз редактировалось SAMOUCHKA; 25.05.2017 в 13:34. Причина: создал тему не в том разделе
SAMOUCHKA вне форума Ответить с цитированием
Старый 25.05.2017, 13:39   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Смотря как. А зачем?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.05.2017, 13:47   #3
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

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

Там будет класс, обертка над QTcpSocket. для каждого клиента будет создаватся экземпляр этого класса и работать в своем потоке
SAMOUCHKA вне форума Ответить с цитированием
Старый 25.05.2017, 14:39   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не должно быть проблем если в это же время не надо писать и т.п. файл. Просто открывать с соответствующим флагом про шаринг.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.05.2017, 15:18   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 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. Добавляем мьютекс и внутри каждой функции закрываем объект, а потом по выходу открывает. Как щеколда в туалете, ванной.

Наверняка, кто-то уже готовое делал и надо просто поискать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.05.2017, 15:22   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут потоки? Автор не говорил ничего про работу с общими объектами в его программе.
Один и тот же QFile использовать в разных потоках конечно нельзя, да.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 25.05.2017, 15:46   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Alex11223 Автор в заголовке написал что речь про многопоточность.
И потом ещё уточнил что работать в потоке.
Цитата:
Сообщение от SAMOUCHKA Посмотреть сообщение
и работать в своем потоке
Явно автор ведёт речь про исполняемые-поток, а не про потоки вввода/вывода.

Во-вторых я рассмотрел оба случая. Путь первый это и есть когда у него разные объекты имеют доступ к одному общему ресурсу(файлу). Но насколько помню ReadOnly недостаточно и нужно ставит общий.
Но чтото я в QT пока не найду как.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.05.2017, 15:56   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Судя по всему Shared не получится. Зато можно отобразить в память uchar* p = file.map(0, File.Size());
И передать указатель. И читать напрямую из памяти.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.05.2017, 16:53   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Судя по всему в QT подход следующий. Файлы всегда открываются на совместное чтения и на запись. Ничего с ними делать не надо. А вот если вы хотите их заблокировать, то есть QLockFile. Хотя так ли это на самом деле надо проверить в виндоусе и линуксе.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 25.05.2017, 17:21   #10
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

А как практически протестировать? Видимо тут многое от ОС зависит.
Потоки - я имел ввиду многопоточную программу.
SAMOUCHKA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами 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