我正在研究一种可通过以下方式工作的小型工具:
- 显示一系列图像
- 在每个图像之后,显示一个答案窗口,用户可以在其中通过按下键盘上的按钮来输入答案
- 答案窗口仅显示X秒钟,然后消失,然后将问题视为未回答
我所做的是让我做一个扩展UserControl的类
public partial class AnswerDialog : UserControl
{
...
public void ShowAnswerDialog()
{
ResponseItemType = Settings.ItemType.ObjectType_NONE;
this.Show();
allowAnswer = true;
}
public void HideAnswerDialog()
{
allowAnswer = false;
this.Hide();
}
...
private void buttonAnswerItemType0_Click(object sender,EventArgs e)
{
Setanswer(Settings.ItemType.ObjectType_0);
}
private void buttonAnswerItemType1_Click(object sender,EventArgs e)
{
Setanswer(Settings.ItemType.ObjectType_1);
}
public void AnswerDialog_KeyDown(object sender,KeyEventArgs e)
{
if (Settings.KeyCodeAnswer0 == e.KeyCode)
{
Setanswer(Settings.ItemType.ObjectType_0);
}
else if (Settings.KeyCodeAnswer1 == e.KeyCode)
{
Setanswer(Settings.ItemType.ObjectType_1);
}
}
...
}
它从父级接收键盘事件。
我有一堂课,我在这里控制显示图像和记录结果的顺序。 在此类中,我具有以下功能:
void AnswerThreadFunc(Object Param)
{
AnswerDialog answerDialog = (AnswerDialog)Param;
answerDialog.ShowAnswerDialog();
}
我是这样做的,所以我可以在主线程中使这个线程超时:
Thread answerThread = new Thread(AnswerThreadFunc); //create thread
answerThread.Start(_testWindow.GetanswerDialog()); //run thread
answerThread.Join(Settings.DurationResponseMs); //wait for thread with timout
_testWindow.GetanswerDialog().HideAnswerDialog(); //hide if window remained
Settings.ItemType response = _testWindow.GetanswerDialog().ResponseItemType;
item.GiveResponse(response);
但这将引发以下异常:
引发的异常:System.Windows.Forms.dll中的“ System.InvalidOperationException” System.Windows.Forms.dll中发生了类型为'System.InvalidOperationException'的未处理异常 跨线程操作无效:控件“ panelMainControl”从创建该线程的线程之外的其他线程访问。
谢谢。