CN110688203B - 一种任务执行方法和装置 - Google Patents
一种任务执行方法和装置 Download PDFInfo
- Publication number
- CN110688203B CN110688203B CN201810730340.8A CN201810730340A CN110688203B CN 110688203 B CN110688203 B CN 110688203B CN 201810730340 A CN201810730340 A CN 201810730340A CN 110688203 B CN110688203 B CN 110688203B
- Authority
- CN
- China
- Prior art keywords
- function
- thread
- task
- event
- calling
- 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
- 238000000034 method Methods 0.000 title claims abstract description 42
- 238000001514 detection method Methods 0.000 claims abstract description 6
- 230000006870 function Effects 0.000 claims description 231
- 238000004590 computer program Methods 0.000 claims description 18
- 238000010586 diagram Methods 0.000 description 11
- 230000004048 modification Effects 0.000 description 6
- 238000012986 modification Methods 0.000 description 6
- 230000004075 alteration Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000008569 process Effects 0.000 description 1
- 239000000725 suspension Substances 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
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/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供了一种任务执行方法,该方法包括:在第一线程中,通过任务队列函数获取第二线程的句柄;通过任务队列函数创建异步调用参数结构对象,异步调用参数结构对象包括任务成员和事件成员;将第一线程的目标任务的参数赋值给任务成员;创建初始状态为无信号的事件对象;将事件对象赋值给事件成员;通过任务队列函数根据第二线程的句柄将异步调用参数结构对象和异步调用例行程序函数投递到第二线程;通过任务队列函数调用等待函数来检测事件对象的信号状态;若有信号,任务队列函数执行返回操作;若无信号,任务队列函数再次调用等待函数检测事件对象的信号状态,直到目标任务完成。可以实现将第一线程的目标任务投递到第二线程中执行。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种任务执行方法和装置。
背景技术
在windows多线程的程序开发中,由于经常需要结合多线程进行工作,所以就有需要进行跨线程访问,所谓跨线程访问,就是被访问的线程需要为访问线程提供自己的方法,由访问线程来操作该方法,即在访问线程中调用被访问线程的方法来执行访问线程的目标任务。
然而,在某些特定功能的线程中,是绝对不能跨线程访问的,否则将引起整个程序的崩溃。例如Direct3D11的设备环境块接口ID3D11DeviceContext是不能跨线程访问的,否则很可能引起底层的驱动程序崩溃。
发明内容
本发明提供一种任务执行方法和装置,解决了现有技术中,对于不能跨进程访问的线程进行跨线程访问时,将引起的程序崩溃问题。
第一方面,本发明实施例提供了一种任务执行方法,所述方法包括:
在第一线程中,通过任务队列函数调用线程打开函数获取第二线程的句柄;
通过所述任务队列函数创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员和事件成员;
将所述第一线程的目标任务的参数赋值给所述任务成员;
创建事件对象,所述创建的事件对象的初始状态设置为无信号;
将所述事件对象赋值给所述事件成员;
通过所述任务队列函数根据所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述异步调用例行程序函数用于在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后,将所述事件成员中的事件对象设置为有信号;
通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态;
若所述事件对象为有信号,确定所述目标任务已完成,通过所述任务队列函数执行返回操作;
若在预置时间内所述事件对象为无信号,确定所述目标任务未完成,通过所述任务队列函数再次调用所述等待函数检测所述事件对象的信号状态,直到所述目标任务完成。
可选的,在所述通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态之前,还包括:
将所述等待函数中表示通知状态的参数设置为已通知状态,以使得所述第一线程处于可唤醒状态。
可选的,所述将所述等待函数中表示通知状态的参数设置为已通知状态,包括:
将所述等待函数的最后一个参数设置为true,所述最后一个参数为表示通知状态的参数。
可选的,所述通过所述任务队列函数按照所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,包括:
通过所述任务队列函数调用排队函数按照所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述排队函数包括三个参数,第一个参数设置为所述异步调用例行程序函数,第二个参数设置为所述第二线程的句柄,第三个参数设置为所述异步调用参数结构对象。
可选的,所述等待函数包括WaitForSingleObjectEx函数或SleepEx函数。
可选的,所述等待函数为WaitForSingleObjectEx函数,所述通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态,包括:
根据所述WaitForSingleObjectEx函数的返回值检测所述事件对象的信号状态;
若所述WaitForSingleObjectEx函数的返回值为WAIT_OBJECT_0,确定所述事件对象为有信号;
若所述WaitForSingleObjectEx函数的返回值为WAIT_IO_COMPLETION,确定所述事件对象为无信号。
可选的,所述通过所述任务队列函数创建异步调用参数结构对象,包括:
通过所述任务队列函数调用new操作符来创建异步调用参数结构对象。
第二方面,本发明实施例提供了一种任务执行装置,所述装置包括:
获取单元,用于在第一线程中,通过任务队列函数调用线程打开函数获取第二线程的句柄;
创建单元,用于通过所述任务队列函数创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员和事件成员;
赋值单元,用于将所述第一线程的目标任务的参数赋值给所述任务成员;
所述创建单元还用于创建事件对象,所述创建的事件对象的初始状态设置为无信号;
所述赋值单元还用于将所述事件对象赋值给所述事件成员;
投递单元,用于通过所述任务队列函数根据所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述异步调用例行程序函数用于在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后,将所述事件成员中的事件对象设置为有信号;
检测单元,用于通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态;
返回单元,用于若所述事件对象为有信号,确定所述目标任务已完成,通过所述任务队列函数执行返回操作;
所述检测单元还用于若在预置时间内所述事件对象为无信号,确定所述目标任务未完成,通过所述任务队列函数再次调用所述等待函数检测所述事件对象的信号状态,直到所述目标任务完成。
可选的,所述装置还包括:
设置单元,用于将所述等待函数中表示通知状态的参数设置为已通知状态,以使得所述第一线程处于可唤醒状态。
可选的,所述投递单元具体用于:
通过所述任务队列函数调用排队函数按照所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述排队函数包括三个参数,第一个参数设置为所述异步调用例行程序函数,第二个参数设置为所述第二线程的句柄,第三个参数设置为所述异步调用参数结构对象。
可选的,所述等待函数包括WaitForSingleObjectEx函数或SleepEx函数。
第三方面,本发明实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现上述任务执行方法的所有步骤。
第四方面,本发明实施例提供了一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现上述任务执行方法的所有步骤。
本发明实施例提供的任务执行方法包括:在第一线程中,通过任务队列函数调用线程打开函数获取第二线程的句柄;通过所述任务队列函数创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员和事件成员;将所述第一线程的目标任务的参数赋值给所述任务成员;创建事件对象,所述创建的事件对象的初始状态设置为无信号;将所述事件对象赋值给所述事件成员;通过所述任务队列函数根据所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述异步调用例行程序函数用于在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后,将所述事件成员中的事件对象设置为有信号;通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态;若所述事件对象为有信号,所述任务队列函数确定所述目标任务已完成,执行返回操作;若在预置时间内所述事件对象为无信号,确定所述目标任务未完成,所述任务队列函数再次调用所述等待函数检测所述事件对象的信号状态,直到所述目标任务完成。本发明实施例可以将第一线程的目标任务投递到第二线程中执行,解决了现有技术中,对于不能跨进程访问的线程进行跨线程访问时,将引起的程序崩溃问题。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例中任务执行方法的流程图;
图2为本申请实施例中任务执行装置的结构示意图;
图3为本申请实施例中计算机设备的结构示意图;
图4为本申请实施例中计算机可读存储介质的结构示意图。
具体实施方式
本发明实施例提的供一种用于任务执行方法及装置,可以将第一线程的目标任务投递到第二线程中执行,解决了现有技术中,对于不能跨进程访问的线程进行跨线程访问时,将引起的程序崩溃问题。
本发明实施例中的技术方案,总体思路如下:
在第一线程中,通过任务队列函数调用线程打开函数获取第二线程的句柄;通过所述任务队列函数创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员和事件成员;将所述第一线程的目标任务的参数赋值给所述任务成员;创建事件对象,所述创建的事件对象的初始状态设置为无信号;将所述事件对象赋值给所述事件成员;通过所述任务队列函数根据所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述异步调用例行程序函数用于在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后,将所述事件成员中的事件对象设置为有信号;通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态;若所述事件对象为有信号,所述任务队列函数确定所述目标任务已完成,执行返回操作;若在预置时间内所述事件对象为无信号,确定所述目标任务未完成,所述任务队列函数再次调用所述等待函数检测所述事件对象的信号状态,直到所述目标任务完成。本发明通过将第一线程的目标任务投递到第二线程中执行,解决了现有技术中,对于不能跨进程访问的线程进行跨线程访问时,将引起的程序崩溃问题。
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
实施例一
本发明实施例一提供一种任务执行方法,请参考图1,所述方法包括:
S101、在第一线程中,通过任务队列函数调用线程打开函数获取第二线程的句柄。
在Windows操作系统中,每个线程都有自己的APC(Asynchronous ProcedureCall,异步过程调用)队列,任何其他的线程可以调用排队函数QueueUserAPC将一个任务投递到该线程中。其中,排队函数QueueUserAPC的功能就是把一个APC对象加入到指定线程的APC队列中;若线程处于可唤醒状态,那么该线程就会执行APC队列中的所有任务。基于此,本实施例创建了任务队列函数QueueTaskUntilComplete,用于实现第一线程将目标任务投递到第二线程中执行,具体的,该任务队列函数的原型如下:
bool QueueTaskUntilComplete(int targetThreadId,const TaskRunCallback&cb)
其中,targetThreadId参数表示第二线程的线程id,cb参数表示第一线程的目标任务,该函数把目标任务cb投递到第二线程targetThreadId中,并且需要等待目标任务执行完成后,该函数才返回。
当第一线程调用任务队列函数实现将目标任务投递到第二线程中执行的过程中,先通过任务队列函数调用线程打开函数OpenThread,由该函数根据targetThreadId获取第二线程的句柄hThread。若不成功,OpenThread函数返回false并退出,若成功,继续执行步骤S102。
S102、通过所述任务队列函数创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员和事件成员。
具体的,所述任务队列函数通过调用new操作符,创建一个异步调用参数结构对象ApcParameter,该异步调用参数结构对象ApcParameter包括任务成员和事件成员,即cb成员和hEvent成员。
S103、将所述第一线程的目标任务的参数赋值给所述任务成员。
具体的,目标任务的参数为完成该目标任务需要用到的参数。
S104、创建事件对象,所述创建的事件对象的初始状态设置为无信号。
具体的,调用创建事件函数CreateEvent,创建一个事件对象,将该事件对象的初始状态设置为无信号,具体实现如下:
CreateEvent(NULL,FALSE,FALSE,NULL)
S105、将所述事件对象赋值给所述事件成员。
其中,事件成员中的事件对象用于判断目标任务是否完成,若事件对象为无信号,表示目标任务未完成,若事件对象为有信号,表示目标任务已完成。
S106、通过所述任务队列函数根据所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程。
具体的,调用排队函数QueueUserAPC根据第二线程的句柄hThread,将异步调用参数结构对象apc以及异步调用例行程序函数ApcRoutine投递到第二线程中。所述排队函数包括三个参数,第一个参数设置为所述异步调用例行程序函数,第二个参数设置为所述第二线程的句柄,第三个参数设置为所述异步调用参数结构对象,具体的实现如下:
QueueUserAPC(ApcRoutine,hThread,apc)
其中,异步调用例行程序函数用于在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后,将所述事件成员中的事件对象设置为有信号。
S107、通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态。
等待函数包括WaitForSingleObjectEx函数或SleepEx函数。其中,SleepEx函数可以用来中止当前线程运行直到指定的条件被触发;WaitForSingleObject函数可以用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的预置时间内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达预置时间,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。
进一步的,等待函数中表示通知状态的参数可以设置为已通知状态,具体的,可以将等待函数的最后一个参数设置为true,以使得第一线程处于可唤醒状态。当第一线程处于可唤醒状态,若其他线程向第一线程投递任务,第一线程仍然可以执行该任务,否则第一线程处于挂起状态,不会执行任何任务。这样就可以避免第一线程在等待第二线程完成目标任务的同时,若第二线程调用任务队列函数QueueTaskUntilComplete向第一线程投递任务,由于第一线程在等待第二线程,而第二线程又投递任务到第一线程,两个线程都在互相等待对方先完成任务,从而导致死锁的情况。
S108、若所述事件对象为有信号,确定所述目标任务已完成,所述任务队列函数执行返回操作。
具体的,以等待函数为WaitForSingleObjectEx函数为例,若等待函数检测到事件成员为有信号,则返回WAIT_OBJECT_0,任务队列函数根据所述等待函数的返回值为WAIT_OBJECT_0,确定所述目标任务已完成,所述任务队列函数执行返回操作。具体的,任务队列函数将第二线程执行目标任务的结果返回给第一线程。
S109、若在预置时间内所述事件对象为无信号,确定所述目标任务未完成,所述任务队列函数再次调用所述等待函数检测所述事件对象的信号状态,直到所述目标任务完成。
同样的,以等待函数为WaitForSingleObjectEx函数为例,当等待函数在预置时间内未检测到事件成员有信号,则返回WAIT_IO_COMPLETION,任务队列函数根据所述等待函数的返回值为WAIT_IO_COMPLETION,确定所述目标任务未完成,未完成的原因有可能为目标任务正在执行中暂未完成,或者第二线程在执行其他任务,目标任务还在队列中等待被处理等。由于等待函数已经返回,所以任务队列函数需要再次调用等待函数检测所述事件对象的信号状态,直到所述目标任务完成。
本实施例中,在第一线程中,通过任务队列函数调用线程打开函数获取第二线程的句柄;通过所述任务队列函数创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员和事件成员;将所述第一线程的目标任务的参数赋值给所述任务成员;创建事件对象,所述创建的事件对象的初始状态设置为无信号;将所述事件对象赋值给所述事件成员;通过所述任务队列函数根据所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述异步调用例行程序函数用于在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后,将所述事件成员中的事件对象设置为有信号;通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态;若所述事件对象为有信号,所述任务队列函数确定所述目标任务已完成,执行返回操作;若在预置时间内所述事件对象为无信号,确定所述目标任务未完成,所述任务队列函数再次调用所述等待函数检测所述事件对象的信号状态,直到所述目标任务完成。本实施例可以将第一线程的目标任务投递到第二线程中执行,解决了现有技术中,对于不能跨进程访问的线程进行跨线程访问时,将引起的程序崩溃问题。
进一步的,本实施例中,通过将等待函数中表示通知状态的参数可以设置为已通知状态,以使得第一线程处于可唤醒状态,可以避免线程死锁。
基于同一发明构思,本发明实施例还提供了与实施例一中方法对应的装置,见实施例二。
实施例二
本发明实施例二提供了一种任务执行装置,请参考图2,所述装置包括:
获取单元201,用于在第一线程中,通过任务队列函数调用线程打开函数获取第二线程的句柄;
创建单元202,用于通过所述任务队列函数创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员和事件成员;
赋值单元203,用于将所述第一线程的目标任务的参数赋值给所述任务成员;
所述创建单元202还用于创建事件对象,所述创建的事件对象的初始状态设置为无信号;
所述赋值单元203还用于将所述事件对象赋值给所述事件成员;
投递单元204,用于通过所述任务队列函数根据所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述异步调用例行程序函数用于在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后,将所述事件成员中的事件对象设置为有信号;
检测单元205,用于通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态;
返回单元206,用于若所述事件对象为有信号,确定所述目标任务已完成,通过所述任务队列函数执行返回操作;
所述检测单元205还用于若在预置时间内所述事件对象为无信号,确定所述目标任务未完成,通过所述任务队列函数再次调用所述等待函数检测所述事件对象的信号状态,直到所述目标任务完成。
在一些可能的实现方式中,所述装置还包括:
设置单元,用于将所述等待函数中表示通知状态的参数设置为已通知状态,以使得所述第一线程处于可唤醒状态。
在一些可能的实现方式中,所述投递单元204具体用于:
通过所述任务队列函数调用排队函数按照所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述排队函数包括三个参数,第一个参数设置为所述异步调用例行程序函数,第二个参数设置为所述第二线程的句柄,第三个参数设置为所述异步调用参数结构对象。
在一些可能的实现方式中,所述等待函数包括WaitForSingleObjectEx函数或SleepEx函数。
本实施例中,在第一线程中,获取单元201通过任务队列函数调用线程打开函数获取第二线程的句柄;创建单元202通过所述任务队列函数创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员和事件成员;赋值单元203将所述第一线程的目标任务的参数赋值给所述任务成员;创建单元202创建事件对象,所述创建的事件对象的初始状态设置为无信号;所述赋值单元203将所述事件对象赋值给所述事件成员;投递单元204通过所述任务队列函数根据所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述异步调用例行程序函数用于在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后,将所述事件成员中的事件对象设置为有信号;检测单元205通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态;若所述事件对象为有信号,返回单元206确定所述目标任务已完成,通过所述任务队列函数执行返回操作;若在预置时间内所述事件对象为无信号,检测单元205确定所述目标任务未完成,通过所述任务队列函数再次调用所述等待函数检测所述事件对象的信号状态,直到所述目标任务完成。本实施例可以将第一线程的目标任务投递到第二线程中执行,解决了现有技术中,对于不能跨进程访问的线程进行跨线程访问时,将引起的程序崩溃问题。
由于本发明实施例二所介绍的装置,为实施本发明实施例一的任务执行方法所采用的装置,故而基于本发明实施例一所介绍的方法,本领域所属人员能够了解该装置的具体结构及变形,故而在此不再赘述。凡是本发明实施例一的方法所采用的装置都属于本发明所欲保护的范围。
实施例三
基于同一发明构思,本实施例提供了一种计算机设备300,如图3所示,包括存储器310、处理器320及存储在存储器310上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时,可以实现上述实施例一的所有步骤,故而在此不再赘述。
实施例四
基于同一发明构思,本实施例提供一种计算机可读存储介质400,如图4所示,其上存储有计算机程序411,该计算机程序411被处理器执行时,可以实现上述实例一的所有步骤,故而在此不再赘述。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (9)
1.一种任务执行方法,其特征在于,所述方法包括:
在第一线程中,通过任务队列函数调用线程打开函数获取第二线程的句柄;
通过所述任务队列函数创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员和事件成员;
将所述第一线程的目标任务的参数赋值给所述任务成员;
创建事件对象,所述创建的事件对象的初始状态设置为无信号;
将所述事件对象赋值给所述事件成员;
通过所述任务队列函数根据所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述异步调用例行程序函数用于在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后,将所述事件成员中的事件对象设置为有信号;
通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态;
若所述事件对象为有信号,确定所述目标任务已完成,通过所述任务队列函数执行返回操作;
若在预置时间内所述事件对象为无信号,确定所述目标任务未完成,通过所述任务队列函数再次调用所述等待函数检测所述事件对象的信号状态,直到所述目标任务完成;
所述通过所述任务队列函数按照所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,包括:
通过所述任务队列函数调用排队函数按照所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述排队函数包括三个参数,第一个参数设置为所述异步调用例行程序函数,第二个参数设置为所述第二线程的句柄,第三个参数设置为所述异步调用参数结构对象。
2.根据权利要求1所述的方法,其特征在于,在所述通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态之前,还包括:
将所述等待函数中表示通知状态的参数设置为已通知状态,以使得所述第一线程处于可唤醒状态。
3.根据权利要求2所述的方法,所述将所述等待函数中表示通知状态的参数设置为已通知状态,包括:
将所述等待函数的最后一个参数设置为true,所述最后一个参数为表示通知状态的参数。
4.根据权利要求1所述的方法,其特征在于,所述等待函数包括WaitForSingleObjectEx函数或SleepEx函数。
5.根据权利要求4所述的方法,其特征在于,所述等待函数为WaitForSingleObjectEx函数,所述通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态,包括:
根据所述WaitForSingleObjectEx函数的返回值检测所述事件对象的信号状态;
若所述WaitForSingleObjectEx函数的返回值为WAIT_OBJECT_0,确定所述事件对象为有信号;
若所述WaitForSingleObjectEx函数的返回值为WAIT_IO_COMPLETION,确定所述事件对象为无信号。
6.根据权利要求1-5任一项所述的方法,所述通过所述任务队列函数创建异步调用参数结构对象,包括:
通过所述任务队列函数调用new操作符来创建异步调用参数结构对象。
7.一种任务执行装置,其特征在于,所述装置包括:
获取单元,用于在第一线程中,通过任务队列函数调用线程打开函数获取第二线程的句柄;
创建单元,用于通过所述任务队列函数创建异步调用参数结构对象,所述异步调用参数结构对象包括任务成员和事件成员;
赋值单元,用于将所述第一线程的目标任务的参数赋值给所述任务成员;
所述创建单元还用于创建事件对象,所述创建的事件对象的初始状态设置为无信号;
所述赋值单元还用于将所述事件对象赋值给所述事件成员;
投递单元,用于通过所述任务队列函数根据所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述异步调用例行程序函数用于在所述第二线程中基于所述任务成员执行所述目标任务,并在所述目标任务执行完成后,将所述事件成员中的事件对象设置为有信号;
检测单元,用于通过所述任务队列函数调用等待函数来检测所述事件对象的信号状态;
返回单元,用于若所述事件对象为有信号,确定所述目标任务已完成,通过所述任务队列函数执行返回操作;
所述检测单元还用于若在预置时间内所述事件对象为无信号,确定所述目标任务未完成,通过所述任务队列函数再次调用所述等待函数检测所述事件对象的信号状态,直到所述目标任务完成;
所述投递单元还用于:通过所述任务队列函数调用排队函数按照所述第二线程的句柄将所述异步调用参数结构对象和异步调用例行程序函数投递到所述第二线程,所述排队函数包括三个参数,第一个参数设置为所述异步调用例行程序函数,第二个参数设置为所述第二线程的句柄,第三个参数设置为所述异步调用参数结构对象。
8.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至权利要求6 任一项权利要求所述的方法。
9.一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至权利要求6 任一项权利要求所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810730340.8A CN110688203B (zh) | 2018-07-05 | 2018-07-05 | 一种任务执行方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810730340.8A CN110688203B (zh) | 2018-07-05 | 2018-07-05 | 一种任务执行方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110688203A CN110688203A (zh) | 2020-01-14 |
CN110688203B true CN110688203B (zh) | 2022-05-13 |
Family
ID=69107349
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810730340.8A Active CN110688203B (zh) | 2018-07-05 | 2018-07-05 | 一种任务执行方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110688203B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111522605B (zh) * | 2020-04-16 | 2022-07-29 | 艾普阳科技(深圳)有限公司 | 一种本地过程调用方法、装置、设备及介质 |
CN112698963B (zh) * | 2020-12-22 | 2024-06-07 | 新华三技术有限公司成都分公司 | 一种事件通知方法及装置 |
CN114356559A (zh) * | 2021-12-22 | 2022-04-15 | 青岛海信移动通信技术股份有限公司 | 一种多线程控制方法及终端设备 |
CN117112235B (zh) * | 2023-10-19 | 2024-06-14 | 苏州元脑智能科技有限公司 | 任务执行方法及装置 |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102567111A (zh) * | 2011-12-23 | 2012-07-11 | 深圳市融创天下科技股份有限公司 | 一种异步过程调用的方法、系统和终端设备 |
CN103019806A (zh) * | 2011-09-22 | 2013-04-03 | 北京新媒传信科技有限公司 | 一种异步任务处理方法和装置 |
CN104360904A (zh) * | 2014-10-16 | 2015-02-18 | 四川长虹电器股份有限公司 | 基于事件总线的模块间消息传递机制 |
US9342384B1 (en) * | 2014-12-18 | 2016-05-17 | Intel Corporation | Function callback mechanism between a central processing unit (CPU) and an auxiliary processor |
CN106371921A (zh) * | 2016-08-31 | 2017-02-01 | 成都科来软件有限公司 | 一种多线程分析的均衡分流方法 |
CN106933687A (zh) * | 2017-03-13 | 2017-07-07 | 武汉斗鱼网络科技有限公司 | 定时方法、装置及电子设备 |
CN107291559A (zh) * | 2017-06-30 | 2017-10-24 | 武汉斗鱼网络科技有限公司 | 一种控制cpu线程和gpu线程同步的方法及装置 |
US9830206B2 (en) * | 2013-12-18 | 2017-11-28 | Cray Inc. | Cross-thread exception handling |
CN107526645A (zh) * | 2017-09-06 | 2017-12-29 | 武汉斗鱼网络科技有限公司 | 一种通信优化方法及系统 |
CN107688502A (zh) * | 2017-08-18 | 2018-02-13 | 苏州科达特种视讯有限公司 | 进程间通信方法及装置 |
CN107766137A (zh) * | 2017-10-16 | 2018-03-06 | 北京京东尚科信息技术有限公司 | 一种任务处理方法和装置 |
-
2018
- 2018-07-05 CN CN201810730340.8A patent/CN110688203B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103019806A (zh) * | 2011-09-22 | 2013-04-03 | 北京新媒传信科技有限公司 | 一种异步任务处理方法和装置 |
CN102567111A (zh) * | 2011-12-23 | 2012-07-11 | 深圳市融创天下科技股份有限公司 | 一种异步过程调用的方法、系统和终端设备 |
US9830206B2 (en) * | 2013-12-18 | 2017-11-28 | Cray Inc. | Cross-thread exception handling |
CN104360904A (zh) * | 2014-10-16 | 2015-02-18 | 四川长虹电器股份有限公司 | 基于事件总线的模块间消息传递机制 |
US9342384B1 (en) * | 2014-12-18 | 2016-05-17 | Intel Corporation | Function callback mechanism between a central processing unit (CPU) and an auxiliary processor |
CN106371921A (zh) * | 2016-08-31 | 2017-02-01 | 成都科来软件有限公司 | 一种多线程分析的均衡分流方法 |
CN106933687A (zh) * | 2017-03-13 | 2017-07-07 | 武汉斗鱼网络科技有限公司 | 定时方法、装置及电子设备 |
CN107291559A (zh) * | 2017-06-30 | 2017-10-24 | 武汉斗鱼网络科技有限公司 | 一种控制cpu线程和gpu线程同步的方法及装置 |
CN107688502A (zh) * | 2017-08-18 | 2018-02-13 | 苏州科达特种视讯有限公司 | 进程间通信方法及装置 |
CN107526645A (zh) * | 2017-09-06 | 2017-12-29 | 武汉斗鱼网络科技有限公司 | 一种通信优化方法及系统 |
CN107766137A (zh) * | 2017-10-16 | 2018-03-06 | 北京京东尚科信息技术有限公司 | 一种任务处理方法和装置 |
Non-Patent Citations (3)
Title |
---|
"Security monitor inlining and certification for multithreaded Java";Mads Dam;《Mathematical Structures in Computer Science》;20141217;第25卷(第3期);第528-565页 * |
"Win32环境下的多线程同步技术的研究";许斌龙;《计算机技术与发展》;20130929;第23卷(第12期);第26-29页 * |
"跨进程边界共享内核对象";XiaoF-C;《https://www.cnblogs.com/XiaoF-C/p/3842401.html》;20140714;第1-3页 * |
Also Published As
Publication number | Publication date |
---|---|
CN110688203A (zh) | 2020-01-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110688203B (zh) | 一种任务执行方法和装置 | |
KR102333341B1 (ko) | 마이크로프로세서 시스템에서의 예외 처리 | |
US10664318B2 (en) | Method and apparatus for allocating computing resources of processor | |
US20140007107A1 (en) | Concurrent execution of a computer software application along multiple decision paths | |
WO2016164155A1 (en) | Coalition based memory management | |
CN107479981B (zh) | 一种基于异步调用实现同步调用的处理方法及装置 | |
CN108762905B (zh) | 一种多任务事件的处理方法和装置 | |
CN113010275A (zh) | 一种中断处理方法和装置 | |
US8528006B1 (en) | Method and apparatus for performing real-time commands in a non real-time operating system environment | |
CN109240811B (zh) | 一种任务执行方法和装置 | |
EP3208709A1 (en) | Batch processing method and device for system invocation commands | |
CN111858038A (zh) | Fpga板卡内存数据的读取方法、装置及介质 | |
CN106020984B (zh) | 电子设备中进程的创建方法及装置 | |
CN111666141A (zh) | 任务调度方法、装置、设备及计算机存储介质 | |
JP2020053013A (ja) | 要求処理方法及び装置 | |
CN114327894A (zh) | 资源分配方法、装置、电子设备及存储介质 | |
US20160077948A1 (en) | Method and system for monitoring health of a virtual environment | |
CN109324916B (zh) | 一种任务执行方法和装置 | |
CN110704203B (zh) | 一种可中断的远程过程调用方法及装置 | |
US9348667B2 (en) | Apparatus for managing application program and method therefor | |
CN115454576B (zh) | 一种虚拟机进程管理方法、系统及电子设备 | |
CN112988355B (zh) | 程序任务的调度方法、装置、终端设备及可读存储介质 | |
CN106980555B (zh) | 一种超时线程处理方法及装置 | |
US11307974B2 (en) | Horizontally scalable distributed system for automated firmware testing and method thereof | |
EP3968156A1 (en) | Multi-thread exiting method and mobile terminal |
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 | ||
TR01 | Transfer of patent right |
Effective date of registration: 20231225 Address after: Room 3605, Floor 5, Building 3, Micro World, No. 23, Century Avenue, Liuwu New District, Lhasa, Xizang Autonomous Region, 850000 Patentee after: Tibet Fengzikai Industrial Co.,Ltd. Address before: 430000 East Lake Development Zone, Wuhan City, Hubei Province, No. 1 Software Park East Road 4.1 Phase B1 Building 11 Building Patentee before: WUHAN DOUYU NETWORK TECHNOLOGY Co.,Ltd. |
|
TR01 | Transfer of patent right |