2015-07-04 4 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 i ok я добавил источник и заметьте, что я делаю 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

Смежные вопросы