求教跨线程控制MCI播放音乐的问题

sky320 2016-04-09 06:57:48
请问为何新开的线程里无法控制主线程实例化的mciPlayer呢,求高人指点,谢谢!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace threadingPlay
{
public partial class Form1 : Form
{
public clsMCI mciPlayer = new clsMCI();
public System.Windows.Forms.Timer winTimer = new System.Windows.Forms.Timer();


public Form1()
{
InitializeComponent();
winTimer.Tick += this.eventPlay;
winTimer.Interval = 500;
}

private void eventPlay(object sender, EventArgs e)
{
this.winTimer.Stop();
this.mciPlayer.Play("connect.mp3");
}

private void button1_Click(object sender, EventArgs e)
{
Action dm = () =>
{
this.winTimer.Start();
MessageBox.Show(System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
};
dm.BeginInvoke(null, null);

}

private void button2_Click(object sender, EventArgs e)
{
mciPlayer.Stop();
MessageBox.Show(System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());
}


}

/// <summary>
/// clsMci 的摘要说明。
/// </summary>
public class clsMCI
{
public static uint SND_ASYNC = 0x0001;
public static uint SND_FILENAME = 0x00020000;
[DllImport("winmm.dll")]
public static extern uint mciSendString(string lpstrCommand,
string lpstrReturnString, uint uReturnLength, uint hWndCallback);

public void Play(string fileName)
{
mciSendString(@"close temp_alias", null, 0, 0);
mciSendString("open \"" + fileName + "\" alias temp_alias", null, 0, 0);
mciSendString("play temp_alias repeat", null, 0, 0);
}

public void Stop()
{
mciSendString("close all", null, 0, 0);
}
}

}
...全文
196 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky320 2017-08-29
  • 打赏
  • 举报
回复
有高人指点下不……先感谢啦。
sky320 2016-04-09
  • 打赏
  • 举报
回复
我最终的目的是这样的: 在HttpWebRequest异步连接的时候超过n秒钟就播放一个音乐,如果在n秒之前返回了或点击了终止按钮就停止连接和播放音乐。 现在我的播放操作都是在httpwebrequest这个子线程里面实现的,但是要在主线程来终止连接。 可能说的有些混乱,希望高人指点下思路。
sky320 2016-04-09
  • 打赏
  • 举报
回复
你好,我直接使用invoke报错了: 当前上下文中不存在名称“invoke” 你意思是不是使用类似于:textBox1.Invoke()这样执行呢? 我希望的是不和某控件捆绑使用,可能表达的不太正确,新手,谢谢。
tcmakebest 2016-04-09
  • 打赏
  • 举报
回复
那就让它在主线程执行, 这样:
        public void DoClick(object sender, EventArgs e)
        {
            if (InvokeRequired) // 是否需要远程调用
            {
                Invoke(new Action<object, EventArgs>(DoClick), sender, e); return;
            }
            /// 主线程的代码
        }
内容概要:本文围绕四旋翼飞行器在悬停状态下的控制问题,系统性地对比研究了三种经典控制策略——比例积分微分(PID)、线性二次型调节器(LQR)和模型预测控制(MPC)在响应品质与计算代价之间的权衡。研究基于四旋翼的线性化数学模型,分别设计并实现了这三种控制器,并依托Matlab仿真平台,对其控制性能(包括响应速度、稳定精度、抗干扰能力等动态特性)和计算资源消耗(涵盖运算时间、算法复杂度等实时性指标)进行了定量评估与基准测试。文章通过详尽的仿真数据分析,揭示了不同控制方法在性能表现与计算开销上的内在矛盾,旨在为无人机控制系统的设计者提供科学的选型依据,阐明各类控制范式在实际工程应用中的适用边界与优化方向。; 适合人群:具备自动控制理论基础、飞行器建模与仿真经验的研究生、科研人员及自动化、航空航天领域的工程师。; 使用场景及目标:① 掌握四旋翼飞行器线性化动力学建模方法;② 学习并对比PID、LQR、MPC三种控制器的设计流程与实现技巧;③ 深入理解控制系统中“响应品质”与“计算代价”这一核心矛盾,并学会进行工程权衡;④ 利用提供的Matlab代码进行复现、验证和进一步研究,以巩固理论知识并提升实践能力。; 阅读建议:此资源以Matlab代码实现为核心支撑,强调理论与实践的紧密结合。读者应在深入理解每种控制算法基本原理的基础上,重点动手运行和调试所提供的代码,通过修改关键参数、对比不同控制器的仿真结果来深化对各控制策略性能差异与适用场景的认识,从而真正掌握控制系统的分析、设计与优化方法。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧