【问题标题】:Why is my code just stepping out of its logic? [duplicate]为什么我的代码只是跳出它的逻辑? [复制]
【发布时间】:2018-02-01 06:36:38
【问题描述】:

所以我正在使用我在网上找到的这个库,它应该可以让我的网络摄像头与 C# 一起使用变得超级容易,所以我决定试一试。 我正在模仿的项目是使用 WPF 或 WinForms,其中有两个。 我决定我想创建一个控制台版本,现在有一些小问题,关于控制和什么,但我似乎完全可以控制我面临的问题是它出于某种原因而超出了它的逻辑未知。

这就是它应该如何流动。 (在 WPF 中也是如此)

webcam.Start(); -> webcam.Start(0); Starts the webcam here -> webcam_ImageCaptured() -> LoadBitmap() -> webcam_ImageCaptured() -> LoadBitmap() -> webcam_ImageCaptured() and loop through those last two

这就是我的工作(控制台应用程序)

webcam.Start(); -> webcam.Start(0); Starts the webcam here -> and then it steps out of webcam.Start(); and closes.

我不知道它为什么会这样,我真的很想知道,一直在调试,但我似乎真的无法解开这里的谜团。

这是控制台应用程序主要

class Program
    {
        static WebCam webcam;

        static System.Windows.Controls.Image image = new System.Windows.Controls.Image();
        [STAThread]
        static void Main(string[] args)
        {
            webcam = new WebCam();
            webcam.InitializeWebCam(ref image);

            webcam.Start();
        }
    }

还有网络摄像头类https://ghostbin.com/paste/kvvx2

还有 Helper 类 https://ghostbin.com/paste/vk8qz

这是 WPF 应用程序的 Main

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        WebCam webcam;

        private void mainFrm_Loaded(object sender, RoutedEventArgs e)
        {
            webcam = new WebCam();
            webcam.InitializeWebCam(ref imgMain);
        }

        private void btnCapture_Click(object sender, RoutedEventArgs e)
        {
            webcam.Start();
        }
    }

这是我找到所有内容的原始帖子https://sites.google.com/site/webcamlibrarydotnet/wpf-and-csharp-sample-code-and-download

【问题讨论】:

  • 来自您下面的评论:“它不应该退出 webcam.Start();” - 为什么不呢?在 WPF 程序中,几乎可以肯定它确实如此,即 Start() 方法在被调用后不久返回。否则 UI 会冻结。那么,为什么你认为Start() 方法不应该在控制台程序场景中返回呢?
  • 并且需要明确的是,从您迄今为止发布的所有迹象来看,这只不过是 Main() 方法立即返回,导致程序退出,这是由标记的复制。如果您不这么认为,您需要改进问题,以便清楚为什么我们应该相信 Start() 方法应该阻止并保持程序运行。
  • @PeterDuniho 我正在并排调试它们,控制台应用程序在运行一次后关闭,而 WPF 版本没有退出,有没有办法可以使用控制台应用程序捕获帧以查看如果它甚至得到什么?
  • WPF 程序有一个事件泵送循环(对您隐藏...它在您自己的 App 类隐式调用的 Application.Run() 方法中),它使程序保持运行。您在 btnCapture_Click() 方法中调用 Start(),这显然是 WPF UI 中按钮上的 Click 事件的事件处理程序。该方法不是程序的入口点,Main() 的方式是控制台程序的入口点,因此从它返回不会像在控制台程序中从 Main() 返回的方式那样终止 WPF 程序.
  • @PeterDuniho 这解释了一些事情,我也尝试使用像 Helper.SaveImageCapture((BitmapSource)image.Source); 这样的 SaveImageCapture 但这让我在 encoder.Frames.Add(BitmapFrame.Create(bitmap)); 行出现错误,说 System.ArgumentNullException: 'Value cannot be null. Parameter name: source' 我很确定我投了我的image.Source 作为 BitmapSource

标签: c# .net wpf winforms webcam


【解决方案1】:

在控制台应用程序中,在末尾添加Console.ReadLine(),以便应用程序保持运行。

 static void Main(string[] args)
         {
             webcam = new WebCam();
             webcam.InitializeWebCam(ref image);

             webcam.Start();
             Console.ReadLine();
         }

然后确保您的 webcam_ImageCaptured - 事件正在触发。即使 Start 方法立即返回,它也可能被设计为不阻塞调用线程。

【讨论】:

  • 我做了,但是还是一直跳出来,不应该跳出webcam.Start();
  • 您是否在控制台应用程序中获得了那些 webcam_ImageCaptured - 事件。即使开始方法调用立即返回,也许相机仍在工作?
  • 它启动了网络摄像头,它打开是因为灯变绿了,虽然没有控件,但无法显示它,但我想也许将一个帧保存到剪贴板只是为了测试它.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2011-09-11
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多