我在ac#程序中使用线程,但是线程运行的进程,调用另一个函数,它有一个锁定程序的无限循环,如果我点击另一个选项Windows窗体(例如:关闭等)将不再响应。
必需中的此循环,到目前为止,无法更改。
有没有办法让我可以像“背景”一样运行这个循环并仍然使用程序中的其他选项,这是:循环不会阻止进程(我不喜欢在线程内部使用线程!)。
Main Program
|
-------Thread(Function)
|
--------In the function ANOTHER
function is called with
an infinite loop inside
(this loop is NOT part of the
Thread function directly)
编辑:添加一些示例代码:
//Here I call the threads
private void userTest_Click(object sender, EventArgs e)
{
for (int i = 0; i < numberOfDevices; i++)
{
try
{
Thread t = new Thread(unused => device(i, sender, e));
t.IsBackground = true;
t.Start();
}
catch (ThreadStateException f)
{
MessageBox.Show("ERROR:" + f); // Display text of exception
}
}
}
线程功能:
//This infinite loop is useless, so it could be deleted. This is not
// the loop I´m talking about
public void device(object i, object s, object f)
{
while (true)
{
if (!killEm)
{
int j = (int)i;
EventArgs g = (EventArgs)f;
BSSDK.BS_SetDeviceID(m_ConnectedDeviceHandle[j],
m_ConnectedDeviceID[j], m_ConnectedDeviceType[j]);
UserManagement userTest = new UserManagement();
userTest.SetDevice(m_ConnectedDeviceHandle[j],
m_ConnectedDeviceID[j], m_ConnectedDeviceType[j]);
userTest.ShowDialog();
}
else
{
userTest.Dispose();
MessageBox.Show("Why don´t u kill it!!?");
break;
}
}
}
在 userTest.ShowDialog()函数中,我正在谈论无限循环
编辑这是 userTest.ShowDialog()
中调用的函数的一部分private void user_Click(object sender, EventArgs e) {
//THIS IS THE LOOP I´M TALKING!
while (true) {
Keep listening for an user put his finger in the device
...
Do things with that finger template
...
}
}
谢谢。
答案 0 :(得分:2)
好;这是个好消息:你根本不需要线程。你在这里基本上拥有的是'forms'形式的常规Windows Forms组件。这些表格必须保持“活跃”,以响应事件。但是,您不需要创建线程来执行此操作。
关键是System.Windows.Forms.Application
静态类,它具有为此所需的功能量身定制的功能。
System.Windows.Forms.Application.Run();
此方法允许您的Form
对象运行,响应事件,而不会让其调用的函数继续运行。它“阻止”,让消息泵响应,直到调用Application.Exit()
或其他类似的方法。
您要做的是创建所有表单,然后依次为每个表单调用Show()
(不 ShowDialog()
),然后最后调用Application.Run()
。这可以让你得到你想要的东西。
为了结束你的程序,你需要在某个地方打电话Application.Exit()
,以回应某些事情。您有两个选项可以快速为您服务:
Application.Exit()
,可能是在遍历所有用户管理表单并关闭它们之后。例如,您可以使用控件表单的Form.OnClosing
事件中的事件来执行此操作。Form.OnClosing
事件添加一个事件,以检查最后一个事件何时关闭(或者可能是否已关闭其中任何一个?),如上所述,调用Application.Exit()
那里。一旦你打电话给Application.Exit()
,任何打开的表格都应该被拆除(我建议先手动完成......)然后你在Application.Run()
主线程中的通话就会完成,这样就可以了程序继续...我们推测,结束。
<小时/> 编辑:旧答案,后人......
您正在错误的位置创建新主题。
不要为第二个窗口创建新线程。相反,为长时间运行的任务创建一个新线程,并确保将其设置为后台线程,因此即使关闭窗口它也不会保持活动状态。
理想情况下,这个循环应该有一种优雅的取消方式,但你似乎建议你不能触摸那个代码......
击>
答案 1 :(得分:0)
你应该避免繁忙的循环,为什么你不能在一些睡眠或暂停系统调用上循环?
答案 2 :(得分:0)
除了这个好主意之外,您是否尝试过BackgroundWorker?
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=VS.80).aspx
答案 3 :(得分:0)
您可以创建新帖子http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx
或
使用计时器可能会获得批准http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=vs.71%29.aspx
答案 4 :(得分:0)
这与线程无关 - 即使你从主线程中调用这个“无限循环函数”,它仍会挂起你的程序。
所以,无论是谁创作了这个函数,他/她就已经实现了一些机制来阻止它,否则它将毫无用处。如果没有强行杀死线程(Thread.Abort),我建议调查这个机制并在你的线程中使用它。
BTW,这个功能的目的是什么?某种消息处理?---编辑---
好的,所以你的“无限循环”实际上是Form.ShowDialog
。它内部包含一个消息泵,并且以编程方式停止该泵的方法是设置Form.DialogResult
。请注意,您需要将所有UI调用封送到正确的线程,如this post所示。
另外,尝试从Application.Run(Form)开始,而不是Form.ShowDialog
。