0

我已经构建了一个小型相机捕捉守护程序,它使用佳能的 EDSDK 和韦恩哈特曼的 C# 包装器从附加的数码单反相机捕捉一系列图像。

takePhotograph()当我从表单本身的测试按钮单击处理程序中调用时,捕获效果非常好且非常可靠。但是,当我尝试从 调用takePhotograph()socketServer_MessageReceived(),它非常不可靠并且经常导致应用程序停止响应。跟踪调用堆栈后,看起来整个调用顺序都混乱了,最终导致 EDSDK 在EdsDownload()过早调用时挂起(在捕获所有图像之前)。

我来自非多线程环境(Flex/ActionScript),并且有一种预感,我只是在做一些与我的处理程序相关的基本错误。

这是我的代码的要点:

    private SocketServer socketServer;

    private void initSocketServer()
    {
        socketServer = new SocketServer();
        socketServer.Start( Convert.ToInt16( serverPortField.Text ) );
        socketServer.MessageReceived += new EventHandler<SocketEventArgs>( socketServer_MessageReceived );
    }

    private void socketServer_MessageReceived ( object sender , SocketEventArgs e )
    {
        Console.WriteLine( "[CaptureDaemon] socketServer_MessageReceived() >> " + (String)e.Data );

        var serializer = new JavaScriptSerializer();
        serializer.RegisterConverters( new[] { new DynamicJsonConverter() } );

        dynamic obj = serializer.Deserialize( (String)e.Data , typeof( object ) );

        if ( (String)obj.destinationID != "captureDaemon" )
            return;

        switch ( (String)obj.messageID )
        {
            case "capture":
                takePhotograph( obj.body.successiveShotDelay , obj.body.successiveShots );
                break;
        }
    }

    private void testCaptureButton_Click ( object sender , EventArgs e )
    {
        takePhotograph( 500 , 4 ) );
    }
4

1 回答 1

1

您是否尝试takePhotographForm.Invokethis.Invoke)包裹?如果它在 GUI 上工作,那么当您强制调用正确的线程时,它也有可能工作。

于 2011-09-26T19:28:46.603 回答