在DM脚本线程中阻止sdk包装函数

在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

我用DM3SDK编写了一个dll,其中包含一个阻塞函数(boost::asio::read(…)。我的目标是在另一个线程中实时使用传入的数据。 然而,据我所知,如果此SDK函数在DM脚本语言端作为线程执行,则在线程启动时,它不应冻结DM软件,甚至不应阻止DM脚本流。然而,情况就是这样。如何作为线程独立地执行函数而不阻塞

下面是一个简单的例子:

// $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$。