解决方案 »
- 有个想法,不知道,有没有可行性,高手来帮我看下
- WMI C# 求助!!
- Rational XDE 2003版本跟VS2005兼容吗?
- Gridview取隐藏列值
- cs中如何把改变Label中指定位置的文本的颜色其它的不变
- 使用timer 控件 和serialport 控件 动态刷新5个不同的显示控件 遇到问题
- 有关邮件发送的问题,请各位帮帮忙!
- 怎样一次性从文本文件中读取多个数据并赋值给多个float型变量
- 想请教一个问题,关于网站反向代理的问题。。。
- Office Oline Server如何做到只提供网址就可以预览和编辑?
- 怎么让div层固定在屏幕中间,不随滚动条拖动而不见了。
- 类型对象方法表的生成时间?
在线程中凡是设计UI的,需要使用委托来处理。
给个简单的示例:public class MyForm : System.Windows.Forms.Form {
//UI 元素
private Label lblStatus;
private ProgressBar progressBar1; //Delegate
private delegate void MyProgressEventsHandler(
object sender, MyProgressEvents e);
private void UpdateUI(object sender, MyProgressEvents e) {
lblStatus.Text = e.Msg;
myProgressControl.Value = e.PercentDone;
} //ShowProgress 现在可以记录为可从任何线程调用的公共方法。
public void ShowProgress(string msg, int percentDone)
{
if(InvokeRequired)
{
System.EventArgs e = new MyProgressEvents(msg, percentDone);
object[] pList = { this, e }; BeginInvoke(new MyProgressEventsHandler(UpdateUI), pList);
}
else
{
UpdateUI(this, new MyProgressEvents(msg,
PercentDone));
}
} private void btnStart_Click(object sender, EventArgs e)
{
//启动线程
Thread t = new Thread(new ParameterizedThreadStart(RunsOnWorkerThread));
t.IsBackground = true;
t.Start(input);
} //线程执行函数
private void RunsOnWorkerThread()
{
int i = 0;
while(...) //loop
{
DoSomethingSlow();
ShowProgress("test",i);
++i;
}
}
}
就可以了
就可以了这样的话对程序的性能影响大不大?
将录音线程独立出来吧,通过queue在窗体和录音线程间传递数据,别忘加锁。
其他的绘图什么的都在Form中实现好了。
还有,你是通过什么录音的?
DirectX录音是两块缓冲器交替录音,一块缓冲器满的时候有消息通知的,这样你都不用使用多线程,在消息处理中处理数据就可以了。
就可以了这样的话对程序的性能影响大不大?
看处理数据量来定影响,如果每秒处理的数据量很小,
如几百笔,那没有影响。
谢谢你的回复 现在我把我的问题抽象成几行简单的代码 发一下希望能给小弟解决一下啊 主要就是委托这个地方还不是太会用
FORM 类里面的代码如下public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Run R = new Run();
private void button1_Click(object sender, EventArgs e)
{
R.star();
}
public void draw()
{
Graphics g = panel1.CreateGraphics();
Pen p = new Pen(Color.Red, 2);
g.DrawLine(p, 10, 40, 20, 60);
}
}
下面是Run这个类class Run
{
public void star()
{
loop();
}
private void loop()
{
while (true)
{
int i = 0;
i = i + 1;
Form1 f = new Form1();
Thread t = new Thread(f.draw);
t.Start();
}
}
}我的像在界面的panel上面画图 但是就是画不上去
你好,我是在读取缓冲区内容的时候,调用forn中的画图方法的,其实不需要另起一个线程开始这个方法也可以,我只是怕会录音阻塞。
谢谢你的回复 现在我把我的问题抽象成几行简单的代码 发一下希望能给小弟解决一下啊 主要就是委托这个地方还不是太会用
FORM 类里面的代码如下public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Run R = new Run();
private void button1_Click(object sender, EventArgs e)
{
R.star();
}
public void draw()
{
Graphics g = panel1.CreateGraphics();
Pen p = new Pen(Color.Red, 2);
g.DrawLine(p, 10, 40, 20, 60);
}
}
下面是Run这个类class Run
{
public void star()
{
loop();
}
private void loop()
{
while (true)
{
int i = 0;
i = i + 1;
Form1 f = new Form1();
Thread t = new Thread(f.draw);
t.Start();
}
}
}我的像在界面的panel上面画图 但是就是画不上去Run类写的有问题,数据和界面要分离,
在线程中启动form 的设计有问题。更何况,run函数写在while里面,看不到while终止或者跳出的处理,也看不到sleep,
一旦运行,就和病毒一样,一直把内存消耗完挂掉为止。