11.QWidget::repaint和QWidget::update的区别?
这个类似于sendEvent和postEvent.QWidget::repaint会导致QWidget立即重画,QWidget::update只是产生一个QPaint事件并调用postEvent将其放入posted event队列,等待消息循环检查到有事件后再执行。因此要尽量使用QWidget::update,绘图操作是比较消息耗CPU时间。
12.能给其它进程的QWidget发消息?
不能,QT Embeded是一个简单的图形系统,不能像Win32/MFC那样通过EnumWindows/FindWindow查找整个系统的window,不能通过sendMessaget给其它进程的window发消息。虽然topLevelWidget->winId()也是唯一的,但是不同进程的widget是互相不知道的。在QT Embeded上没有类似spy++的工具。
13.QT Embeded是否支持多进程多线程?
支持多进程,编译时由QT_NO_QWS_MULTIPROCESS来控制。有些嵌入式环境下没必要支持多进程,可以只有一个QT进程,即做QWS Server,又做QWS Client。这样编译出来的共享库会小一些,程序执行起来也快。
支持多线程,编译时由QT_THREAD_SUPPORT来控制,QT Embeded还定义了QMutex、QSemaphore、QThread等类支持多线程,实现线程之间的通讯。QThread本身是pthread库的一个封库。
14.QT Embeded是否线程安全?
C++的类库一般都不是线程安全的,QT Embeded也不例外,其的绝大多数函数和类都不是线程安全,线程安全需要用户自已保证。QApplication提供一个锁,用户可以qapp->lock()/unlock()来保护代码或自已定义QMutex。
15.既然QT Embeded线程不安全,线程如何给widget发消息?
可以通过QThread::postEvent给widget发消息,QThread::postEvent实际调用QApplication::postEvent来实现的,QApplication::postEvent是线程安全,它通过postevent_mutex来保护posted event队列。将消息加入到posted event队列后,会唤醒主线程执行消息循环,从而保证新加入的消息有机会被执行。
阅读(1739) | 评论(0) | 转发(0) |