Qt 5 中的 C++11 线程
C++11 thread in qt 5
//MainWindow.cpp
void MainWindow::threadedFunction()
{
myDialog = new MyDialogs(list,processList,this);
myDialog->show();
}
void MainWindow::createNewDialog()
{
getProcesses();
//threadedFunction(); //This works fine.
std::thread tx = std::thread(&MainWindow::threadedFunction,this);
tx.join();
}
//MyDialog.cpp
MyDialogs::MyDialogs(QList<int> lists,QStringList list,QObject *parent):QDialog(0)
{
QVBoxLayout *toplay = new QVBoxLayout(this);
listWidget = new QListWidget(this);
x<<list;
l<<lists;
listWidget->addItems(x);
toplay->addWidget(listWidget);
connect(listWidget,SIGNAL(doubleClicked(QModelIndex)),
this,SLOT(getProcessString(QModelIndex)));
}
void MyDialogs::getProcessString(QModelIndex index)
{
selectedProcessString = index.data().toString();
rowIndex = index.row();
}
已经在专业文件中设置。
CONFIG += c++11
当我直接调用线程函数时,代码工作正常。但是上面提到的代码给了我运行时错误。如果我在 threadedFunction 中只使用 qDebug 语句并删除 myDialog 代码,那么即使使用线程,代码也能正常运行。问题出在哪里?我正在使用带有 MingW 4.9.1 32 位的 Qt5。而且我没有安装Visual Studio。
问题是您正在尝试在 GUI 线程之外创建 UI 对象。我假设您的 main
函数实例化了一个启动事件循环的 QApplication
对象。此线程是您唯一的 GUI 线程。我猜您的 GUI 线程是创建尝试实例化QListWidget
线程的线程。
如果我的假设是正确的,那么您需要在主/GUI 线程中创建QListWidget
,然后调用线程函数。我不能说你应该在你的线程函数中做什么,因为我不确定你想做什么,但有多种方法可以处理它。
你可能想看看QThread
.该类将允许您使用信号和插槽,这可能会使您更轻松。您可以使用传统的线程构造(例如,互斥锁、等待条件等(和共享状态。还有一些方法可以发布通过消息循环的事件(即被发送回主/GUI 线程(。
相关文章:
- 具有 C++11 多线程的特征库
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- C++11:将矢量元素作为线程传递到线程函数中
- DirectX 11 -- Hello Triangle 未呈现 -- 原因:运行时库C++多线程
- 终止读取时阻止的线程 c++11
- C++11如何在1个线程中使用条件变量处理2个线程安全队列
- C++11 - 可以等待多个不同事件的线程?
- 将字符串指针传递到C++和Xcode 11.1中不同线程上运行的函数
- 多线程 C++11 应用程序中的同步
- std::线程与 pthread_setschedparam 与 C++ 11.
- C++ 11 thread_local和"外来"线程
- C++ 11 线程在分离后会自动销毁吗?
- Valgrind 检查简单多线程 C++11 得到 SIG11 错误
- Boost::线程 / C++11 std::thread,想要唤醒工作线程的条件
- c++将各种参数传递给父类构造函数(线程c++11)
- 线程c++11标准和Netbeans/其他IDE
- 多线程c++11-ish队列在windows上失败
- 在多线程c++ 11程序中,当异常未处理时会发生什么
- 分段故障多线程C++11