【发布时间】:2012-05-31 13:11:04
【问题描述】:
我的问题可能不是关于实时处理,但话又说回来,它可能是。
我的应用程序有几个比 GUI 重要得多的线程,但是,我确实希望 GUI 至少可以使用。我不希望它一直被锁定,我确实想根据我正在执行的处理结果更新屏幕。
目前我所有的基本项目都隔离在单独的线程中,我调用一个委托到我的 GUI 来显示结果。
我的 GUI 可以正常工作,但如果我更改选项卡或最小化/最大化它,已知会阻碍我的其他线程,使其无法在 0.1 秒的时间限制内执行操作。
这就是我打电话给我的代表的原因:
delegate void FuncDelegate(ResultContainer Result);
FuncDelegate DelegatedDisplay= new FuncDelegate(DisplayResults);
//then later on
Invoke(DelegatedDisplay, Result);
我的大部分关键进程都是在连续循环中运行的线程,从各种缓冲区(ArrayLists 和普通 Lists)拉入和推入。
每次都会启动我的一个关键线程,使用:
Thread mythread = new Thread(new ThreadStart(ProcessResults));
mythread.Start();
我想这样做的原因,而不是仅仅让一个线程在循环中运行,从列表中提取,是因为我认为我的时钟时间用完的原因可能是我担心有一个轮询循环消耗太多资源(尽管每次民意调查结果为负时我都使用 Thread.Sleep(5))。
每次我需要并发进程时启动一个新线程是否会花费我宝贵的时间?这应该是一个循环吗?应该怪我的循环吗?
我可以给一个线程比其他线程更高的优先级,还是使用 Thread.Sleep 是我唯一的选择?如果我确实分配了更高的线程优先级,我如何确定其他线程甚至可以生存?
为什么简单的表单事件会严重阻碍我的其他线程?有没有办法给我的 GUI 线程一个分配的、更少的资源?如果其他线程的时钟时间用完,我可以使用 Thread.Sleep 以某种方式阻止 Form 事件吗?
我所有令人沮丧的问题都没有得到答案,是否有某种线程分析器可以用来帮助解决我的问题?我尝试使用“托管堆栈资源管理器”,但不知何故,它并不总是显示我的应用程序有哪些线程。
在这件事上的任何帮助都会对我有很大帮助。
【问题讨论】:
-
您解决了这个问题吗?我想我遇到过类似的情况,打开-关闭-绘图窗口(甚至是其他进程)以某种方式停止了实时优先级线程。
-
@EugeneRyabtsev 不,这并没有真正“解决”。我正在使用“BeginInvoke”和“线程池”。两者都没有做出重大改进。有什么帮助是在处理关键事件后直接让部分关键线程进入睡眠状态。这样做的目的是释放周期时间,让不太关键的线程实际处理。我发现如果一个不太重要的线程必须等待太久,它最终会影响更高优先级的线程。
标签: c# winforms multithreading real-time