Непрерывное получение камеры в сопровождении немодального диалога с помощью dm-скрипта

Я хотел бы сделать сценарий DM для непрерывного получения изображений с камеры, например, в режиме VIEW. В моем плане непрерывное получение камеры начинается при нажатии кнопки START, расположенной в диалоговом окне UIframe; и немодальный диалог также отображается одновременно. Непрерывная регистрация прекращается при нажатии кнопки OK, расположенной в диалоговом окне. Я думаю, что для такого рода сценариев требуется фоновый поток. Тем не менее, у меня недостаточно знаний о таком фоновом беге.

Будет оценено, если вы поделитесь своей мудростью. Заранее большое спасибо.

2 ответа

Решение

Непрерывное обнаружение камеры на самом деле не имеет ничего общего с фоновым потоком в сценариях, а требует установки оборудования в режим непрерывного считывания. Эта функциональность до сих пор не поддерживается официальным скриптовым API.

Тем не менее, существует расширенный объектно-ориентированный API сценариев, который дает более глубокий контроль над камерами. Чтобы использовать его, вам нужно быть гибким в объектно-ориентированном стиле кодирования DM-сценариев, и вам нужно будет связаться с Gatan, чтобы получить доступ к этому API-интерфейсу сценария, поскольку он официально не поддерживается.

Вы можете использовать форму запроса поддержки на домашней странице Gatan для этого. (кнопка внизу страницы)

Подняв комментарий Качигуса к моему другому ответу....

Если вы хотите запустить псевдонепрерывный процесс медленного захвата камеры, то есть, выполняя повторяющиеся одиночные считывания в отдельном потоке, вы можете использовать структуру, подобную следующей:

class CMyBackgroundAction
{
    number isRunning
    CMyBackgroundAction(object self) { isRunning = 0; }     // Initialisation in constructor

    // methods to access flag from outside the object
    void StopRunning(object self) { isRunning  = 0; }
    number GetIsRunning(object self) { return isRunning; }

    // The stuff that should run in the background until the flag is set
    void RunUntilBreak(object self)
    {
        Result("\n\n StartRunning")
        isRunning = 1
        while (isRunning)
        {
            Result( "\n New line..." )
            sleep(0.5)
            Result( "....done" )
        }
        Result("\n\n FINISHED")
    }
}

class CmyDLG : UIframe
{
    object backGroundRunObj

    void OnStartStop( object self )
    {
        if ( !backGroundRunObj.GetIsRunning() )
        {
            // Nothing running in the background yet.
            backGroundRunObj.StartThread( "RunUntilBreak" )
            self.LookUpElement("StartStopButton").DLGTitle("Stop")
        }
        else
        {
            // It exists, so it is running. Just set the break-flag
            backgroundRunObj.StopRunning();
            self.LookUpElement("StartStopButton").DLGTitle("Start")
        }
    }

    TagGroup BuildDLG( object self )
    {
        TagGroup dlg, dlgitems
        dlg = DLGCreateDialog("StartStop",dlgItems)
        dlgItems.DLGAddElement( DLGCreatePushButton( "Start", "OnStartStop" ).DLGIdentifier("StartStopButton" ) )
        return dlg
    }
    Object Init(object self)
    {
        backGroundRunObj = Alloc(CMyBackgroundAction)
        self.super.Init( self.BuildDLG() )
        return self
    }
}

Alloc(CmyDLG).Init().Display("Test")

Конечно, есть несколько других конструкций с диалогом, управляющим отдельным потоком. Это всего лишь пример.

Если вы собираетесь запускать / останавливать что-то, что выполняется через очень регулярные промежутки времени, но требует основного потока, - другим вариантом будет регистрация / отмена регистрации периодических задач из диалогового окна. Вот пример:

class CMyBackgroundAction
{
    // The stuff that should run periodically
    void RunUntilBreak(object self)
    {
        Result("\n Doing action @" + GetTime(1) )
    }
}

class CmyDLG : UIframe
{
    object backGroundRunObj
    number taskID

    void OnStartStop( object self )
    {
        if ( 0 == taskID )
        {
            // Start by registering the task ( every 0.5 sec)
            taskID = AddMainThreadPeriodicTask(backGroundRunObj,"RunUntilBreak",0.5)
            Result("\n STARTED ")
            self.LookUpElement("StartStopButton").DLGTitle("Stop")
        }
        else
        {
            // Stop by removing the task
            RemoveMainThreadTask( taskID )
            Result("\n STOPPED ")
            taskID = 0
            self.LookUpElement("StartStopButton").DLGTitle("Start")
        }
    }

    TagGroup BuildDLG( object self )
    {
        TagGroup dlg, dlgitems
        dlg = DLGCreateDialog("StartStop",dlgItems)
        dlgItems.DLGAddElement( DLGCreatePushButton( "Start", "OnStartStop" ).DLGIdentifier("StartStopButton" ) )
        return dlg
    }
    Object Init(object self)
    {
        backGroundRunObj = Alloc(CMyBackgroundAction)
        taskID = 0
        return self.super.Init( self.BuildDLG() )
    }
}

Alloc(CmyDLG).Init().Display("Test")
Другие вопросы по тегам