求教跨线程控制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);
}
}

}
...全文
197 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;
            }
            /// 主线程的代码
        }
内容概要:本文围绕分布式电源接入对配电网的影响展开研究,利用Matlab进行建模仿真与代码实现,系统分析了分布式电源(如光伏、风电等)接入后对配电网在电能质量、潮流分布、电压稳定性、保护配置等方面的影响。研究涵盖了多种分布式电源类型与不同渗透率场景,通过构建典型的配电网模型,仿真其在正常运行及故障条件下的动态响应特性,重点探讨了分布式电源引起的电压越限、反向潮流、短路电流水平变化等问题,并提出了相应的优化调控策略与解决方案。同时,结合主动配电网的有功无功协调优化、鲁棒调度等高级应用,展示了如何借助现代优化算法提升系统接纳能力与运行经济性。; 适合人群:具备电力系统基础知识,熟悉Matlab/Simulink仿真环境,从事新能源接入、配电网规划与运行等相关领域的科研人员、工程师及高校研究生。; 使用场景及目标:①掌握分布式电源接入对配电网关键指标的影响机制;②学习基于Matlab的配电网建模与仿真方法;③理解并实现主动配电网的协调优化调度算法;④为实际工程中分布式电源并网方案设计与问题诊断提供理论支持和技术参考。; 阅读建议:建议读者结合文中提供的Matlab代码,逐步复现仿真案例,深入理解模型构建与算法实现细节,并尝试在不同参数设置或网络结构下进行拓展实验,以增强对系统动态行为的认知与分析能力。

111,128

社区成员

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

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

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