直接录像的时候鼠标会变成漏斗,多线程也是漏斗?哪里除了问题?谢谢。
/// <summary>
/// 开始录像
/// </summary>
/// <param name="path">保存路径</param>
private void VideoBegin(string path)
{
SaveVideoFileDialog = new SaveFileDialog();
SaveVideoFileDialog.FileName = DateTime.Now.ToString("yyyyMMddhhmmss");
SaveVideoFileDialog.Filter = "*.avi|*.avi";
if (SaveVideoFileDialog.ShowDialog() == DialogResult.OK)
{
StartThread();
}
this.Cursor = Cursors.Arrow; } private void btnSaveVideo_Click(object sender, EventArgs e)
{
try
{
sum = 0;
StopThread();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 保存录像
/// </summary>
private void VideoSave()
{
// MainForm.SendMessage(hwndc, WM_CAP_STOP, 0, 0);
StopThread();
} public void ThreadStartVideo()
{ //由于多线程会不断的循环这个执行录像,所有有个标识来判断
// if (Video && timerThread != null && sum == 2)
if (timerThread != null && sum == 1)
{
//保存录像
SendMessage(hwndc, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, SaveVideoFileDialog.FileName);
//到了这里就会卡,多线程应该不会卡住才对啊??
SendMessage(hwndc, WM_CAP_SEQUENCE, 0, 0); }
sum += 1;
} /// <summary>
/// 更新线程
/// </summary>
public void UpdataThread()
{
try
{
//在对控件的调用方法进行调用时,或需要一个简单委托又不想自己定义时可以使用该委托。
MethodInvoker mi = new MethodInvoker(this.ThreadStartVideo);
while (true)
{ //在创建控件的基础句柄所在线程上异步执行指定的委托
this.BeginInvoke(mi);
Thread.Sleep(10); }
}
catch (ThreadInterruptedException)
{
//针对具体问题定制异常抛出显示
}
finally
{
//做一些处理
}
} /// <summary>
/// 启动线程
/// </summary>
public void StartThread()
{
StopThread();
timerThread = new Thread(new ThreadStart(UpdataThread));
//获取或设置一个值,该值指示某个线程是否为后台线程。
timerThread.IsBackground = true;
timerThread.Start();
Video = false;
} /// <summary>
/// 停止线程
/// </summary>
public void StopThread()
{
if (timerThread != null)
{
MainForm.SendMessage(hwndc, WM_CAP_STOP, 0, 0);
Video = true;
//中断线程
timerThread.Interrupt();
//杀死进程
timerThread.Abort();
timerThread = null;
}
}
/// <summary>
/// 开始录像
/// </summary>
/// <param name="path">保存路径</param>
private void VideoBegin(string path)
{
SaveVideoFileDialog = new SaveFileDialog();
SaveVideoFileDialog.FileName = DateTime.Now.ToString("yyyyMMddhhmmss");
SaveVideoFileDialog.Filter = "*.avi|*.avi";
if (SaveVideoFileDialog.ShowDialog() == DialogResult.OK)
{
StartThread();
}
this.Cursor = Cursors.Arrow; } private void btnSaveVideo_Click(object sender, EventArgs e)
{
try
{
sum = 0;
StopThread();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 保存录像
/// </summary>
private void VideoSave()
{
// MainForm.SendMessage(hwndc, WM_CAP_STOP, 0, 0);
StopThread();
} public void ThreadStartVideo()
{ //由于多线程会不断的循环这个执行录像,所有有个标识来判断
// if (Video && timerThread != null && sum == 2)
if (timerThread != null && sum == 1)
{
//保存录像
SendMessage(hwndc, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, SaveVideoFileDialog.FileName);
//到了这里就会卡,多线程应该不会卡住才对啊??
SendMessage(hwndc, WM_CAP_SEQUENCE, 0, 0); }
sum += 1;
} /// <summary>
/// 更新线程
/// </summary>
public void UpdataThread()
{
try
{
//在对控件的调用方法进行调用时,或需要一个简单委托又不想自己定义时可以使用该委托。
MethodInvoker mi = new MethodInvoker(this.ThreadStartVideo);
while (true)
{ //在创建控件的基础句柄所在线程上异步执行指定的委托
this.BeginInvoke(mi);
Thread.Sleep(10); }
}
catch (ThreadInterruptedException)
{
//针对具体问题定制异常抛出显示
}
finally
{
//做一些处理
}
} /// <summary>
/// 启动线程
/// </summary>
public void StartThread()
{
StopThread();
timerThread = new Thread(new ThreadStart(UpdataThread));
//获取或设置一个值,该值指示某个线程是否为后台线程。
timerThread.IsBackground = true;
timerThread.Start();
Video = false;
} /// <summary>
/// 停止线程
/// </summary>
public void StopThread()
{
if (timerThread != null)
{
MainForm.SendMessage(hwndc, WM_CAP_STOP, 0, 0);
Video = true;
//中断线程
timerThread.Interrupt();
//杀死进程
timerThread.Abort();
timerThread = null;
}
}
解决方案 »
- C#的datagridview使用checkbox控件如何实现选中的值传给打印功能
- c# winform中怎么生成时间格式的不重复的随机数?
- C# 将制定字符串(客户端)输入到指定网页的TextBox中
- C#向Excel报表中插入图片的2种方法
- 这样写有什么好处
- Java与C#之间共用数字证书时的问题。
- 请问怎么把一个C# winform DataGrid的内容写入EXCEL文件?不用Execl库文件.因为那个需要固定的OFFICE版本. 我已经找了很多天资料了.可是
- 急、急、急:有什么样的Grid能接收XML?不好意思,只有10分了
- 如何去掉一个文件名的后缀?
- datagrid导出到excel,怎么可以让显示的字段不是横向而是纵向?
- 一个关于URL重写的正则表达式配置问题
- C# 发送邮件
可以使用 PostMessage 把消息放入消息队列中,直接返回。