• 3755阅读
  • 10回复

请教个信号槽参数的问题 [复制链接]

上一主题 下一主题
在线liulin188
 

只看楼主 倒序阅读 楼主  发表于: 2013-04-12

请教个问题
线程B
signals:
    void showMessage(char *msg);
线程A
private slots:
    void showMessage(char *msg);


如果线程B emit信号的时候,那个msg是个局部数组,线程A用这个msg的时候有危险吗?


如果msg是动态申请的内存,又该如何释放呢。
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
在线liulin188

只看该作者 1楼 发表于: 2013-04-12
顶顶
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线jdwx

只看该作者 2楼 发表于: 2013-04-12
回 1楼(liulin188) 的帖子
这是C++问题,把信号和槽忽略掉,当成函数调用考虑。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
在线liulin188

只看该作者 3楼 发表于: 2013-04-12
Re:回 1楼(liulin188) 的帖子
引用第2楼jdwx于2013-04-12 13:15发表的 回 1楼(liulin188) 的帖子 :
这是C++问题,把信号和槽忽略掉,当成函数调用考虑。

好像不是这样的,不是纯粹的函数调用
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线呆呆很呆
只看该作者 4楼 发表于: 2013-04-12
回 2楼(jdwx) 的帖子
的确不完全是这样 Qt异步信号槽的内部是调用了QMetaType::create来复制参数 防止参数被析构 不过的确 没有复制char*内部的东西 所以还是会被析构 楼主的例子推荐用将connect的最后一个参数设置为异步等待调用(跨线程默认是异步调用 不夸线程默认是直接调用)
在线liulin188

只看该作者 5楼 发表于: 2013-04-12
Re:回 2楼(jdwx) 的帖子
引用第4楼呆呆很呆于2013-04-12 13:36发表的 回 2楼(jdwx) 的帖子 :
的确不完全是这样 Qt异步信号槽的内部是调用了QMetaType::create来复制参数 防止参数被析构 不过的确 没有复制char*内部的东西 所以还是会被析构 楼主的例子推荐用将connect的最后一个参数设置为异步等待调用(跨线程默认是异步调用 不夸线程默认是直接调用)


大牛终于出现了,
意思是这样就可以直接用了,线程B emit返回应该是在线程A的slot返回之后,是这样的吗
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线realfan

只看该作者 6楼 发表于: 2013-04-12
直接用肯定是有危险的,线程A处理char*时,char* 的情况是不确定的.
确定发射信号与槽的执行不在同一个线程的情况下,可以用Qt::BlockingQueuedConnection,保证A处理完char*,B再继续进行.
在线liulin188

只看该作者 7楼 发表于: 2013-04-12
哎,看来还是不靠谱。
我还是用QString参数吧。
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
在线liulin188

只看该作者 8楼 发表于: 2013-04-12
现在明白了,感谢各位大牛的指教。
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线呆呆很呆
只看该作者 9楼 发表于: 2013-04-12
回 5楼(liulin188) 的帖子
不是这个意思 你connect的时候加一个参数Qt::BlockingQueuedConnection(注意 这个参数必须是在跨线程的情况下 否则会造成线程被堵塞)
在线liulin188

只看该作者 10楼 发表于: 2013-04-12
Re:回 5楼(liulin188) 的帖子
引用第9楼呆呆很呆于2013-04-12 19:12发表的 回 5楼(liulin188) 的帖子 :
不是这个意思 你connect的时候加一个参数Qt::BlockingQueuedConnection(注意 这个参数必须是在跨线程的情况下 否则会造成线程被堵塞)

好的,谢谢!
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
快速回复
限100 字节
 
上一个 下一个