2015-07-04 26 views
1

亂投醫,我知道和好以後即使添加OpenMP的,和的QTextEdit QPlainTextEdit

QT_MainWindow::QT_MainWindow(QWidget *parent) :QMainWindow(parent), ui(new Ui::QT_MainWindow) 
{ 
    ui->setupUi(this); 
    qRegisterMetaType<QTextCursor>("QTextCursor"); 
    qRegisterMetaType<QTextBlock>("QTextBlock"); 
} 

要我的源代碼,我仍然不能修改其他線程中的文本都的QTextEdit和QPlainTextEdit也是我使用OpenMP的使用Qt的。

誰能告訴我什麼是修改從的QTextEdit和QPlainTextEdit其他線程文本,因爲我沒能找到任何東西來幫助我

在這裏,正確的做法是我的源:

void QT_MainWindow::Load() 
{ 
    ui->QT_PlainTextEdit->setPlainText(""); 

    std::ifstream file("File.txt"); 
    std::string line; 
    #pragma omp parallel 
    { 
    while (std::getline(file, line)) 

    ui->QT_PlainTextEdit->appendPlainText(QString::fromStdString(line)); 

    file.close(); 
    } 
} 

我設法得到它的工作只有這樣

void QT_MainWindow::Load() 
{ 
    omp_set_dynamic(0); 
    omp_set_nested(3); 
    #pragma omp parallel num_threads(3) 
    { 
     ui->QT_PlainTextEdit->setPlainText(""); 
    } 
} 

但如果我嘗試設置文本

void QT_MainWindow::Load() 
{ 
    omp_set_dynamic(0); 
    omp_set_nested(3); 
    #pragma omp parallel num_threads(3) 
    { 
     ui->QT_PlainTextEdit->setPlainText("TEST"); 
    } 
} 

我得到這個錯誤

QObject: Cannot create children for a parent that is in a different thread. 
(Parent is QTextDocument(0x3bbc758), parent's thread is QThread(0x3bd140), current thread is QThread(0x3bbcb68) 
The program has unexpectedly finished. 

QObject: Cannot create children for a parent that is in a different thread. 
(Parent is QTextDocument(0x465bfc0), parent's thread is QThread(0x3f3ad60), current thread is QThread(0x466d450)QObject: Cannot create children for a parent that is in a different thread. 
(Parent is QTextDocument(0x465bfc0), parent's thread is QThread(0x3f3ad60), current thread is QThread(0x46eebe0)HEAP[app.exe]: 
Invalid address specified to RtlFreeHeap(00000000023F0000, 0000000003F3DC40) 
+0

這將是很好的附加一些來源,這是很難說... –

+0

好吧堅持我會在一個位 – POQDavid

+0

@RobertWadowsk我確定我添加了源代碼,並注意我在執行任何操作之前先執行qRegisterMetaType – POQDavid

回答

5

的問題是,你正在訪問比主線程的線程上的Qt GUI對象。

http://doc.qt.io/qt-4.8/threads-qobject.html

儘管QObject的是可重入的GUI類,特別是QWidget的和 所有它的子類,是不可重入。它們只能從 主線程使用。

解決這個問題的一個方法是使用Qt信號/插槽將工作線程中的信號通過QueuedConnection連接到主線程中的插槽,但在您的情況下,我認爲這沒什麼意義。即使你獲得了使用openmp的信號,你也將無法以並行方式將字符串追加到QPlainTextEdit中,從而提高性能。

0

嗯,我設法做到了,我認爲它一定比連接插槽簡單一些。

我qt_mainwindow.hi

簡單地添加

public slots: 
    void QT_PlainTextEdit_appendPlainText(QString line); 
    void QT_PlainTextEdit_SetText(QString line); 

,並在我的qt_mainwindow.cpp我得到這個線

void QT_MainWindow::QT_PlainTextEdit_appendPlainText(QString line) 
{ 
    ui->QT_PlainTextEdit->appendPlainText(line); 
} 

void QT_MainWindow::QT_PlainTextEdit_SetText(QString line) 
{ 
    ui->QT_PlainTextEdit->setPlainText(line); 
} 

void QT_MainWindow::Load() 
{ 
    #pragma omp parallel num_threads(1) 
    { 
     std::ifstream file("file.txt"); 
     std::string line; 

     while (std::getline(file, line)) 
      QMetaObject::invokeMethod(this,"QT_PlainTextEdit_appendPlainText",Qt::QueuedConnection,Q_ARG(QString,QString::fromStdString(line))); 
     file.close(); 
    } 
} 

嗯,我嘗試了儘可能多的可能,並沒有失敗,但我想知道我是否做得正確

+0

@drescherjm所以你怎麼看待這個? – POQDavid

+0

對我來說更好,但我仍然認爲這應該以qt方式完成(至少在我看來) –

+0

@RobertWadowski所以你說這是正確的?我不能相信它 – POQDavid