0

キヤノンのEDSDKとウェインハートマンのC#ラッパーを使用して、接続されたデジタル一眼レフカメラから一連の画像をキャプチャする小さなカメラキャプチャデーモンを構築しました。

takePhotograph()フォーム自体のテストボタンクリックハンドラーから呼び出すと、キャプチャは非常に確実に機能します。takePhotograph()ただし、から電話をかけようとするとsocketServer_MessageReceived()、信頼性が非常に低くなり、アプリが応答しなくなることがよくあります。EdsDownload()呼び出しスタックをトレースした後、呼び出しの順序全体が乱雑になり、最終的に(すべての画像がキャプチャされる前に)呼び出しが早すぎるとEDSDKがハングアップするように見えます。

私は非マルチスレッド環境(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.Invoke( ) で囲みましたthis.Invokeか? GUI から機能する場合は、呼び出しに正しいスレッドを強制したときにも機能する可能性があります。

于 2011-09-26T19:28:46.603 に答える