Qt的界面线程 和Mfc 一点不一样的地方
2013-11-28 12:13
441 查看
首先本人对Qt不是太了解,但是不想仅仅停留在用的角度上。
开发平台:windows
由于软件要写成多线程版本的,界面会用到MFC,QT,或者没有界面只是控制台。
我当时想的是:
但是我在QT的界面上卡住了,由于我不想用QT的线程,我想在底层上用win32的线程处理好了,再用MFC和QT用,毕竟我只用他们来写界面。
上午的时间好气人,我在一个Qt的群里面讨论我说了下思路: 创建线程的时候传递一个Qt的类参数。有个人说 win32 + qt是二逼的设计,当场老子控制不住了 你以为自己会用Qt就了不起了,Qt还不是封装的win32的API,还叫我用开源的线程库 我挺无语的!当场退了这个群,和这种人在一块,智商会变低!
我操,还偷偷看老子的空间,难道这是要报复的节奏?
算了不说了,说下QT界面 和MFC界面上线程的一点区别,原理性的我不清楚,目前能找到的线索,我先列出来!
Qt方案:
这是一个简单的测试。我想在线程中 让进度条 走动
测试内部线程 是:在Qt的这个界面中 创建一个win32 线程,将界面的指针传过去,在新的线程函数中 处理进度条。但是这样出问题了,错误提示如下
大致意思 是界面线程 和新的线程 不在一个线程中 不能操作。那就输出下线程ID吧:
果然不一样
刚开始有点疑惑,因为在MFC下不会出现这种情况,也许是还没有从MFC的思路中走出来吧?但是问题还是要解决的要不然 完不成任务。
间接线程:这个是我想的另一个解决方案。
我创建了另一个集成QObject的子类:
下面我们看MFC的:
MFC的代码太多了,就不贴了,思路和QT的方案1 一样。
先输出 线程的ID吧
虽然底层原理 我不是太明白,但是起码 我想知道为什么。而不是说 一看win32+ QT 就是二逼的设计。
上面的事 就献给和我一样 闲的蛋疼的人吧!
开发平台:windows
由于软件要写成多线程版本的,界面会用到MFC,QT,或者没有界面只是控制台。
我当时想的是:
底层API + MFC 底层API + QT 底层API + 控制台
但是我在QT的界面上卡住了,由于我不想用QT的线程,我想在底层上用win32的线程处理好了,再用MFC和QT用,毕竟我只用他们来写界面。
上午的时间好气人,我在一个Qt的群里面讨论我说了下思路: 创建线程的时候传递一个Qt的类参数。有个人说 win32 + qt是二逼的设计,当场老子控制不住了 你以为自己会用Qt就了不起了,Qt还不是封装的win32的API,还叫我用开源的线程库 我挺无语的!当场退了这个群,和这种人在一块,智商会变低!
我操,还偷偷看老子的空间,难道这是要报复的节奏?
算了不说了,说下QT界面 和MFC界面上线程的一点区别,原理性的我不清楚,目前能找到的线索,我先列出来!
Qt方案:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <windows.h> #include <QDebug> #include "myobject.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); static int threadFunc(void* _data); signals: void start(); private slots: void on_pushButton_clicked(); void on_pushButton_2_clicked(); void Run(); void Run(int pos); void on_pushButton_3_clicked(); private: MyObject obj; Ui::MainWindow *ui; HANDLE thread; bool bExit; }; #endif // MAINWINDOW_H
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); bExit = false; connect(this,SIGNAL(start()),this,SLOT(Run())); connect(&obj,SIGNAL(start(int)),this,SLOT(Run(int))); } MainWindow::~MainWindow() { delete ui; } void MainWindow::Run(int pos){ ui->progressBar->setValue(pos); qDebug()<<GetCurrentThreadId()<<endl; } void MainWindow::Run(){ while(!bExit) { for(int i=0;i<100;i++){ ui->progressBar->setValue(i); Sleep(1000); } } qDebug()<<GetCurrentThreadId()<<endl; } int MainWindow::threadFunc(void* _data){ MainWindow* m = (MainWindow*)_data; m->Run(); return 0; } void MainWindow::on_pushButton_clicked() { thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadFunc,this,0,0); qDebug()<<GetCurrentThreadId(); } void MainWindow::on_pushButton_2_clicked() { bExit= true; } void MainWindow::on_pushButton_3_clicked() { obj.Start(); }
这是一个简单的测试。我想在线程中 让进度条 走动
测试内部线程 是:在Qt的这个界面中 创建一个win32 线程,将界面的指针传过去,在新的线程函数中 处理进度条。但是这样出问题了,错误提示如下
大致意思 是界面线程 和新的线程 不在一个线程中 不能操作。那就输出下线程ID吧:
主线程:6196 副线程:7199
果然不一样
刚开始有点疑惑,因为在MFC下不会出现这种情况,也许是还没有从MFC的思路中走出来吧?但是问题还是要解决的要不然 完不成任务。
间接线程:这个是我想的另一个解决方案。
我创建了另一个集成QObject的子类:
#ifndef MYOBJECT_H #define MYOBJECT_H #include <QObject> #include <Windows.h> class MyObject : public QObject { Q_OBJECT public: explicit MyObject(QObject *parent = 0); signals: void start(int pos); public: void Start(); HANDLE thread; static int mythread(void* data); public slots: }; #endif // MYOBJECT_H
#include "myobject.h" MyObject::MyObject(QObject *parent) : QObject(parent) { } int MyObject::mythread(void* data) { MyObject* obj = (MyObject*)data; for(int i=0;i<1000;i++){ emit obj->start(i); } return 0; } void MyObject::Start(){ thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)mythread,this,0,0); }中间类中 有一个信号 和主界面的槽链接,我在这个中间类中创建一个WIN32 线程,在线程函数中 发送信号 给主界面的槽。oK没有问题。程序没有报错;看来QT的界面操作必须要在一个线程中,才可以吗?求高人指点!
下面我们看MFC的:
MFC的代码太多了,就不贴了,思路和QT的方案1 一样。
先输出 线程的ID吧
副线程9632 主线程9596主要代码:
void CthreadtestDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadfunc,this,0,0); TRACE("主线程%d\n",GetCurrentThreadId()); } int CthreadtestDlg::threadfunc(void* data){ TRACE("副线程%d\n",GetCurrentThreadId()); CthreadtestDlg* dlg = (CthreadtestDlg*)data; dlg->Run(); return 0; } void CthreadtestDlg::Run(){ for(int i=0;i<100;i++) m_progress.SetPos(i); }但是在 MFC上没有出现问题。不知道为什么?
虽然底层原理 我不是太明白,但是起码 我想知道为什么。而不是说 一看win32+ QT 就是二逼的设计。
上面的事 就献给和我一样 闲的蛋疼的人吧!
相关文章推荐
- 关于指针的一些事情
- QT学习 第一章:基本对话框
- 使用Shiboken为C++和Qt库创建Python绑定
- C/C++数据对齐详细解析
- C++中引用的使用总结
- C++中引用(&)的用法与应用实例分析
- Visual C++中MFC消息的分类
- 解析C++ 浮点数的格式化输出
- 深入分析C++中几个最不常用的关键字
- c++中inline的用法分析
- 深入解析C++ Data Member内存布局
- 从汇编看c++中默认构造函数的使用分析
- 关于C++中的友元函数的一些总结
- C++的sstream标准库详细介绍
- 基于C++自动化编译工具的使用详解
- 浅谈C++中的string 类型占几个字节
- C/C++ 宏详细解析
- 深入分析C++中两个大数相乘结果不正确的问题
- 探讨C++中数组名与指针的用法比较分析
- 深入解析C++中的引用类型