блокирование функции оболочки SDK в потоке сценариев DM - PullRequest
0 голосов
/ 05 февраля 2020

Я написал dll с DM3 SDK, содержащим функцию блокировки (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, он обновит значение команды на 1 в hostthread (), но не в 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, поскольку весь процесс захвата камеры должен быть определен только в пределах одного потока. Следовательно, проблема в том, как убедиться, что аргумент указателя «команда», назначаемый в качестве аргумента SU_HostThread () в интерфейсе сценариев DM, фактически указывает на тот же адрес, что и аргумент «command1», назначенный потоку объект hosttask (). Boost :: thread копирует аргумент по значению, убеждаясь, что аргумент существует в течение всего времени жизни потока, следовательно, присваивая ему новый адрес. Обычно это можно перезаписать, назначив аргумент в виде boost :: ref (command). Но это не работает, видимо, в программном обеспечении DM. Спасибо за любую помощь!

...