我需要修复问题并需要一些输入。当我按button1
时,我的gui开始串行通讯。我发送一些命令并接收一些数据。一旦我按button1
,我就在另一个线程(GUI线程除外)中3-4秒,直到数据完全传输完毕。我想要的是一个对话框,弹出或者某些类似的东西(显示一条忙碌的信息)出现在我的gui面前当我按下button1
时这个pop会在另一个串口通讯的线程中自动关闭正在传输整个数据。
有人建议BackgroundWorker
,但我不清楚。
我还得到了一个建议“使用winform,将其FormBorderStyle设置为FixedDialog。将其设置为像消息框一样小,并在其上删除进度条控件。您可以在线程处理开始时使用表单ShowDalog,并且最后关闭。进度条样式可以设置为连续的简单。“
考虑到我的情景,有什么好的解释或其他简单方法吗? 我想保持简单
答案 0 :(得分:0)
您可以使用表单上的Label或使用进度条设置简单消息,并在执行少量命令后更新进度条。如果您的命令集已由用户指令启动,那么就可以了。 如果你必须与设备通信并响应设备警报,那么C#中的serialport的DataReceivedEvent工作正常。你可以写你的代码。当设备将日期传输到应用程序并在后台运行时,此事件会被触发。
答案 1 :(得分:0)
这是逻辑:
当用户点击button1时,
- 显示弹出框。
- 虽然如此,数据传输代码也应该在同一个线程中。
- 然后编写代码以获取所有数据将被传输的点。 @那个点让对话框消失。
如果您需要任何示例代码,请发布您编写的代码,以便我可以提供实用的代码来向您展示逻辑。
希望您了解或更好地发布您的代码。
答案 2 :(得分:0)
BackgroundWorker确实是最好的选择。有一个非常彻底的HowTo权利here。
答案 3 :(得分:0)
您没有说明您正在运行的.net版本,因此我将提供这两种方法:
void OnButton1Click(Object sender, EventArgs e)
{
var waitDailog = new frmWait();
waitDialog.ShowDialog();
var task = new Task(() =
{
// Serial communitcation or whatever will take a long time here
})
.ContinueWith(result =>
{
waitDialog.Close();
})
.Start();
}
private frmWait _waitDialog;
void OnButton1Click(Object sender, EventArgs e)
{
_waitDailog = new frmWait();
waitDialog.ShowDialog();
var thread = new Thread(OnThread);
thread.Start();
}
void OnThread()
{
// Serial communitcation or whatever will take a long time here
_waitDailog.Close();
}
在这两种情况下,等待对话框只是一个表单,带有某种动画和消息以显示等待。
在等待表单关闭时可能还需要一些Invoke()
,但我没有一个编译器可以近距离检查。