qtconcurrent и запись в txt файл



  • Здравствуйте, изучаю потоки и пробую через qtconcurrent::map записать в файл данные, устанавливаю количество потоков, в результате через qDebug наблюдаю все действия чтобы понять принцем работы, проблема в том что когда устанавливаешь больше 3 потока не все данные записываются в файл, а в qDebug все как и должно выводится, подскажите в чем проблема

    пример:

    Dialog.h

    class Dialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit Dialog(QWidget *parent = 0);
        ~Dialog();
    
        static void Task(int &number);
    
         QVector<int> vector;
    
         QFutureWatcher<void> watcher;
    
    

    Dialog.cpp

    void Dialog::Task(int &number)
    {
        QString filename = "test/1.txt";
    
        int rs = qrand() % 15000;
    
        QFile file(filename);
    
        if(file.open(QIODevice::Append | QIODevice::Text)) {
           QTextStream stream(&file);
    
           stream << "Number " << number << " Rand: " << rs << "\n";
    
           file.close();
    
        } else return;
    
        qDebug() << "Number " << number << " Rand: " << rs;
    
        QThread::currentThread()->msleep(2000);
    
    }
    
    void Dialog::on_butStart_clicked()
    {
        for(int i = 0; i <= 15; i++)
            vector.append(i);
        
        QThreadPool::globalInstance()->setMaxThreadCount(ui->boxThread->text().toInt());
    
        qDebug() << vector.count();
    
        connect(&watcher, SIGNAL(finished()), ui->progressBar, SLOT(reset()));
    
        connect(&watcher, SIGNAL(progressRangeChanged(int,int)), ui->progressBar, SLOT(setRange(int,int)));
    
        connect(&watcher, SIGNAL(progressValueChanged(int)), ui->progressBar, SLOT(setValue(int)));
    
    
        QFuture<void> future = QtConcurrent::map(vector, &Dialog::Task);
    
        watcher.setFuture(future);
    
    //    watcher.waitForFinished();
    
        if(watcher.isCanceled()) {
            qDebug() << "canceled!!";
    
            QMessageBox::critical(
                        this,
                        "Canceled",
                        "Stop proggress!"
                        );
        }
    
    }
    

  • Moderators

    @Flysink

    class Dialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit Dialog(QWidget *parent = 0);
        ~Dialog();
    
        static void Task(int &number);
    
         QVector<int> vector;
    
         QFutureWatcher<void> watcher;
         QMutex mutex;
    
    void Dialog::Task(int &number)
    {
        QString filename = "test/1.txt";
    
        int rs = qrand() % 15000;
    
        QFile file(filename);
        {
            QMutexLocker locker(mutex);
            if(file.open(QIODevice::Append | QIODevice::Text)) {
               QTextStream stream(&file);
    
               stream << "Number " << number << " Rand: " << rs << "\n";
    
               file.close();
    
            } else return;
    
            qDebug() << "Number " << number << " Rand: " << rs;
        }
    
        QThread::currentThread()->msleep(2000);
    
    }
    


  • спасибо за вариант, сделал чуть по-другому так как функция статическая

    void Dialog::Task(int &number)
    {
        static QMutex mutex;
    
        QString filename = "test/1.txt";
    
        int rs = qrand() % 15000;
    
        QFile file(filename);
        {
        mutex.lock();
    
        if(file.open(QIODevice::Append | QIODevice::Text)) {
           QTextStream stream(&file);
    
           stream << "Number " << number << " Rand: " << rs << "\n";
    
           file.close();
           
        } else return;
    
        mutex.unlock();
        qDebug() << "Number " << number << " Rand: " << rs;
    }
        QThread::currentThread()->msleep(2000);
    
    }
    

  • Moderators

    @Flysink

    void Dialog::Task(int &number)
    {
        static QMutex mutex;
        QString filename = "test/1.txt";
        int rs = qrand() % 15000;
        QFile file(filename);
        {
            mutex.lock();
            if(file.open(QIODevice::Append | QIODevice::Text)) {
                QTextStream stream(&file);
                stream << "Number " << number << " Rand: " << rs << "\n";
                file.close();
            } else {
                mutex.unlock(); // <- !!!
                return;
            }
            mutex.unlock();
            qDebug() << "Number " << number << " Rand: " << rs;
        }
        QThread::currentThread()->msleep(2000);
    }
    

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.