【问题标题】:showing 4 video at same time in c#在c#中同时显示4个视频
【发布时间】:2019-02-05 06:14:10
【问题描述】:

我想使用任务在 Windows 窗体中同时显示 4 个视频。我有 4 次视频播放点击。当我单击第一个视频播放按钮时,第一个视频播放,当我单击第二个视频播放按钮时,第二个视频播放和第一个视频继续同时播放。 但是,当我点击第三个视频播放按钮时;第一个视频停止,第二个视频和第三个视频同时播放。同样的,当我点击第四个视频播放按钮时,第二个视频停止,只有第三个和第四个视频同时播放。

我的代码:

private async void play1_Click(object sender, EventArgs e)
{
    string inputPath = textBox1.Text;
    await Task.Run(() => {
        ReadFrames1(inputPath); }); 
}

public void ReadFrames1(string inputPath)
{
    using (var vFReader = new VideoFileReader())
    {
        vFReader.Open(inputPath);
        for (int i = 0; i < vFReader.FrameCount; i++)
        {
            Bitmap videoFrame = vFReader.ReadVideoFrame();
            System.Drawing.Image pic = resizeImage(new Bitmap(videoFrame), new Size(305, 267));
            pictureBox1.Image = new Bitmap(pic);
        }
        vFReader.Dispose();
        vFReader.Close();
    }
}

play2_Click()play3_Click()play4_Click() 方法与play1_Click() 相同。 (我的意思是例如play2_Click() 方法调用ReadFrames2() 并显示在PictureBox2。)我错在哪里?

【问题讨论】:

  • 您无法从另一个线程访问 GUI 控件 (pictureBox)。您必须使用Invoke。见How to

标签: c# winforms task task-parallel-library


【解决方案1】:

对于通过 WinForms 进行多线程处理,请使用 BackgroundWorker

这是一个适合我的代码示例。希望对你有帮助:

public Form1()
    {
        InitializeComponent();
    }

    private BackgroundWorker CreateBackgroundWorker()
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += ReadFrames;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        return worker;
    }

    private void worker_RunWorkerCompleted(object sender,
        RunWorkerCompletedEventArgs e)
    {
        Button playButton = (Button) e.Result;
        playButton.Enabled = true;
    }

    private void ReadFrames(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker backgroundWorker = (BackgroundWorker) sender;
        (string path, PictureBox pictureBox, Button playButton) arguments = ((string, PictureBox, Button)) e.Argument;
        using(var vFReader = new VideoFileReader())
        {
            vFReader.Open(arguments.path);
            for (int i = 0; i < vFReader.FrameCount; i++)
            {
                arguments.pictureBox.Image = new Bitmap(vFReader.ReadVideoFrame(), arguments.pictureBox.Size);
            }
            vFReader.Dispose();
            vFReader.Close();
        }
        e.Result = arguments.playButton;
    }

    private void play1_Click(object sender, EventArgs e)
    {
        var worker = CreateBackgroundWorker();
        worker.RunWorkerAsync((textBox1.Text, pictureBox1, play1));
        play1.Enabled = false;
    }

    private void play2_Click(object sender, EventArgs e)
    {
        var worker = CreateBackgroundWorker();
        worker.RunWorkerAsync((textBox2.Text, pictureBox2, play2));
        play2.Enabled = false;
    }

    private void play3_Click(object sender, EventArgs e)
    {
        var worker = CreateBackgroundWorker();
        worker.RunWorkerAsync((textBox3.Text, pictureBox3, play3));
        play3.Enabled = false;
    }

    private void play4_Click(object sender, EventArgs e)
    {
        var worker = CreateBackgroundWorker();
        worker.RunWorkerAsync((textBox4.Text, pictureBox4, play4));
        play4.Enabled = false;
    }

【讨论】:

  • 谢谢,我会尽量了解Backgrounworker,然后写到这里。
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
相关资源
最近更新 更多