CN113867991B - 一种基于信号槽的线程间的事件处理方法、装置及存储介质 - Google Patents
一种基于信号槽的线程间的事件处理方法、装置及存储介质 Download PDFInfo
- Publication number
- CN113867991B CN113867991B CN202111447892.6A CN202111447892A CN113867991B CN 113867991 B CN113867991 B CN 113867991B CN 202111447892 A CN202111447892 A CN 202111447892A CN 113867991 B CN113867991 B CN 113867991B
- Authority
- CN
- China
- Prior art keywords
- signal slot
- event
- signal
- message
- thread
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/548—Queue
Abstract
本发明提出了一种基于信号槽的线程间的事件处理方法、装置及存储介质,该方法包括:在用户程序的第一线程中创建信号槽对象并返回引用该信号槽对象的信号槽引用对象;在用户程序的第一线程中创建信号槽事件,并在所述信号槽引用对象中增加以事件名为索引的消息数据;基于所述事件名在所述第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据;所述相应的线程接收到所述信号槽消息后基于所述信号槽消息的消息数据调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。本发明中,通过执行回调函数完成对应事件名的事件处理,提高了进程间通讯的灵活性。
Description
技术领域
本发明涉及计算机线程数据处理技术领域,具体涉及一种基于信号槽的线程间的事件处理方法、装置及存储介质。
背景技术
Node.js 是 JavaScript 的一种支持多线程技术的开发平台。Node.js 的线程之间依靠点对点的通道技术进行通信,该技术原理描述如下:一个通道对应两个端口,端口可以监听消息,从一个端口发送消息,另一个端口可以接收消息;主线程创建工作线程时,系统预先创建了缺省的通道,并将通道两个端口分别分配给主线程与工作线程,主线程与工作线程之间可以通过缺省的通道进行通信;在任务线程之间,用户创建的通道,可以将一个端口利用已经创建的通道发送到另一个线程,两个线程间通过新创建的通道进行通信。
中国专利CN108228360B公开了一种VxWorks与Qt的事件通信方法和装置,该方法包括:监测VxWorks操作系统的WindML库中是否存在待处理的事件消息;若VxWorks操作系统的WindML库中存在待处理的事件消息,则控制所回调函数将待处理的事件消息进行过滤,获取第一事件消息,第一事件消息为输入设备的事件消息;将第一事件消息对应的标记消息写入管道;根据将第一事件消息对应的标记消息写入管道的操作,调用槽函数,以使槽函数读取第一事件消息,并将第一事件消息转换为Qt能够识别的第二事件消息,并存储到Qt的消息队列中,以使Qt对第二事件消息进行处理。实现了VxWorks与Qt的事件通信,能够使基于Qt的应用程序运行在VxWorks的操作系统上,充分利用VxWorks操作系统良好的可靠性和卓越的实时性的优势。该方法用于VxWorks与Qt的事件通信,而不适于线程之间的通信。
这种通信方式的建立过程繁琐复杂:线程间依赖已经建立的通道传递新建的通道端口,任务线程之间无法直接建立通信通道。通信机制不灵活,功能受限: 通道仅支持点对点通信,不支持 JavaScript 中广泛使用的订阅发布事件模型;更无法线程间进行事件的处理。
发明内容
本发明针对上述现有技术中一个或多个技术缺陷,提出了如下技术方案。
一种基于信号槽的线程间的事件处理方法,该方法包括:
创建步骤,在用户程序的第一线程中创建信号槽对象并返回引用该信号槽对象的信号槽引用对象;
订阅步骤,在用户程序的第一线程中创建信号槽事件,并在所述信号槽引用对象中增加以事件名为索引的消息数据;
发送步骤,基于所述事件名在所述第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据;
接收步骤,所述相应的线程接收到所述信号槽消息后基于所述信号槽消息的消息数据调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。
更进一步地,使用信号槽对象表保存信号槽对象的标识及对应的信号槽对象,所述信号槽对象包含第一二维表,所述第一二维表用于记录在所述信号槽对象上注册的一个或多个信号槽事件,以及与所述信号槽事件对应的一个或多个信号槽引用对象。
更进一步地,所述创建步骤执行的操作为:用户程序的第一线程调用创建信号槽对象的API,参数为创建的信号槽对象的标识,基于所述标识在所述信号槽对象表中查找是否已经存在信号槽对象,如果该信号槽对象已经存在,则基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序;如果不存在,则创建信号槽对象,并将该信号槽对象通过其标识存入信号槽对象表中,然后基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序。
更进一步地,所述订阅步骤执行的操作为:用户程序的第一线程调用订阅信号槽事件的API,参数为事件名和事件对应的回调函数,通过所述事件名在信号槽对象中的第一二维表中查找信号槽事件,如果该信号槽事件已经存在,则在信号槽对象中的第一二维表中的将信号槽引用对象记录在该信号槽事件索引的数据中,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中;如果不存在,则创建信号槽事件,在信号槽对象中的第一二维表中增加所述事件名为索引的数据,在所述信号槽引用对象中增加以事件名为索引的数据,然后在信号槽对象中的第一二维表中的信号槽事件索引的数据中记录信号槽引用对象,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中。
更进一步地,所述发送步骤执行的操作为:用户程序的第一线程调用发送消息的API,参数为事件名和消息数据,通过所述事件名在第一线程的信号槽对象中的第一二维表中查找信号槽事件,如果该信号槽事件不存在,则退出,如果存在,则在信号槽对象中通过所述事件名索引事件数据,并遍历事件名对应的信号槽引用对象,如果存在信号槽引用对象,则在遍历到的信号槽引用对象所在的第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至一个或多个第二线程,即相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据,其中,所述一个或多个第二线程作为第一线程相应的进程。
更进一步地,所述接收步骤执行的操作为:第二线程在JavaScript 引擎的每个异步事件调度周期内调用接收消息的API,第二线程遍历线程信号槽消息队列,如果没有信号槽消息,则退出,如果有信号槽消息,则队列中取出一条消息待处理,所述处理为:从信号槽消息中获取信号槽引用对象、事件名和消息数据,基于所述事件名在信号槽引用对象中查找信号槽事件,从查找的信号槽事件中获取回调函数,以消息数据作为参数调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。
本发明还提出了一种基于信号槽的线程间的事件处理装置,该装置包括:
创建单元,在用户程序的第一线程中创建信号槽对象并返回引用该信号槽对象的信号槽引用对象;
订阅单元,在用户程序的第一线程中创建信号槽事件,并在所述信号槽引用对象中增加以事件名为索引的消息数据;
发送单元,基于所述事件名在所述第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据;
接收单元,所述相应的线程接收到所述信号槽消息后基于所述信号槽消息的消息数据调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。
更进一步地,使用信号槽对象表保存信号槽对象的标识及对应的信号槽对象,所述信号槽对象包含第一二维表,所述第一二维表用于记录在所述信号槽对象上注册的一个或多个信号槽事件,以及与所述信号槽事件对应的一个或多个信号槽引用对象。
更进一步地,所述创建单元执行的操作为:用户程序的第一线程调用创建信号槽对象的API,参数为创建的信号槽对象的标识,基于所述标识在所述信号槽对象表中查找是否已经存在信号槽对象,如果该信号槽对象已经存在,则基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序;如果不存在,则创建信号槽对象,并将该信号槽对象通过其标识存入信号槽对象表中,然后基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序。
更进一步地,所述订阅单元执行的操作为:用户程序的第一线程调用订阅信号槽事件的API,参数为事件名和事件对应的回调函数,通过所述事件名在信号槽对象中的第一二维表中查找信号槽事件,如果该信号槽事件已经存在,则在信号槽对象中的第一二维表中的将信号槽引用对象记录在该信号槽事件索引的数据中,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中;如果不存在,则创建信号槽事件,在信号槽对象中的第一二维表中增加所述事件名为索引的数据,在所述信号槽引用对象中增加以事件名为索引的数据,然后在信号槽对象中的第一二维表中的信号槽事件索引的数据中记录信号槽引用对象,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中。
更进一步地,所述发送单元执行的操作为:用户程序的第一线程调用发送消息的API,参数为事件名和消息数据,通过所述事件名在第一线程的信号槽对象中的第一二维表中查找信号槽事件,如果该信号槽事件不存在,则退出,如果存在,则在信号槽对象中通过所述事件名索引事件数据,并遍历事件名对应的信号槽引用对象,如果存在信号槽引用对象,则在遍历到的信号槽引用对象所在的第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至一个或多个第二线程,即相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据,其中,所述一个或多个第二线程作为第一线程相应的进程。
更进一步地,所述接收单元执行的操作为:第二线程在JavaScript 引擎的每个异步事件调度周期内调用接收消息的API,第二线程遍历线程信号槽消息队列,如果没有信号槽消息,则退出,如果有信号槽消息,则队列中取出一条消息待处理,所述处理为:从信号槽消息中获取信号槽引用对象、事件名和消息数据,基于所述事件名在信号槽引用对象中查找信号槽事件,从查找的信号槽事件中获取回调函数,以消息数据作为参数调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。
本发明还提出了一种计算机可读存储介质,所述存储介质上存储有计算机程序代码,当所述计算机程序代码被计算机执行时执行上述之任一的方法。
本发明的技术效果在于:本发明的一种基于信号槽的线程间的事件处理方法、装置、设备及存储介质,该方法包括:创建步骤S101,在用户程序的第一线程中创建信号槽对象并返回引用该信号槽对象的信号槽引用对象;订阅步骤S102,在用户程序的第一线程中创建信号槽事件,并在所述信号槽引用对象中增加以事件名为索引的消息数据;发送步骤S103,基于所述事件名在所述第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据;接收步骤S104,所述相应的线程接收到所述信号槽消息后基于所述信号槽消息的消息数据调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。本发明中,在用户程序的第一线程中创建信号槽对象并返回引用该信号槽对象的信号槽引用对象,然后在信号槽引用对象中增加以事件名为索引的消息数据,即通过事件名可以查找对对应的消息数据,这样,进程间需要进行事件处理时,基于所述事件名在所述第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据,所述相应的线程接收到所述信号槽消息后基于所述信号槽消息的消息数据调用回调函数,通过执行所述回调函数完成对应事件名的事件处理,从而实现了进程间数据的传送,并完成了对应事件的处理,提高了进程间通讯的灵活性,进而使得进程间的事件处理更为高效。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显。
图1是根据本发明的实施例的一种基于信号槽的线程间的事件处理方法的流程图。
图2是根据本发明的实施例的一种基于信号槽的线程间的事件处理装置的结构图。
具体实施方式
下面结合附图和实施例对本申请作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与有关发明相关的部分。
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
图1示出了本发明的一种基于信号槽的线程间的事件处理方法,该方法包括:
创建步骤S101,在用户程序的第一线程中创建信号槽对象并返回引用该信号槽对象的信号槽引用对象;所述用户程序一般来说具有多个线程,至少具有一个线程,从而在同时存在进程中创建信号槽对象。
订阅步骤S102,在用户程序的第一线程中创建信号槽事件,并在所述信号槽引用对象中增加以事件名为索引的消息数据;信号槽对象创建完毕后,返回与引用该信号槽对象的信号槽引用对象,在信号槽引用对象中增加以事件名为索引的消息数据,即通过事件名可以查找对对应的消息数据。
发送步骤S103,基于所述事件名在所述第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据。
接收步骤S104,所述相应的线程接收到所述信号槽消息后基于所述信号槽消息的消息数据调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。
本发明中,在用户程序的第一线程中创建信号槽对象并返回引用该信号槽对象的信号槽引用对象,然后在信号槽引用对象中增加以事件名为索引的消息数据,即通过事件名可以查找对对应的消息数据,这样,进程间需要进行事件处理时,基于所述事件名在所述第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据,所述相应的线程接收到所述信号槽消息后基于所述信号槽消息的消息数据调用回调函数,通过执行所述回调函数完成对应事件名的事件处理,从而实现了进程间数据的传送,并完成了对应事件的处理,提高了进程间通讯的灵活性,进而使得进程间的事件处理更为高效,这是本发明的一个重要发明点。
在一个实施例中,使用信号槽对象表保存信号槽对象的标识及对应的信号槽对象,所述信号槽对象包含第一二维表,所述第一二维表用于记录在所述信号槽对象上注册的一个或多个信号槽事件,以及与所述信号槽事件对应的一个或多个信号槽引用对象。即本发明中,信号槽对象(sigslot object)是本发明中设计的一种线程共享对象,有唯一的命名(即标识,也称为ID),用于组织线程或线程间通信的数据结构,可以被信号槽引用对象访问。信号槽对象表(sigslot table)以信号槽名(即标识)为索引,引用命名的信号槽对象,信号槽对象表用于查找信号槽对象。一个信号槽对象上可以注册多个信号槽事件(event),每个事件用命名区分;信号槽事件记录了被注册的信号槽引用对象,信号槽事件上有消息时,消息能快速地传递给被引用的信号槽引用对象。信号槽引用对象(sigslot_ref object):用户创建信号槽对象时,返回的是信号槽引用对象,多个同名的信号槽引用对象可以引用同一个信号槽对象,从而在多个同名的信号槽引用对象之间建立通信联系。同名信号槽引用对象可以在同名的信号槽事件上发送或接收消息。每个线程维护一个信号槽消息队列(message queue),用于保存信号槽消息,线程在每个异步事件调度周期检查队列消息,根据消息事件关联的信号槽引用对象,调用回调函数。
在一个实施例中,所述创建步骤S101执行的操作为:用户程序的第一线程调用创建信号槽对象的API,该API 为本发明设计的函数Sigslot(name),用于创建信号槽对象,返回信号槽引用对象,其参数为创建的信号槽对象的标识,基于所述标识在所述信号槽对象表中查找是否已经存在信号槽对象,如果该信号槽对象已经存在,则基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序;如果不存在,则创建信号槽对象,并将该信号槽对象通过其标识存入信号槽对象表中,然后基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序。
本发明中,通过设计的函数Sigslot(name)创建信号槽对象,并返回信号槽引用对象,器基于所述标识在所述信号槽对象表中查找是否已经存在信号槽对象,如果该信号槽对象已经存在,则基于该信号槽对象在该线程中创建信号槽引用对象,如果不存在该信号槽对象,创建后再创建相应的信号槽引用对象,并将信号槽引用对象的标识返回至用户程序,从而实现了一个信号槽对象关联多个信号槽引用对象,多个同名的信号槽引用对象可以通过该信号槽实现线程内或线程间的通信,从而便于后续的线程间的事件处理,这是本发明的另一个重要发明点。
在一个实施例中,所述订阅步骤S102执行的操作为:用户程序的第一线程调用订阅信号槽事件的API,该API为本发明设计的函数sigslot.slot(event, callback),用于订阅信号槽事件,从而在事件上注册回调函数,其参数为事件名和事件对应的回调函数,通过所述事件名在信号槽对象中的第一二维表中查找信号槽事件,如果该信号槽事件已经存在,则在信号槽对象中的第一二维表中的将信号槽引用对象记录在该信号槽事件索引的数据中,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中;如果不存在,则创建信号槽事件,在信号槽对象中的第一二维表中增加所述事件名为索引的数据,在所述信号槽引用对象中增加以事件名为索引的数据,然后在信号槽对象中的第一二维表中的信号槽事件索引的数据中记录信号槽引用对象,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中。本发明中, 通过函数sigslot.slot(event, callback)在信号槽引用对象中将回调函数记录在该信号槽事件索引的数据,从而在事件上注册了回调函数,可以实现事件基于信号槽对象在进程间处理,这是本发明的另一个重要发明点。
在一个实施例中,所述发送步骤S103执行的操作为:用户程序的第一线程调用发送消息的API,该API为本发明设计的函数sigslot.emit(event, message),用于在信号槽事件上发送消息,其参数为事件名和消息数据,通过所述事件名在第一线程的信号槽对象中的第一二维表中查找信号槽事件,如果该信号槽事件不存在,则退出,如果存在,则在信号槽对象中通过所述事件名索引事件数据,并遍历事件名对应的信号槽引用对象,如果存在信号槽引用对象,则在遍历到的信号槽引用对象所在的第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至一个或多个第二线程,即相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据,其中,所述一个或多个第二线程作为第一线程相应的进程。
本发明中,如果应用程序中的一个进程向其他进程发送数据,比如第一进程向第二进程发送数据,则第一进程通过sigslot.emit(event, message)获取事件名和消息数据,然后通过所述事件名应用程序的该进程的信号槽对象中的第一二维表中查找信号槽事件,在信号槽对象中通过所述事件名索引事件数据,并遍历事件名对应的信号槽引用对象,如果存在信号槽引用对象,则在遍历到的信号槽引用对象所在的第一线程的消息队列中创建信号槽消息,并发送至一个或多个第二线程,第二线程接收到信号槽消息后将其保存在自己的消息队列中,即本发明中,而是两个进程基于相同的事件名进行数据的传输,从而便于事件的执行,降低了线程间消息传输的开销,这是本发明的另一个重要发明点。
在一个实施例中,所述接收步骤S104执行的操作为:第二线程在JavaScript 引擎的每个异步事件调度周期内调用接收消息的API,第二线程遍历线程信号槽消息队列,如果没有信号槽消息,则退出,如果有信号槽消息,则队列中取出一条消息待处理,所述处理为:从信号槽消息中获取信号槽引用对象、事件名和消息数据,基于所述事件名在信号槽引用对象中查找信号槽事件,从查找的信号槽事件中获取回调函数,以消息数据作为参数调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。
本发明中,每个线程中独立的 JavaScript 引擎在每个异步事件调度周期内处理信号槽消息,基于所述事件名在信号槽引用对象中查找信号槽事件,从查找的信号槽事件中获取回调函数,以消息数据作为参数调用回调函数,通过执行所述回调函数完成对应事件名的事件处理,从而实现了线程间事件的处理,这是本发明的另一个重要发明点。
图2示出了本发明的一种基于信号槽的线程间的事件处理装置,该装置包括:
创建单元201,在用户程序的第一线程中创建信号槽对象并返回引用该信号槽对象的信号槽引用对象;所述用户程序一般来说具有多个线程,至少具有一个线程,从而在同时存在进程中创建信号槽对象。
订阅单元202,在用户程序的第一线程中创建信号槽事件,并在所述信号槽引用对象中增加以事件名为索引的消息数据;信号槽对象创建完毕后,返回与引用该信号槽对象的信号槽引用对象,在信号槽引用对象中增加以事件名为索引的消息数据,即通过事件名可以查找对对应的消息数据。
发送单元203,基于所述事件名在所述第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据。
接收单元204,所述相应的线程接收到所述信号槽消息后基于所述信号槽消息的消息数据调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。
本发明中,在用户程序的第一线程中创建信号槽对象并返回引用该信号槽对象的信号槽引用对象,然后在信号槽引用对象中增加以事件名为索引的消息数据,即通过事件名可以查找对对应的消息数据,这样,进程间需要进行事件处理时,基于所述事件名在所述第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据,所述相应的线程接收到所述信号槽消息后基于所述信号槽消息的消息数据调用回调函数,通过执行所述回调函数完成对应事件名的事件处理,从而实现了进程间数据的传送,并完成了对应事件的处理,提高了进程间通讯的灵活性,进而使得进程间的事件处理更为高效,这是本发明的一个重要发明点。
在一个实施例中,使用信号槽对象表保存信号槽对象的标识及对应的信号槽对象,所述信号槽对象包含第一二维表,所述第一二维表用于记录在所述信号槽对象上注册的一个或多个信号槽事件,以及与所述信号槽事件对应的一个或多个信号槽引用对象。即本发明中,信号槽对象(sigslot object)是本发明中设计的一种线程共享对象,有唯一的命名(即标识,也称为ID),用于组织线程或线程间通信的数据结构,可以被信号槽引用对象访问。信号槽对象表(sigslot table)以信号槽名(即标识)为索引,引用命名的信号槽对象,信号槽对象表用于查找信号槽对象。一个信号槽对象上可以注册多个信号槽事件(event),每个事件用命名区分;信号槽事件记录了被注册的信号槽引用对象,信号槽事件上有消息时,消息能快速地传递给被引用的信号槽引用对象。信号槽引用对象(sigslot_ref object):用户创建信号槽对象时,返回的是信号槽引用对象,多个同名的信号槽引用对象可以引用同一个信号槽对象,从而在多个同名的信号槽引用对象之间建立通信联系。同名信号槽引用对象可以在同名的信号槽事件上发送或接收消息。每个线程维护一个信号槽消息队列(message queue),用于保存信号槽消息,线程在每个异步事件调度周期检查队列消息,根据消息事件关联的信号槽引用对象,调用回调函数。
在一个实施例中,所述创建单元201执行的操作为:用户程序的第一线程调用创建信号槽对象的API,该API 为本发明设计的函数Sigslot(name),用于创建信号槽对象,返回信号槽引用对象,其参数为创建的信号槽对象的标识,基于所述标识在所述信号槽对象表中查找是否已经存在信号槽对象,如果该信号槽对象已经存在,则基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序;如果不存在,则创建信号槽对象,并将该信号槽对象通过其标识存入信号槽对象表中,然后基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序。
本发明中,通过设计的函数Sigslot(name)创建信号槽对象,并返回信号槽引用对象,器基于所述标识在所述信号槽对象表中查找是否已经存在信号槽对象,如果该信号槽对象已经存在,则基于该信号槽对象在该线程中创建信号槽引用对象,如果不存在该信号槽对象,创建后再创建相应的信号槽引用对象,并将信号槽引用对象的标识返回至用户程序,从而实现了一个信号槽对象关联多个信号槽引用对象,多个同名的信号槽引用对象可以通过该信号槽实现线程内或线程间的通信,从而便于后续的线程间的事件处理,这是本发明的另一个重要发明点。
在一个实施例中,所述订阅单元202执行的操作为:用户程序的第一线程调用订阅信号槽事件的API,该API为本发明设计的函数sigslot.slot(event, callback),用于订阅信号槽事件,从而在事件上注册回调函数,其参数为事件名和事件对应的回调函数,通过所述事件名在信号槽对象中的第一二维表中查找信号槽事件,如果该信号槽事件已经存在,则在信号槽对象中的第一二维表中的将信号槽引用对象记录在该信号槽事件索引的数据中,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中;如果不存在,则创建信号槽事件,在信号槽对象中的第一二维表中增加所述事件名为索引的数据,在所述信号槽引用对象中增加以事件名为索引的数据,然后在信号槽对象中的第一二维表中的信号槽事件索引的数据中记录信号槽引用对象,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中。本发明中, 通过函数sigslot.slot(event, callback)在信号槽引用对象中将回调函数记录在该信号槽事件索引的数据,从而在事件上注册了回调函数,可以实现事件基于信号槽对象在进程间处理,这是本发明的另一个重要发明点。
在一个实施例中,所述发送单元203执行的操作为:用户程序的第一线程调用发送消息的API,该API为本发明设计的函数sigslot.emit(event, message),用于在信号槽事件上发送消息,其参数为事件名和消息数据,通过所述事件名在第一线程的信号槽对象中的第一二维表中查找信号槽事件,如果该信号槽事件不存在,则退出,如果存在,则在信号槽对象中通过所述事件名索引事件数据,并遍历事件名对应的信号槽引用对象,如果存在信号槽引用对象,则在遍历到的信号槽引用对象所在的第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至一个或多个第二线程,即相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据,其中,所述一个或多个第二线程作为第一线程相应的进程。
本发明中,如果应用程序中的一个进程向其他进程发送数据,比如第一进程向第二进程发送数据,则第一进程通过sigslot.emit(event, message)获取事件名和消息数据,然后通过所述事件名应用程序的该进程的信号槽对象中的第一二维表中查找信号槽事件,在信号槽对象中通过所述事件名索引事件数据,并遍历事件名对应的信号槽引用对象,如果存在信号槽引用对象,则在遍历到的信号槽引用对象所在的第一线程的消息队列中创建信号槽消息,并发送至一个或多个第二线程,第二线程接收到信号槽消息后将其保存在自己的消息队列中,即本发明中,而是两个进程基于相同的事件名进行数据的传输,从而便于事件的执行,降低了线程间消息传输的开销,这是本发明的另一个重要发明点。
在一个实施例中,所述接收单元204执行的操作为:第二线程在JavaScript 引擎的每个异步事件调度周期内调用接收消息的API,第二线程遍历线程信号槽消息队列,如果没有信号槽消息,则退出,如果有信号槽消息,则队列中取出一条消息待处理,所述处理为:从信号槽消息中获取信号槽引用对象、事件名和消息数据,基于所述事件名在信号槽引用对象中查找信号槽事件,从查找的信号槽事件中获取回调函数,以消息数据作为参数调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。
本发明中,每个线程中独立的 JavaScript 引擎在每个异步事件调度周期内处理信号槽消息,基于所述事件名在信号槽引用对象中查找信号槽事件,从查找的信号槽事件中获取回调函数,以消息数据作为参数调用回调函数,通过执行所述回调函数完成对应事件名的事件处理,从而实现了线程间事件的处理,这是本发明的另一个重要发明点。
本发明一个实施例中提出了一种基于信号槽的线程间的事件处理设备,所述设备包括处理器和存储器,所述处理器与所述处理器通过总线连接,所述存储器上存储有计算机程序,所述处理器执行所述存储器上的计算机程序时实现上述的方法,该设备可以是台式计算机、服务器、笔记本、智能终端等等。
本发明一个实施例中提出了一种计算机存储介质,所述计算机存储介质上存储有计算机程序,当所述计算机存储介质上的计算机程序被处理器执行时实现上述的方法,该计算机存储介质可以是硬盘、DVD、CD、闪存等等存储器。
本发明的为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质 中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的装置。
最后所应说明的是:以上实施例仅以说明而非限制本发明的技术方案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解:依然可以对本发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利要求范围当中。
Claims (10)
1.一种基于信号槽的线程间的事件处理方法,其特征在于,该方法包括:
创建步骤,在用户程序的第一线程中创建信号槽对象并返回引用该信号槽对象的信号槽引用对象,所述信号槽对象为线程共享对象,有唯一的标识,用于组织线程或线程间通信的数据结构,可被信号槽引用对象访问;
订阅步骤,在用户程序的第一线程中创建信号槽事件,并在所述信号槽引用对象中增加以事件名为索引的消息数据;
发送步骤,基于所述事件名在所述第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据;
接收步骤,所述相应的线程接收到所述信号槽消息后基于所述信号槽消息的消息数据调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。
2.根据权利要求1所述的方法,其特征在于,使用信号槽对象表保存信号槽对象的标识及对应的信号槽对象,所述信号槽对象包含第一二维表,所述第一二维表用于记录在所述信号槽对象上注册的一个或多个信号槽事件,以及与所述信号槽事件对应的一个或多个信号槽引用对象。
3.根据权利要求2所述的方法,其特征在于,所述创建步骤执行的操作为:用户程序的第一线程调用创建信号槽对象的API,参数为创建的信号槽对象的标识,基于所述标识在所述信号槽对象表中查找是否已经存在信号槽对象,如果该信号槽对象已经存在,则基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序;如果不存在,则创建信号槽对象,并将该信号槽对象通过其标识存入信号槽对象表中,然后基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序。
4.根据权利要求3所述的方法,其特征在于,所述订阅步骤执行的操作为:用户程序的第一线程调用订阅信号槽事件的API,参数为事件名和事件对应的回调函数,通过所述事件名在信号槽对象中的第一二维表中查找信号槽事件,如果该信号槽事件已经存在,则在信号槽对象中的第一二维表中的将信号槽引用对象记录在该信号槽事件索引的数据中,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中;如果不存在,则创建信号槽事件,在信号槽对象中的第一二维表中增加所述事件名为索引的数据,在所述信号槽引用对象中增加以事件名为索引的数据,然后在信号槽对象中的第一二维表中的信号槽事件索引的数据中记录信号槽引用对象,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中。
5.根据权利要求3所述的方法,其特征在于,所述发送步骤执行的操作为:用户程序的第一线程调用发送消息的API,参数为事件名和消息数据,通过所述事件名在第一线程的信号槽对象中的第一二维表中查找信号槽事件,如果该信号槽事件不存在,则退出,如果存在,则在信号槽对象中通过所述事件名索引事件数据,并遍历事件名对应的信号槽引用对象,如果存在信号槽引用对象,则在遍历到的信号槽引用对象所在的第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至一个或多个第二线程,即相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据,其中,所述一个或多个第二线程作为第一线程相应的进程。
6.一种基于信号槽的线程间的事件处理装置,其特征在于,该装置包括:
创建单元,在用户程序的第一线程中创建信号槽对象并返回引用该信号槽对象的信号槽引用对象,所述信号槽对象为线程共享对象,有唯一的标识,用于组织线程或线程间通信的数据结构,可被信号槽引用对象访问;
订阅单元,在用户程序的第一线程中创建信号槽事件,并在所述信号槽引用对象中增加以事件名为索引的消息数据;
发送单元,基于所述事件名在所述第一线程的消息队列中创建信号槽消息,并将所述信号槽消息发送至相应的线程,所述信号槽消息包括信号槽引用对象的标识、事件名和消息数据;
接收单元,所述相应的线程接收到所述信号槽消息后基于所述信号槽消息的消息数据调用回调函数,通过执行所述回调函数完成对应事件名的事件处理。
7.根据权利要求6所述的装置,其特征在于,使用信号槽对象表保存信号槽对象的标识及对应的信号槽对象,所述信号槽对象包含第一二维表,所述第一二维表用于记录在所述信号槽对象上注册的一个或多个信号槽事件,以及与所述信号槽事件对应的一个或多个信号槽引用对象。
8.根据权利要求7所述的装置,其特征在于,所述创建单元执行的操作为:用户程序的第一线程调用创建信号槽对象的API,参数为创建的信号槽对象的标识,基于所述标识在所述信号槽对象表中查找是否已经存在信号槽对象,如果该信号槽对象已经存在,则基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序;如果不存在,则创建信号槽对象,并将该信号槽对象通过其标识存入信号槽对象表中,然后基于该信号槽对象在该线程中创建信号槽引用对象,并将信号槽引用对象的标识返回至用户程序。
9.根据权利要求8所述的装置,其特征在于,所述订阅单元执行的操作为:用户程序的第一线程调用订阅信号槽事件的API,参数为事件名和事件对应的回调函数,通过所述事件名在信号槽对象中的第一二维表中查找信号槽事件,如果该信号槽事件已经存在,则在信号槽对象中的第一二维表中的将信号槽引用对象记录在该信号槽事件索引的数据中,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中;如果不存在,则创建信号槽事件,在信号槽对象中的第一二维表中增加所述事件名为索引的数据,在所述信号槽引用对象中增加以事件名为索引的数据,然后在信号槽对象中的第一二维表中的信号槽事件索引的数据中记录信号槽引用对象,并在该信号槽引用对象中将回调函数记录在该信号槽事件索引的数据中。
10.一种计算机存储介质,其特征在于,所述计算机存储介质上存储有计算机程序,当所述计算机存储介质上的计算机程序被处理器执行时实现权利要求1-5任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111447892.6A CN113867991B (zh) | 2021-12-01 | 2021-12-01 | 一种基于信号槽的线程间的事件处理方法、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111447892.6A CN113867991B (zh) | 2021-12-01 | 2021-12-01 | 一种基于信号槽的线程间的事件处理方法、装置及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113867991A CN113867991A (zh) | 2021-12-31 |
CN113867991B true CN113867991B (zh) | 2022-02-25 |
Family
ID=78985515
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111447892.6A Active CN113867991B (zh) | 2021-12-01 | 2021-12-01 | 一种基于信号槽的线程间的事件处理方法、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113867991B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107329842A (zh) * | 2017-06-29 | 2017-11-07 | 福建新和兴信息技术有限公司 | 基于Qt信号槽机制的获取数据的方法及终端 |
CN108984317A (zh) * | 2018-06-21 | 2018-12-11 | 北京奇虎科技有限公司 | 进程间通信ipc的实现方法和装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7743377B2 (en) * | 2004-10-25 | 2010-06-22 | Microsoft Corporation | Cooperative threading in a managed code execution environment |
US7792805B2 (en) * | 2006-05-30 | 2010-09-07 | Oracle America, Inc. | Fine-locked transactional memory |
CN104092767B (zh) * | 2014-07-21 | 2017-06-13 | 北京邮电大学 | 一种增加消息队列模型的发布/订阅系统及其工作方法 |
CN107423142A (zh) * | 2017-06-28 | 2017-12-01 | 北京明朝万达科技股份有限公司 | 一种基于发布、订阅模式的数据库消息通知方法及系统 |
CN109408248B (zh) * | 2018-09-19 | 2021-12-24 | 福建星网智慧科技有限公司 | 一种Linux下线程间通信系统 |
-
2021
- 2021-12-01 CN CN202111447892.6A patent/CN113867991B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107329842A (zh) * | 2017-06-29 | 2017-11-07 | 福建新和兴信息技术有限公司 | 基于Qt信号槽机制的获取数据的方法及终端 |
CN108984317A (zh) * | 2018-06-21 | 2018-12-11 | 北京奇虎科技有限公司 | 进程间通信ipc的实现方法和装置 |
Non-Patent Citations (2)
Title |
---|
"Establishment of a strong mobility and inter thread communication in Alchemi grid bed";Mohammad Rostami等;《7th International Conference on e-Commerce in Developing Countries:with focus on e-Security》;20130715;第1-8页 * |
"基于dbus的QT进程间通信机制的实现与优化";周俊扬等;《广东通信技术》;20140131;第34卷(第253期);第23-26页 * |
Also Published As
Publication number | Publication date |
---|---|
CN113867991A (zh) | 2021-12-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104601696B (zh) | 服务处理方法、服务调用系统、装置和系统 | |
US8763012B2 (en) | Scalable, parallel processing of messages while enforcing custom sequencing criteria | |
CN108462598B (zh) | 一种日志生成方法、日志分析方法及装置 | |
CN105391772A (zh) | 业务请求处理方法、日志处理方法及装置 | |
US9836516B2 (en) | Parallel scanners for log based replication | |
US8190857B2 (en) | Deleting a shared resource node after reserving its identifier in delete pending queue until deletion condition is met to allow continued access for currently accessing processor | |
CN111930525B (zh) | Gpu资源使用方法、电子设备及计算机可读介质 | |
CN110928851A (zh) | 处理日志信息的方法、装置、设备及存储介质 | |
CN111553652B (zh) | 业务处理方法及装置 | |
CN112579515B (zh) | 线程消息处理方法及相关产品 | |
CN113867991B (zh) | 一种基于信号槽的线程间的事件处理方法、装置及存储介质 | |
CN113760242A (zh) | 一种数据处理方法、装置、服务器和介质 | |
CN112527519A (zh) | 一种高性能本地缓存方法、系统、设备及介质 | |
CN116016117A (zh) | 网络设备运维数据采集方法、系统、电子设备及存储介质 | |
CN114003203B (zh) | 一种活动计数变量的维护方法、装置、设备及可读介质 | |
CN115480934A (zh) | 一种分布式数据处理的方法、装置、设备及储存介质 | |
CN114116645A (zh) | 多处理单元的日志管理方法、装置、存储介质及电子设备 | |
CN113656374A (zh) | 带有附件的业务报文的处理方法及装置 | |
CN109783066B (zh) | 一种dds内部实体数据关联和处理的实现方法 | |
CN108874560B (zh) | 进行通信的方法和通信设备 | |
CN112286876A (zh) | 日志文件抓取方法、设备及计算机可读存储介质 | |
CN111752951B (zh) | 一种数据库表的处理方法及装置 | |
CN111124923B (zh) | 运行状态查询方法、装置、服务器设备及存储介质 | |
CN111625524B (zh) | 数据处理方法、装置、设备及存储介质 | |
CN111861381B (zh) | 多资金渠道的接入方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |