OpenMP, QTextEdit and QPlainTextEdit
OpenMP, QTextEdit and 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中修改其他线程的文本,而且我正在使用带有Qt的OpenMP。
有人能告诉我在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 )
问题是在主线程之外的线程中访问Qt GUI对象。
发件人http://doc.qt.io/qt-4.8/threads-qobject.html
尽管QObject是可重入的,但是GUI类,特别是QWidget和它的所有子类都不是可重入的。它们只能从主线程。
解决这一问题的一种方法是使用Qt信号/插槽,使用QueuedConnection将来自工作线程的信号连接到主线程中的插槽,但在您的情况下,我认为这没有多大意义。即使你得到了使用openmp的信号,你也无法以并行的方式将字符串附加到QPlainTextEdit,这将提高性能。
我成功地做到了,我认为它一定比连接插槽简单一点。
在我的qt_mainwindow.h中,我只是添加了
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();
}
}
好吧,我尽可能多地尝试了一下,但没有失败,但我想知道我是否做得正确
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- python ctypes and C++ pointers
- C++ const char with .begin() and .end()
- Threads with Classes and std::packaged_task
- OpenMP, QTextEdit and QPlainTextEdit