在Qt和LibEvent中,信号和插槽的区别是什么?

4
也许对于某些人来说,这是一个非常奇怪的问题,但是Qt中的信号和槽系统与LibEvent库有什么区别?因为它们似乎都用于类似的功能。
如果我已经在Qt中有了信号和槽,为什么还需要使用LibEvent?如何更好地管理大量网络连接?例如,我需要在SSL通过TCP服务器中使用LibEvent还是信号和槽?

你是在谈论QTcpServer和QTcpSocket吗? - Tazo leladze
@Taz742 是的,当我说TCP服务器时,我的意思是我正在使用QTcpServerQTcpSocket(确切地说是QSslSocket)。 - konstantin_doncov
1
任何事件循环在等待新事件时都会阻塞它所在的线程。在同一线程中混合两个事件循环不可取,即使在同一应用程序的不同线程中执行也可能导致意外行为。如果确实需要同时使用两者,最好将应用程序拆分为两个(或更多)进程。 - MrEricSir
1
@MrEricSir 抱歉如果我表达不正确。我的意思是哪种类型的应用程序应该使用什么事件循环?当然,我不打算在同一个应用程序中同时使用这两个系统。 :) - konstantin_doncov
好吧,如果没有其他的话,lebevent 是 C 语言编写的,而且也更小。你可能不会在嵌入式项目中使用 Qt。 - dbrank0
1个回答

1

Qt信号槽和libevent都依赖于回调函数,但它们在机制和用例上有很大的不同。

Qt槽是普通函数。而Qt信号基本上是回调函数的容器,你可以将其想象成std::list<CALLBACK_FUNC>。 当你“发射”一个信号时,实际上是直接从“发射”中调用每个槽函数。 Qt信号槽基于C/C++函数指针和运行时类型信息(由mocQ_OBJECT魔法生成), 并且可以用于连接任何C++类实例。

Libevent回调函数是从事件循环中调用的,通常你不想直接调用它们。 而libevent回调函数是为预定义的“事件”服务的,你不能将它们用于通用目的。

如果你计划使用网络通信实现Qt应用程序,我建议你可以使用Qt套接字,这样可以很好地集成到Qt事件循环中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接