OSDN Git Service

ファイル読込を別スレッド化
authorMasayuki Satoh <miyabi.satoh@gmail.com>
Thu, 18 Sep 2014 02:40:27 +0000 (11:40 +0900)
committerMasayuki Satoh <miyabi.satoh@gmail.com>
Thu, 18 Sep 2014 02:40:27 +0000 (11:40 +0900)
Gefu.pro
filereadworker.cpp [new file with mode: 0644]
filereadworker.h [new file with mode: 0644]
mainwindow.cpp
mainwindow.h
panel.cpp
panel.h
panel.ui

index 12cd8a2..06a42d7 100644 (file)
--- a/Gefu.pro
+++ b/Gefu.pro
@@ -39,7 +39,8 @@ SOURCES += main.cpp\
     thumbnailview.cpp \
     thumbnaildelegate.cpp \
     thumbnailworker.cpp \
-    folderview_private.cpp
+    folderview_private.cpp \
+    filereadworker.cpp
 
 HEADERS  += mainwindow.h \
     renamesingledialog.h \
@@ -70,7 +71,8 @@ HEADERS  += mainwindow.h \
     thumbnaildelegate.h \
     thumbnailworker.h \
     folderview_private.h \
-    operationworker.h
+    operationworker.h \
+    filereadworker.h
 
 FORMS    += mainwindow.ui \
     renamesingledialog.ui \
diff --git a/filereadworker.cpp b/filereadworker.cpp
new file mode 100644 (file)
index 0000000..cdd1393
--- /dev/null
@@ -0,0 +1,47 @@
+#include "filereadworker.h"
+
+#include <QDebug>
+#include <QThread>
+
+FileReadWorker::FileReadWorker() :
+    AbstractWorker(),
+    m_file()
+{
+}
+
+FileReadWorker::~FileReadWorker()
+{
+    qDebug() << "FileReadWorker::~FileReadWorker()---------------------------";
+}
+
+bool FileReadWorker::open(const QString &path)
+{
+    m_file.setFileName(path);
+    return m_file.open(QIODevice::ReadOnly);
+}
+
+void FileReadWorker::run()
+{
+    if (!m_file.isOpen()) {
+        emit finished();
+        return;
+    }
+
+    emit size(m_file.size());
+
+    QByteArray data;
+    while (!m_file.atEnd()) {
+        this->thread()->msleep(1);
+        if (isAborted()) {
+            emit finished(true);
+            m_file.close();
+            return;
+        }
+
+        data.append(m_file.read(2048));
+        emit progress(data.size());
+    }
+
+    emit resultReady(data);
+    emit finished();
+}
diff --git a/filereadworker.h b/filereadworker.h
new file mode 100644 (file)
index 0000000..2487c14
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef FILEREADWORKER_H
+#define FILEREADWORKER_H
+
+#include "abstractworker.h"
+
+#include <QFile>
+
+class FileReadWorker : public AbstractWorker
+{
+    Q_OBJECT
+public:
+    explicit FileReadWorker();
+    ~FileReadWorker();
+
+    bool    open(const QString &path);
+
+private:
+    QFile   m_file;
+
+signals:
+    void    size(int value);
+    void    progress(int value);
+    void    resultReady(const QByteArray &data);
+
+public slots:
+
+    // AbstractWorker interface
+public slots:
+    void run();
+};
+
+#endif // FILEREADWORKER_H
index aeeaebb..7b40268 100644 (file)
@@ -2111,6 +2111,11 @@ void MainWindow::updateActions()
         reconnectAction(ui->image_Rotate90, SIGNAL(triggered()), v, SLOT(rotate90()));\r
         reconnectAction(ui->image_Rotate180, SIGNAL(triggered()), v, SLOT(rotate180()));\r
     }\r
+    else if (w->objectName() == "progressBar") {\r
+        setEnabledAllActions(false);\r
+        toggleSearch = false;\r
+        isView = false;\r
+    }\r
 \r
     ui->toggle_Toolbar->blockSignals(true);\r
     ui->toggle_Toolbar->setChecked(ui->mainToolBar->isVisible());\r
index 363d2ea..542d46d 100644 (file)
@@ -103,7 +103,7 @@ public slots:
 private:\r
     typedef QList<QAction*> ActionList;\r
     enum Mode {\r
-        ModeBasic,      // 二画面モード\r
+        ModeBasic = 1,  // 二画面モード\r
         ModeFull,       // 単画面モード\r
         ModeView,       // ビューモード\r
         ModePreview,    // プレビューモード\r
index f1793fb..3482122 100644 (file)
--- a/panel.cpp
+++ b/panel.cpp
@@ -1,3 +1,4 @@
+#include "filereadworker.h"
 #include "foldermodel.h"
 #include "folderview.h"
 #include "mainwindow.h"
 ///
 Panel::Panel(QWidget *parent) :
     QWidget(parent),
-    ui(new Ui::Panel)
+    ui(new Ui::Panel),
+    m_worker()
 {
     ui->setupUi(this);
     ui->imageView->setVisible(false);
     ui->textView->setVisible(false);
+    ui->progressBar->setVisible(false);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -54,6 +57,7 @@ void Panel::initialize(MainWindow *w)
     ui->imageView->initialize(w);
     ui->folderPanel->initialize(w);
     ui->textView->initialize(w);
+    ui->progressBar->installEventFilter(w);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -88,6 +92,11 @@ void Panel::setViewItem(const QModelIndex &index)
 {
     qDebug() << "Panel::setViewItem()" << index;
 
+    if (m_worker) {
+        m_worker->abort();
+    }
+
+    ui->progressBar->setVisible(false);
     if (!index.isValid()) {
         ui->imageView->setVisible(false);
         ui->textView->setVisible(false);
@@ -105,26 +114,18 @@ void Panel::setViewItem(const QModelIndex &index)
         return;
     }
 
-    QPixmap pixmap(path);
-    if (!pixmap.isNull()) {
-        ui->imageView->setSource(pixmap);
-        ui->folderPanel->setVisible(false);
-        ui->textView->setVisible(false);
-        ui->imageView->setVisible(true);
-        return;
-    }
-
-    QFile file(path);
-    QByteArray data;
-    if (file.open(QIODevice::ReadOnly)) {
-        data = file.readAll();
-        file.close();
-    }
-
-    ui->textView->setSource(data);
-    ui->folderPanel->setVisible(false);
+    m_worker = new FileReadWorker();
+    connect(m_worker, SIGNAL(size(int)), ui->progressBar, SLOT(setMaximum(int)));
+    connect(m_worker, SIGNAL(progress(int)), ui->progressBar, SLOT(setValue(int)));
+    connect(m_worker, SIGNAL(resultReady(QByteArray)), this, SLOT(onReady(QByteArray)));
+    ui->progressBar->setValue(0);
+    ui->progressBar->setVisible(true);
     ui->imageView->setVisible(false);
-    ui->textView->setVisible(true);
+    ui->textView->setVisible(false);
+    ui->folderPanel->setVisible(false);
+
+    m_worker->open(path);
+    m_worker->start();
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -166,7 +167,37 @@ QWidget *Panel::visibleView() const
     if (ui->folderPanel->isVisible()) {
         return ui->folderPanel->itemView();
     }
+    if (ui->progressBar->isVisible()) {
+        return ui->progressBar;
+    }
 
     qDebug() << ">>>>>>>>>> visibleView() Logic error <<<<<<<<<<";
     return NULL;
 }
+
+///////////////////////////////////////////////////////////////////////////////
+/// \brief Panel::onReady
+/// \param data ファイルの内容
+///
+/// ファイルの内容を表示します。
+///
+void Panel::onReady(const QByteArray &data)
+{
+    ui->progressBar->setVisible(false);
+
+    QPixmap pixmap;
+    if (pixmap.loadFromData(data)) {
+        ui->imageView->setSource(pixmap);
+        ui->folderPanel->setVisible(false);
+        ui->textView->setVisible(false);
+        ui->imageView->setVisible(true);
+        ui->imageView->setFocus();
+        return;
+    }
+
+    ui->textView->setSource(data);
+    ui->folderPanel->setVisible(false);
+    ui->imageView->setVisible(false);
+    ui->textView->setVisible(true);
+    ui->textView->setFocus();
+}
diff --git a/panel.h b/panel.h
index 2c6bb54..bfb0a64 100644 (file)
--- a/panel.h
+++ b/panel.h
@@ -3,7 +3,9 @@
 
 #include <QWidget>
 #include <QModelIndex>
+#include <QPointer>
 class MainWindow;
+class FileReadWorker;
 class FolderPanel;
 class FolderModel;
 class Preferences;
@@ -30,6 +32,11 @@ public:
 
 private:
     Ui::Panel *ui;
+    QPointer<FileReadWorker> m_worker;
+
+public slots:
+    void    onReady(const QByteArray &data);
+
 };
 
 #endif // PANEL_H
index 7d3d7b2..d51761f 100644 (file)
--- a/panel.ui
+++ b/panel.ui
     <widget class="FolderPanel" name="folderPanel" native="true"/>
    </item>
    <item>
+    <widget class="QProgressBar" name="progressBar">
+     <property name="value">
+      <number>24</number>
+     </property>
+    </widget>
+   </item>
+   <item>
     <widget class="SimpleImageView" name="imageView"/>
    </item>
   </layout>