小编Hto*_*onS的帖子

表单上所有控件的一个事件处理程序

我在为表单上的所有控件设置相同的事件处理程序时遇到问题.我想在我的应用程序中统一处理按下的f5-f7按钮,所以我尝试为表单上的所有控件注册相同的事件处理程序.我插了

foreach (System.Windows.Forms.Control cont in this.Controls)
                cont.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainForm_KeyPress);
Run Code Online (Sandbox Code Playgroud)

在InitializeComponent()函数中,就在自动生成ResumeLayout/PerformLayout调用之前.不要介意名称MainForm_KeyPress,它现在实际上是一个KeyDown事件处理程序.

我还尝试在我的init()函数中插入代码,该函数从构造函数中调用.但结果是一样的:按键时不会发生事件.专注于表单的一个按钮.

但是如果我使用设计工具(将函数名称复制到KeyPress事件字段)为其中一个按钮实现处理程序,则如果按钮处于焦点,则事件会正确引发.

任何想法为什么foreach不起作用?

c# visual-studio-2010 keyboard-events

5
推荐指数
1
解决办法
7321
查看次数

在关闭主窗体之前关闭侧面线程

我正在使用Visual Studio .NET 2010中的Windows窗体创建GUI应用程序C#.我有多个线程,例如:

  1. 正在ping目标设备的线程,以确保连接不会丢失
  2. 从设备请求和接收测量结果的线程
  3. 一个不断用这些结果更新主窗体的线程.此线程使用调用主窗体控件中的更改Control.Invoke().我的目标:当用户在主窗体上按(x)时,我想确保正确关闭窗体.这意味着我希望我的连接关闭,所有侧线程终止等.我正在尝试使用FormClosing事件.在那里我将KillThreads标志设置为true并等待侧线程终止.每个都有一张支票,比如
if(KillThreads)
    return;
Run Code Online (Sandbox Code Playgroud)

但是有一个问题.如果我试图等待所有线程终止

for(;;)
if(ActiveSideThreads == 0)
    break;
closeConnection();
Run Code Online (Sandbox Code Playgroud)

线程N3冻结被阻塞Invoke(); 当然是,因为主gui线程处于无限循环中.所以表格结束会永远延迟.

如果我将on-close操作实现为线程过程4,并在FromClosing事件处理程序中创建一个新线程,则表单在线程4终止之前立即关闭,并Invoke()抛出错误-t.4无法及时关闭线程3.如果我Join(), Invoke()再次阻止添加呼叫,并且线程3永远不会终止,那么线程4将永远等待.

我该怎么办?有什么方法可以解决这个问题吗?

c# user-interface multithreading visual-studio-2010

4
推荐指数
1
解决办法
7486
查看次数