有那位在闲鱼ipad版下载139雪糕买过ipad2平板电脑,请给指点139雪糕的东西好不好恭候各位赐教

帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:2&分页:^_^发信人: khing (^_^), 信区: KDE_Qt
标&&题: 直接调用qt的signal函数会怎样?
发信站: 水木社区 (Tue Sep 28 11:23:13 2010), 站内 && 【 以下文字转载自 LinuxDev 讨论区 】
发信人: khing (^_^), 信区: LinuxDev
标&&题: 直接调用qt的signal函数会怎样?
发信站: 水木社区 (Tue Sep 28 09:14:21 2010), 站内 && 在看别人的代码,发现有个地方直接调用signal函数,而且这个函数只有声明,没实现。 && 彻底晕了 &&&& 代码大概如下: && 1. 声明
Q_SIGNALS: &&&& void commitText (const TextPointer &text); && 2. 初始化函数里
connect (m_context, SIGNAL (commitText (const TextPointer &)), &&&&&&&&&&this, SLOT (slotCommitText (const TextPointer &))); && 3. 然后在slot函数 slotCommitText 里面调用了commitText !!!
InputContext::slotCommitText(const QDBusVariant &text)
{ &&&& commitText (qDBusVariantToSerializable&Text& (text));&&&&
} && 谁能告诉我为什么这样也行?调用这个没实现的signal函数后发生了什么?? && -- && ※ 来源:·水木社区 newsmth.net·[FROM: 192.102.204.*]
堕落,从昨天开始……发信人: imzhdb (堕落,从昨天开始……), 信区: KDE_Qt
标&&题: Re: 直接调用qt的signal函数会怎样? (转载)
发信站: 水木社区 (Tue Sep 28 12:19:21 2010), 站内 && signals 就是一个普通的函数,emit 是一个宏,
#define emit&&&& signals 的实现由moc自动生成,打开你的 moc_xxxx.cpp 或 xxx.moc 即可看到
【 在 khing (^_^) 的大作中提到: 】
: 发信人: khing (^_^), 信区: LinuxDev
: 标&&题: 直接调用qt的signal函数会怎样?
: 发信站: 水木社区 (Tue Sep 28 09:14:21 2010), 站内
: ...................
&& -- && ※ 来源:·水木社区 ·[FROM: 114.255.30.*]
文章数:2&分页:
抽奖到手软!将狂欢进行到底!1252人阅读
Qt事件和信号的区别
&&&&什么时候用事件,什么时候用信号呢?是不是不同的线程间用事件,信号不能用在线程间?
&&&&仔细来看,事件与信号其实并无多大差别,从我们对其需求上来说,都只要能注册事件或信号响应函数,在事件或信号产生时能够被通知到即可。但有一项区别在 于,事件处理函数的返回值是有意义的,我们要根据这个返回值来确定是否还要继续事件的处理,比如在QT中,事件处理函数如果返回true,则这个事件处理 已完成,QApplication会接着处理下一个事件,而如果返回false,那么事件分派函数会继续向上寻找下一个可以处理该事件的注册方法。信号处 理函数的返回值对信号分派器来说是无意义的。
&&&&另外还有一个需要我们关注的问题是事件和信号处理时的优先级问题。在QT中,事件因为都是与窗口相关的,所以事件回调时都是从当前窗口开始,一级一级向上 派发,直到有一个窗口返回true,截断了事件的处理为止。对于信号的处理则比较简单,默认是没有顺序的,如果需要明确的顺序,可以在信号注册时显示地指 明槽的位置。
&&&&在QT中,事件使用了一个事件队列来维护,如果事件的处理中又产生了新的事件,那么新的事件会加入到队列尾,直到当前事件处理完毕后, QApplication再去队列头取下一个事件来处理。而信号的处理方式有些不同,信号处理是立即回调的,也就是一个信号产生后,他上面所注册的所有槽 都会立即被回调。这样就会产生一个递归调用的问题,比如某个信号处理器中又产生了一个信号,会使得信号的处理像一棵树一样的展开。
评价:实际上信号-槽也可以异步的,这个bool&&(
const QObject *&sender, const char *&signal,
const QObject *&receiver, const char *&method,
Qt::ConnectionType&type&= Qt::AutoCompatConnection )
里面的Qt::AutoCompatConnection,可以根据实际情况确定
一个问题:QT里用线程,主线程是GUI,次线程是工作线程,如果次线程里也用消息循环(exec),即,主/次间用signal-slot通讯来实现同步,在这种情况下, 1.主线程会被次线程block吗? 2.如果在单cpu里会被block吗,如果次线程里不断循环,低层会自动分配时间片给主线程吗?
3.这种方法和直接调用次线程中的方法,用mutex之类的来实现类似的循环,效率差别大吗?记得QT里讲过signal-slot只是多几个函数调用的差别。主次线程中怎样通讯比较有效?
现在默认状态下就是有一个消息循环的,而且鼓励使用线程独立的消息循环 1.主线程会被次线程block吗? 不会,QObject::connectd的最后一个参数()
默认使用Qt::AutoConnection, 在多线程环境下,会自动选择Qt::QueuedConnection方式,除非强制使用Qt::BlockingQueuedConnection或者
Qt::DirectConnection, 否则线程不会block. 2.如果在单cpu里会被block吗,如果次线程里不断循环,低层会自动分配时间片给主线程吗? 线程和CPU个数没有关系,当然CPU多了,运行会更加流程,线程的资源分配(时间片)是由操作系统管理的,在各个系统上都是如此 3.这种方法和直接调用次线程中的方法,用mutex之类的来实现类似的循环,效率差别大吗? 执行效率上很难讲,但是mutex肯定是带来了开发效率的降低,你得小心翼翼地处理好各种临界资源的锁问题 4. 记得QT里讲过signal-slot只是多几个函数调用的差别
是的,signal-slot的这种轻微的效率损失在绝大多数情况下不是问题,除非过度使用,这一般是设计上的错误导致的 分享两篇文章,讲QThread和Qt的signal-slot的: 1篇是qt labs的博客上一篇 You are doing it wrong...(),
这篇文章很有意思,其实很多人不知道原来QThread还可以这样用。 另外一篇是关于怎么利用Qt的signal-slot机制和QThread进行完全的lock free编程()
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:298535次
积分:6378
积分:6378
排名:第2880名
原创:342篇
转载:54篇
评论:13条
(10)(4)(28)(5)(16)(85)(47)(3)(18)(20)(23)(1)(5)(19)(32)(18)(8)(16)(18)(2)(9)(10)QT 的signal和slot - QT开发当前位置:& &&&QT 的signal和slotQT 的signal和slot&&网友分享于:&&浏览:0次QT 的signal和slot求助本帖最后由 flight24 于
12:29:00 编辑
mainwindow.h
#ifndef&MAINWINDOW_H
#define&MAINWINDOW_H
#include&&QMainWindow&
namespace&Ui&{
class&MainW
class&MainWindow&:&public&QMainWindow
&&&&Q_OBJECT
&&&&explicit&MainWindow(QWidget&*parent&=&0);
&&&&~MainWindow();
&&&&void&newThread();
&&&&Ui::MainWindow&*
public&slots:
&&&&void&a(int);
&&&&void&b();
#endif&//&MAINWINDOW_H
myThread.h
#ifndef&MYTHREAD_H
#define&MYTHREAD_H
#include&&QThread&
#include&&QApplication&
class&myThread:public&QThread
&&&&myThread();
protected:
&&&&void&run();
&&&&void&aaa(int);
&&&&void&bbb();
void&myThread::run()
&&&&while(true){
&&&&&&emit&aaa(1);
myThread::myThread&()
#endif&//&MYTHREAD_H
#include&"mainwindow.h"
#include&&QApplication&
int&main(int&argc,&char&*argv[])
&&&&QApplication&a(argc,&argv);
&&&&MainWindow&w;
&&&&w.show();
&&&&return&a.exec();
mainwindow.cpp
#include&"mainwindow.h"
#include&"ui_mainwindow.h"
#include&"myThread.h"
MainWindow::MainWindow(QWidget&*parent)&:
&&&&QMainWindow(parent),
&&&&ui(new&Ui::MainWindow)
&&&&ui-&setupUi(this);
&&&&myThread*&tmp&=&new&myT
&&&&QObject::connect(tmp,SIGNAL(aaa(int)),this,SLOT(a(int)));
&&&&tmp-&start();
MainWindow::~MainWindow()
&&&&delete&
void&MainWindow::a(int)
&&&&ui-&textBrowser-&append("q");
这样写有什么错吗?实在不解啊。。编译都过不去------解决方案--------------------myThread类也要有Q_OBJECT,才能使用信号槽------解决方案--------------------自定义的线程类加上&Q_OBJECT------解决方案--------------------引用:Quote: 引用:
你的自定义类里没有加上Q_OBJECT宏,
只有加上这个宏才可以使用qt的信号槽机制,
加了之后报这个错
mainwindow.obj:-1:&error:&LNK2001:&无法解析的外部符号&"public:&virtual&struct&QMetaObject&const&*&__cdecl&myThread::metaObject(void)const&"&(@@UEBAPEBUQMetaObject@@XZ)
http://blog.csdn.net/yuzhiyuxia/article/details/7844595
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有第一回 Signal和Slot是同步的还是异步的?
  我们知道Qt以他的signal和slot机制独步天下。但大家在用的时候有没有注意过,signal和slot之间是异步的,还是同步的呢?为此我问过不少使用Qt的道友。有人说是同步的,有人说是异步的,也有人说要看当时你的人品。:( #$%^&*
  为此贫道,特别做了以下几个测试:
&&&& First,在main()主函数里,设置两个基于QObject为父类的对象a和b,a触发signal,b接受signal。请看具体案例:
1 class MyTestA : public QObject
void emitSignal()
signalMyTestA();
10 public slots:
void slotMyTestA()
qDebug()&&&slotMyTestA is called.&;
15 signals:
void signalMyTestA();
19 class MyTestB : public QObject
22 public slots:
void slotMyTestB()
qDebug()&&&slotMyTestB is called.&;
27 signals:
void signalMyTestB();
31 int main(int argc, char *argv[])
QApplication app(argc, argv);
QObject::connect(&a,SIGNAL(signalMyTestA()),&b,SLOT(slotMyTestB()));
a.emitSignal();
return app.exec();
在slotMyTestB的函数里打个断点,看一下调用堆栈(call stack)。
是同步调用的,某些道友开始拈胡微笑,实践出真知啊。
此时只见东方黑云滚滚,电闪雷鸣,又有道友开始度劫了。突然一度劫道友横眉冷对,拿起拂尘刷刷的改写了上面的代码。只见此道友把a对象挪到了一个新线程中(MyTestC创建的),而b对象仍然在主线程中。然后a对象触发信号。
MyTestA : public
&&&&Q_OBJECT
emitSignal()
&&&&&&&&signalMyTestA();
slotMyTestA()
&&&&&&&&qDebug()&&&slotMyTestA is called.&;
signalMyTestA();
MyTestB : public
&&&&Q_OBJECT
slotMyTestB()
&&&&&&&&qDebug()&&&slotMyTestB is called.&;
signalMyTestB();
MyTestB *g_pMyTestB;
MyTestC : public
&&&&Q_OBJECT
&&&&&&&&MyTestA
&&&&&&&&connect(&a,SIGNAL(signalMyTestA()),g_pMyTestB,SLOT(slotMyTestB()));
&&&&&&&&a.emitSignal();
&&&&&&&&exec();
slotMyTestC()
&&&&&&&&qDebug()&&&slotMyTestC is called.&;
signalMyTestC();
MyTest : public
&&&&Q_OBJECT
&&&&MyTest(QWidget *parent = 0, Qt::WFlags flags = 0);
&&&&~MyTest();
&&&&Ui::MyTestC
MyTestB *g_pMyTestB = NULL;
main(int argc,
char *argv[])
&&&&QApplication app(argc, argv);
&&&&MyTestB
&&&&g_pMyTestB = &b;
&&&&MyTestC
&&&&c.start();
&&&&return
app.exec();
说时迟,那时快。在一道紫雷劈下之际,按下了F5。只见,此时的调用堆栈显示,
奇迹出现了,居然变成异步调用了。只见东方天空万道金光射下,在阵阵仙乐声中,传来朗朗之声:&贫道尘事已了,再无牵挂&。
难道Qt真的是靠人品的,或者Qt莫不是也是修仙道友,不日也将飞升。
在吾等众人膜拜加疑惑之时,只见飞升前辈,留下一条偈语。内事不决问百度,外事不决问谷歌。
吾等众人立刻搜寻,恍然大物。
原来signal和slot是异步调用还是同步调用,取决于对connect的设定。其实connect还有一个参数(Qt::ConnectionType),是它决定了是同步还是异步。以下是ConnectionType的定义
只不过,平常它有一个默认值Qt::AutoConnection,我们忽略了它。这时有道友问道,为何在AutoConnection模式下,有时是同步,有时是异步,莫非Auto就是人品代名词。
非也,其实Auto是这样规定的,
当sender和receiver在同一线程时,就是同步模式,而在不同线程时,则是异步模式。
众人皆曰善。
就在众人弹冠相庆之时,突然一道类似眼镜发出的寒光闪过,一个黑影渐渐清晰了起来。
他居然就是..................
青春永驻,十二年如一日的柯南君,他招牌式的磁性声音给众道友一晴天霹雳,“诸位以为这就是全部的真相吗?”
接着他刷刷的又改写了代码,在主线程中生成a,b两个对象,而a对象在新线程(MyTestC创建的)中触发信号。
MyTestA : public
&&&&Q_OBJECT
emitSignal()
&&&&&&&&signalMyTestA();
slotMyTestA()
&&&&&&&&qDebug()&&&slotMyTestA is called.&;
signalMyTestA();
MyTestB : public
&&&&Q_OBJECT
slotMyTestB()
&&&&&&&&qDebug()&&&slotMyTestB is called.&;
signalMyTestB();
MyTestB *g_pMyTestB;
MyTestA *g_pMyTestA;
MyTestC : public
&&&&Q_OBJECT
&&&&&&&&g_pMyTestA-&emitSignal();
&&&&&&&&exec();
slotMyTestC()
&&&&&&&&qDebug()&&&slotMyTestC is called.&;
signalMyTestC();
MyTestB *g_pMyTestB = NULL;
MyTestA *g_pMyTestA = NULL;
main(int argc,
char *argv[])
&&&&QApplication app(argc, argv);
&&&&MyTestA
&&&&g_pMyTestA = &a;
&&&&MyTestB
&&&&g_pMyTestB = &b;
&&&&QObject::connect(&a,SIGNAL(signalMyTestA()),&b,SLOT(slotMyTestB()));
&&&&MyTestC
&&&&c.start();
&&&&return
app.exec();
在众人疑惑的眼光中,此君淡定的按下了F5。只见调用堆栈(call stack)显示
众人皆惊呼,“Impossible”。a和b明明是属于一个线程的,为何会异步调用。此时我们熟悉的语录,又在耳边回响,是&我相信真相只有一个!!!&这句话吗?No,只见柯南君,优雅地挥了挥手指,&Nothing impossible&,从口中缓缓滑出。
。众人皆扑街,“有屁快放”。
此时柯南君缓缓从口袋中,摸出一张纸,抛向空中,然后转身离去。只见随风飘落的纸面上面摘录了这么一段Qt源代码,在Auto模式下,如果要同步调用,不仅要求sender和receiver是同一线程,而且sender触发的时候,所在的线程也要和receiver一致。
&&&&&&&&&&&
&&&&&&&&&&&if
((c-&connectionType == Qt::AutoConnection
&&&&&&&&&&&&&&&&&& (currentThreadData != sender-&d_func()-&threadData
&&&&&&&&&&&&&&&&&&&&|| receiver-&d_func()-&threadData != sender-&d_func()-&threadData))
&&&&&&&&&&&&&&&|| (c-&connectionType == Qt::QueuedConnection)) {
&&&&&&&&&&&&&&&queued_activate(sender, signal_absolute_index, c, argv ? argv : empty_argv);
&&&&&&&&&&&&&&&continue;
&&&&&&&&&&&}
if (c-&connectionType == Qt::BlockingQueuedConnection) {
&&&&&&&&&&&&&&&blocking_activate(sender, signal_absolute_index, c, argv ? argv : empty_argv);
&&&&&&&&&&&&&&&continue;
&&&&&&&&&&&}&br&&br&摘自qobject.cpp
z众人皆惊,原来在Auto模式下,如果sender的触发时所处的线程和receiver不同,也会是异步调用。此时道友齐声向柯南喊道“这是全部的真相了吗”?柯南转过头来笑而不语,渐渐又消失在黑暗中。“有多少无耻可以重来”漂上了众人的心头。望着远处的雨后阳光,一个大大的问号也出现在众人头顶,&Qt你到底有多无耻???&。众人又陷入了沉思。
欲知后事如何,请听下回分解。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11709次
排名:千里之外
转载:35篇
(2)(14)(6)(7)(5)(1)

我要回帖

更多关于 闲鱼买ipad被骗 的文章

 

随机推荐