Непрерывное получение камеры в сопровождении немодального диалога с помощью 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")