草庐IT

组信号

全部标签

c++ - `boost::signals2` 中的信号签名是如何实现的?

我在我的项目中使用boost::signals2已有一段时间了。令我遗憾的是,我仍然不明白它们是如何在幕后实现的。我的问题已经从信号的定义开始了。如何定义如boost::signals2::signal处理了吗?我可以从实现细节中看出,签名变成了一个模板参数,它被恰本地命名为Signature。但是,我不明白语法。C++标准是否允许这种语法?以这种形式提供的信号如何“存储”函数签名?我已经尝试查看源代码,但无法找到此语法的解释。任何帮助将不胜感激。 最佳答案 是的,这种语法是允许的;它表示的类型是一个对采用bool和double并返

c++ - SIGINT 信号在写入管道期间被丢弃

我有一个程序使用pcap_dump函数将使用libpcap收集的pcap数据转储到标准输出,标准输出作为文件*。需要对SIGINT进行一些清理,所以我使用sigaction()来处理它。这在从shell执行时效果很好。但是,这个程序本来是要被另一个程序调用的,好像不行。这个“调用者”程序先调用一个pipe(),然后调用一个fork(),然后子进程的stdout文件描述符被关闭,并替换为管道的写入端。最后在子进程中执行前述的pcap程序。这样pcap数据就通过管道写入了调用程序。这也很好用。但是,当我向正在写入管道的子进程发送一个SIGINT时(好吧,pcap程序认为它正在写入stdou

c++ - 如何监测QT信号?

在调试期间,我想看看有什么在等待我的程序的事件循环。它可能被淹没了,我想看看是什么信号,而不是(手动)向每个Q_EMIT添加特定的日志消息。可能的解决方案可能是观察一些包含事件队列的内部qt数据结构(有这样的东西吗?怎么样?)或者——为发出的每个信号写一条日志消息(这可能吗?)。还有其他想法吗?(Windows上的QT4.8,使用visualstudio2012) 最佳答案 信号和事件是两个没有任何关系的东西。Iwanttoseewhat'sawaitsmyprogram'seventloop.It'sprobablyflooded

c++ - 为什么执行 socket::readyRead() 的新信号,即使其较早的插槽仍在处理中?

根据以下帖子,只有在当前正在执行的插槽完成后,才会提供发出的信号。WaitforaSLOTtofinishtheexecutionwithQt我有一个基于ssl套接字的客户端-服务器通信应用程序,它是单线程的。connect(socket,&QSslSocket::readyRead,[&](){myObject.Read();});客户端和服务器互相发送一些自定义消息。无论何时发送或接收消息,它们都会发送ACK字节(00)。大多数时候,我注意到当Read()处于执行之间时,会提供下一个readyRead()!我将调试语句放在myObject->Read()的开头和结尾。他们确认,开始

c++ - Qt 中两个插件的信号/插槽交互

所以基本上我有一个加载两个插件并连接它们的小应用程序。加载后的第一个插件会创建一个没有任何标题的标签,该标签将被添加到主窗口。第二个插件创建一个将添加到菜单的操作。所以我的应用程序只需要加载这些插件并连接它们。连接它们是什么意思?我的意思是标签插件包含一个插槽,它将修改标签的标题,并且Action插件声明了一个信号。应用程序应connectAction插件信号与标签插槽。我不知道该怎么做。我的猜测是,实际上插件类实现是将自定义信号与标准信号(已触发)连接起来。但无论如何,我的应用程序无法按预期工作。如何在我的应用程序中正确连接一个插件的信号和另一个插件的插槽??这是我的标签插件代码:#

c++ - 我可以只用事件、互斥量和信号量实现公平的 "wait on multiple events"吗?

在只有事件[1]、互斥锁和信号量[2]的平台上,我可以创建一个公平的“等待多个事件”实现,当任何事件[3]发出信号/设置时返回。我假设现有的原语是公平的。[1]事件是具有4个操作的“标志”:Set()、Clear()、Wait()和WaitAndClear()。如果你在一个未设置的事件上等待(),你会阻塞直到有人设置()它。WaitAndClear()听起来像,但是原子的。所有服务员都被唤醒。[2]我认为系统不支持负值的信号量。[3]我说的是“事件”,但它可能是使用任何这些原语的新对象类型。 最佳答案 对于window,WaitFo

c++ - std::condition_variables 可以用作计数信号量吗?

这是CanC++11condition_variablesbeusedtosynchronizeprocesses?的后续行动.std::condition_variable对象可以用作计数信号量吗?我认为不是因为对象似乎绑定(bind)到std::mutex,这意味着它只能用作二进制信号量。我在网上看过,包括here,here,和here,但找不到将这些对象用作计数信号量的引用或示例。 最佳答案 是的。structcounting_sem{counting_sem(std::ptrdiff_tinit=0):count(init)

c++ - Qt 基于参数值映射信号

我知道我可以使用QSignalMapper根据连接调用具有不同参数的插槽。我想要实现的有点不同。我们在应用程序中使用插件,不同的插件负责不同类型的对象。我们将多个插槽连接到主应用程序发出的一个信号,每个插槽都在不同的插件中实现。信号的参数之一是QString,指示与信号关联的对象类型。目前,我们正在插槽中检查此参数,如果类型由插件处理则继续。这有一个缺点,每个插件都会进行此检查,我想尽可能避免这种情况。我想将所有插槽连接到同一个信号,当信号发出时,根据QString参数的值只调用适当的插槽,有点像QSignalMapper但方式不同。是否有任何内置机制可以做到这一点?如果没有,关于我如

c++ - 访问队列数据结构的信号处理程序(竞争条件?)

我目前正在用C++编写一个小型shell。作业和与之关联的PID存储在作业指针队列中(job*)。运行新作业时,有关它的信息将添加到队列中。由于可以同时处理多个作业,并且可以随时在shell的控制台输入新作业,因此我有一个信号处理程序来等待终止的作业。当一个作业终止时,我需要从事件作业队列中删除它的信息并将其移动到我的已终止作业的双端队列中。但是,当另一个作业停止时,用户的新作业可能正在添加到队列中。在这种情况下,他们的insert队列操作将被暂停,我的信号处理程序将被调用,它将执行它的pop操作。我想了解如何解决这种潜在的竞争条件,因为我认为在此过程中可能会发生损坏。我不能使用互斥锁

c++ - Qt 信号/槽 : Is it an error to emit a signal from a temporary object?

在Qt中,如果从一个临时对象中调用一个信号,使得该对象可能在调用槽时被删除,这是一个错误吗?如果相关,代码会从临时对象的构造函数发出信号。(注意:没有指针或引用作为参数传递,所以这不是关于悬挂指针或引用的问题。我只是想知道,以最简单的形式,从Qt中的一个临时对象。)这是我的代码的简化版本://MyapplicationclassHandyApplication:publicQApplication{Q_OBJECTpublic:explicitHandyApplication(intargc,char*argv[]);signals:publicslots:voidhandySlot(