QT–线程

每个程序启动后就会拥有一个线程。该线程称为”主线程”(在Qt应用程序中也叫”GUI线程”)。Qt GUI必须运行在此线程上。所有的图形元件和几个相关的类,如QPixmap,不能工作于非主线程中。非主线程通常称为”工作者线程”,因为它主要处理从主线程中卸下的一些工作。如数据的同步访问。

QT线程工作原理

A QThread object manages one thread of control within the program. QThreads begin executing in run(). By default, run() starts the event loop by calling exec() and runs a Qt event loop inside the thread

run函数–The starting point for the thread. After calling start(), the newly created thread calls this function. The default implementation simply calls exec().

It is important to remember that a QThread instance lives in the old thread that instantiated it, not in the new thread ** that calls run(). **This means that all of QThread’s queued slots will execute in the old thread. Thus, a developer who wishes to invoke slots in the new thread must use the worker-object approach(因此,希望调用新线程中的插槽的开发人员必须使用worker-object方法;不应将新插槽直接实现到子类QThread中。); new slots should not be implemented directly into a subclassed QThread.

When subclassing QThread,** keep in mind that the constructor executes in the old thread while run() executes in the new thread.(QThread只有run函数是在新线程里的,其他所有函数都在QThread生成的线程里)** If a member variable is accessed from both functions, then the variable is accessed from two different threads. Check that it is safe to do so.
上面是Qt 官方文档,
如果QThread是在ui所在的线程里生成,那么QThread的其他非run函数都是和ui线程一样的,所以,QThread的继承类的其他函数尽量别要有太耗时的操作,要确保所有耗时的操作都在run函数里。
在UI线程下调用QThread的非run函数(其实也不应该直接调用run函数,而应该使用start函数),和执行普通函数无区别,这时,如果这个函数要对QThread的某个变量进行变更,而这个变量在run函数里也会被用到,这时就需要注意加锁的问题,因为可能这个变量前几毫秒刚刚在run中调用,再调用时已经被另外的线程修改了。

0

QT-QDailog

QDailog 与QWidgets的区别

QWidget

   1、指定父窗口的时候,不调用QWidget::show(),嵌套在父窗口中显示,与其它窗口共用消息循环。
   2、指定父窗口的时候,调用QWidget::show(),仍然嵌套在父窗口中显示,与其它窗口共用消息循环。
   3、不指定父窗口的时候,调用QWidget::show(),以顶级窗口方式显示,与其它窗口共用消息循环。
   4、不能以模态窗口方式显示,没有exe()函数。
  QDailog继承至QWidget
=======
   1、指定父窗口的时候,不调用QWidget::show(),不显示窗口。
   2、指定父窗口的时候,调用QWidget::show(),以顶级窗口方式显示,与其它窗口共用消息循环。
   3、不指定父窗口的时候,调用QWidget::show(),以顶级窗口方式显示,与其它窗口共用消息循环。
   4、模态窗口显示,,调用QDailog::exec(),屏蔽其它窗口消息循环。

注意:简单来看,如果想以模式窗口显示,继承QDailog,调用QDailog::exec()即可。

QFileDialog类——》打开文件夹文件类,
QMessegBox类—-》提示,警告,疑问框

类继承关系:

0