Russian Qt Forum
Октябрь 01, 2024, 20:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: запись в файл с нескольких потоков.  (Прочитано 8423 раз)
Dima1985
Гость
« : Октябрь 26, 2011, 15:30 »

привет.
есть статическая ф-я
Код:
static void SaveString(QString str, uint time, int index);
с помощью ее пишутся строки в файл с нескольких потоков.
Как сделать чтобы все записи были успешны і не мешали руг другу.?
тоесть если одновремено поток а і б начнет писать в файл , что в нем окажется?
Записан
SimpleSunny
Гость
« Ответ #1 : Октябрь 26, 2011, 18:06 »

A и B не смогут одновременно писать, если А открыл файл на запись, то В уже этого не сможет сделать.
Используйте статический QMutex.
Код
C++ (Qt)
void save()
{
 QMutexLocker locker(&myMutex);
 write_to_file();
}
Записан
Dima1985
Гость
« Ответ #2 : Октябрь 26, 2011, 18:21 »

A и B не смогут одновременно писать, если А открыл файл на запись, то В уже этого не сможет сделать.
Хм
Код:
    int ia =0;
    int ib=0;
    QFile a("a");
    QFile b("a");
    if(a.open(QIODevice::WriteOnly))
    {
        ia++;
    }
    if(b.open(QIODevice::WriteOnly))
    {
        ib++;
    }
    ia++;
    ib++;
чему будут равны ia и ib ? нет не  2 и 1 а  2 и 2. Тоесть файл дважды открылся на запись!

Цитировать
Используйте статический QMutex.
Код
C++ (Qt)
void save()
{
 QMutexLocker locker(&myMutex);
 write_to_file();
}

про QMutex можно подробней ? я ним никогда не пользовался.
как QMutex указать мою ф-ю?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Октябрь 26, 2011, 18:24 »

SimpleSunny
сможет
Записан
SimpleSunny
Гость
« Ответ #4 : Октябрь 26, 2011, 18:42 »

SimpleSunny
сможет
Хмм, заблуждался значит я (:

про QMutex можно подробней ? я ним никогда не пользовался.
как QMutex указать мою ф-ю?
Где и как объявлена эта функция?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 26, 2011, 19:09 »

Нет никакой необходимости каждой нитке открывать файл по записи - адресное пр-во общее, ну одна открыла, потом все пишут. Засисяться мутексом видимо придется (хотя ОС защищает саму запись, но есть еще и QFile, а там безопасности не обещали). Но все это мелочи - главное что вся затея не продумана. В каком порядке данные должны быть записаны в файл? Если просто "каждый пишет когда захочет" - ну и будут в любом и невоспроизводимо (т.е. новый запуск - новый результат). Это нормально напр для лог файла - но не более 
Записан
Dima1985
Гость
« Ответ #6 : Октябрь 26, 2011, 19:33 »

SimpleSunny
сможет
Хмм, заблуждался значит я (:

про QMutex можно подробней ? я ним никогда не пользовался.
как QMutex указать мою ф-ю?
Где и как объявлена эта функция?



Код:
class mySave
{
public:
    mySave(){};
    static void saveStr(QString str, QDateTime time)
   {
        QFile ("log");
        ......
    }

};
строки: пишут 2 потока,
           основное прилож -> имеет виджеты в которых иногда обработчик таймера пишет строку
пишут так :
Код:
mySave::saveStr("String", QDateTime::curentQdateTime())
« Последнее редактирование: Октябрь 26, 2011, 19:39 от Dima1985 » Записан
SimpleSunny
Гость
« Ответ #7 : Октябрь 26, 2011, 20:33 »

Код
C++ (Qt)
class mySave
{
public:
   mySave(){};
   static void saveStr(QString str, QDateTime time)
  {
       QMutexLocker locker(&MyMutex);
       QFile ("log");
       ......
   }
 
  static QMutex MyMutex;
};

в *.cpp
QMutex mySave::MyMutex;

Но следует помнить, что пока 1 поток пишет что-то в файл, второй "заснет" на строчке QMutexLocker locker(&MyMutex);. Если пишут достаточно часто и много, то лучше сделать по-другому.
Записан
andrew.k
Гость
« Ответ #8 : Октябрь 26, 2011, 21:18 »

Лучше сделать один класс в основном потоке, который и будет писать в файл.
А остальные потоки просто передают че писать.
Т.к. это файл журнала, то порядок не важен.

Код
C++ (Qt)
class MyThread : public QThread
{
 Q_OBJECT
public:
 void doSomeWork()
 {
   doIt();
   emit toLog( "I did it" );
 }
signals:
 emit toLog( const QString & line );
}
 
class Logger : public QObject
{
Q_OBJECT
public slots:
 void writeToLog( const QString &line )
 {
   if (file.isOpen())
     file.write( QString( "%1\t%2" ).arg( QDateTime::currentDateTime().toString() ).arg( line );
 }
}
 
void somewhere()
{
 Logger log;
 MyThread * thread;
 thread = new MyThread();
 connect( thread, SIGNAL( toLog( const QString&) ), &log, SLOT( writeToLog( const QString& ) ) );
 thread = new MyThread();
 connect( thread, SIGNAL( toLog( const QString&) ), &log, SLOT( writeToLog( const QString& ) ) );
}

Примерно так. Никаких проблем не должно быть.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.149 секунд. Запросов: 23.