在DM脚本线程中阻止sdk包装函数
我用DM3SDK编写了一个dll,其中包含一个阻塞函数(boost::asio::read(…)。我的目标是在另一个线程中实时使用传入的数据。 然而,据我所知,如果此SDK函数在DM脚本语言端作为线程执行,则在线程启动时,它不应冻结DM软件,甚至不应阻止DM脚本流。然而,情况就是这样。如何作为线程独立地执行函数而不阻塞 下面是一个简单的例子:在DM脚本线程中阻止sdk包装函数,sdk,dm-script,Sdk,Dm Script,我用DM3SDK编写了一个dll,其中包含一个阻塞函数(boost::asio::read(…)。我的目标是在另一个线程中实时使用传入的数据。 然而,据我所知,如果此SDK函数在DM脚本语言端作为线程执行,则在线程启动时,它不应冻结DM软件,甚至不应阻止DM脚本流。然而,情况就是这样。如何作为线程独立地执行函数而不阻塞 下面是一个简单的例子: // $BACKGROUND$ number framenumber = 0 class testthread : thread { testth
// $BACKGROUND$
number framenumber = 0
class testthread : thread
{
testthread( Object self) Result("\n testthread (ID:"+self.ScriptObjectGetID()+") created.")
~testthread( Object self) Result("\n testthread (ID:"+self.ScriptObjectGetID()+") destroyed.")
void RunThread(object self)
{
SU_HostAcquisition(framenumber)
}
}
Class Dialog_UI : UIFrame
{
object acquisitionobj
void startpressed(object self)
{
self.startthread("CountingThread")
}
void CountingThread( object self)
{
Try
{
// some code here for stuff
acquisitionobj.StartThread()
// some other code here for other stuff
}
Catch
{
result("canceled... \n")
}
}
TagGroup CreateDialog_UI( object self )
{
TagGroup Dialog_UI = DLGCreateDialog("test")
taggroup startbutton=dlgcreatepushbutton("Start","startpressed").dlgidentifier("startbutton")
Dialog_UI.dlgaddelement(startbutton)
return Dialog_UI
}
object init(object self, object threadIn)
{
acquisitionobj = threadIn
return self.super.init(self.CreateDialog_UI())
}
Dialog_UI( object self )
{
self.super.init( self.CreateDialog_UI() )
number dialogID=self.ScriptObjectGetID()
result("\nDialog created with ID:"+dialogID)
}
~Dialog_UI( object self )
{
number dialogID=self.ScriptObjectGetID()
result("\nDialog with ID: "+dialogID+" destroyed.")
}
}
void main()
{
// Create the dialog
object obj = alloc(testthread)
object Dialog_UI = Alloc(Dialog_UI).init(obj)
Dialog_UI.Display("test")
Return
}
main()
SU_HostAcquisition(framenumber)是从创建的dll中获取的函数。因此,如果没有dll,这段代码将无法工作,但我想任何阻塞函数都可以
对我来说,另一个选择是在SDK端作为boost::thread对象启动线程。但是,我希望将函数参数作为引用(或指针)传递,以便在DM脚本端实时观察它的变化。通过将参数作为“*参数”传递,这在普通SDK函数中起作用。但在处理线程时,这似乎是不可能的。。。。例如,以下操作将不起作用,在DM脚本端,它将在hostthread()中以1更新命令值,但在hosttask中不更新命令值
unsigned long hosttask(uint32 &command1)
{
command++;
return 0;
}
void SU_HostThread(uint32 *command)
{
command++;
boost::thread Hostthread = boost::thread(boost::bind(boost::move(hosttask), boost::ref(*command) ));
return;
}
有什么想法吗
谢谢
编辑:::
我意识到我必须用SDK线程解决问题的第二部分,因为整个摄像头采集过程必须只在一个线程中定义。因此,问题实际上是如何确保在DM脚本接口中作为参数分配给SU_HostThread()的指针参数“command”实际上指向与分配给thread对象hosttask()的参数“command1”相同的地址。线程按值复制参数,确保该参数在线程的整个生命周期内都存在,从而为其分配新地址。通常,可以通过将参数指定为boost::ref(command)来覆盖该参数。但这在DM软件中显然不起作用。
谢谢你的帮助 不确定我是否正确地取消了所有调用,但是如果您用任何其他调用替换DLL调用,则上面的脚本可以工作(不阻止任何内容),请说“beep()”,对吗?所以问题是,你的SU_HostAcquisition()方法实际上在做什么?请注意,某些元素总是会出现在(DM的)主线程上,例如可能与某些相机/硬件相关的东西中与UI相关的东西。如果您的SU_HostAcquisition()只是一个块和一个调试输出,您是否也看到了问题?我编辑了这个问题。确定。很遗憾,我无法帮助您解决编辑后的问题。次要评论:您不需要在上面的脚本中使用//$BACKGROUND$。