C# Winforms:模拟用户点击(开始-等待数据收集-停止)
Posted
技术标签:
【中文标题】C# Winforms:模拟用户点击(开始-等待数据收集-停止)【英文标题】:C# Winforms: Simulate user clicks(start- wait for data collection - stop) 【发布时间】:2021-08-26 16:42:11 【问题描述】:我正在使用 Winforms 编写一个 C# 应用程序,我需要根据我从组合框中的选择收集一些数据。我还有一个启用数据收集的开始按钮和一个停止数据收集的停止按钮。
这是我现在能做的:
通过在组合框上切换我的选择(一次一个通道)来测量所有通道的所有数据。过程如下:选择一个通道-启动按钮单击-等待数据收集-停止按钮单击
但这是我想在代码中执行的操作: 选择一个频道 - 点击开始按钮 - 等待数据收集 - 点击停止按钮 切换到下一个频道 - 点击开始按钮 - 等待数据收集 - 点击停止按钮 ...... 重复这个过程直到完成。
我的问题是:我应该采取什么措施来实现这一目标? 我一直在尝试使用 startButton.PerformClick( ) 来启用按钮,但是,我需要在启动和停止之间停止几秒钟以等待数据收集。
您可能会问为什么,因为这样做效率很低,但由于某种原因,第三方的 DLL 无法同时从所有通道收集数据。所以我必须手动从组合框切换我的频道选择,以便一次收集所有数据。
如果您有任何建议,请告诉我。
private void timer_Tick(object sender, EventArgs e)
startButton.PerformClick();
private void timer2_Tick(object sender, EventArgs e)
stopButton.PerformClick();
private void checkAll_CheckedChanged(object sender, EventArgs e)
int i = 0;
while (i != 40) //there are a total of 40 channels
System.Windows.Forms.Timer mytimer = new System.Windows.Forms.Timer();
mytimer.Interval = 5000;
System.Windows.Forms.Timer mytimer2 = new System.Windows.Forms.Timer();
mytimer2.Interval = 7000;
mytimer.Start();
mytimer.Tick += new EventHandler(timer_Tick);
mytimer2.Start();
mytimer2.Tick += new EventHandler(timer2_Tick);
physicalChannelComboBox.SelectedIndex = i;
i++;
Thread.Sleep(5000);
【问题讨论】:
通常您希望将代码从按钮单击处理程序中移出到方法中。然后,您只需从按钮单击事件和代码中的任何其他位置调用该方法。无需模拟输入 您如何知道该频道的数据何时被收集? @hijinxbassist 谢谢你的建议。我知道数据是被收集的,因为我将它存储到一个打印通道值的数据表中,所以我能够绘制它。我正在实时读取连续样本。 【参考方案1】:这是一个可以帮助您的简单例程 shell。这使用计时器来轮询数据是否完整(检查布尔值,当前设置为 true 以进行测试)。在您的情况下,您可能只需将计时器刻度值设置为您想要的延迟。如果您有办法知道何时完成为频道收集数据,那将是更可取的。此代码独立运行,因此您可以在开始将其集成到现有代码之前对其进行测试和配置。它只需要一个用于查看日志的列表框。
public partial class DataCollectorForm : Form
private Timer timer = new Timer();
private int numberOfChannels = 40;
private int currentChannelNumber = 0;
private DateTime routineStartTime;
private DateTime routineStopTime;
private DateTime channelStartTime;
private DateTime channelStopTime;
public DataCollectorForm()
InitializeComponent();
timer.Interval = 250;
timer.Tick += Timer_Tick;
DataCollectionRoutineStart();
private void Timer_Tick(object sender, EventArgs e)
// Need to check if data collection for this channel is complete..
//
var isDoneCollectingData = true;
if (isDoneCollectingData)
ChannelDataCollectionStop();
currentChannelNumber++;
if (currentChannelNumber >= numberOfChannels)
DataCollectionRoutineComplete();
else
ChannelDataCollectionStart();
public void DataCollectionRoutineStart()
routineStartTime = DateTime.Now;
Log("Data Collection Routine Start");
currentChannelNumber = 0;
ChannelDataCollectionStart();
timer.Start();
private void ChannelDataCollectionStart()
channelStartTime = DateTime.Now;
Log("Data Collection Start : channel " + currentChannelNumber);
private void ChannelDataCollectionStop()
channelStopTime = DateTime.Now;
Log("Data Collection Stop : channel " + currentChannelNumber + " : elapsed " + (channelStopTime - channelStartTime));
private void DataCollectionRoutineComplete()
routineStopTime = DateTime.Now;
timer.Stop();
Log("Data Collection Routine Complete : elapsed " + (routineStopTime - routineStartTime));
private void Log(string msg)
loggingListBox.Items.Add(msg);
【讨论】:
非常感谢!这个例程确实有助于实现我试图用我的代码实现的目的。再次感谢。 我刚刚集成到我自己的代码中,它完全按照我想要的方式工作。你真的很了不起。我是 C# 和 Winforms 的新手,还有很长的路要走,但我很高兴我正在学习这样做! 很高兴听到它的工作,很高兴我能够帮助您解决您的任务。请标记此答案以结束问题。编码愉快!以上是关于C# Winforms:模拟用户点击(开始-等待数据收集-停止)的主要内容,如果未能解决你的问题,请参考以下文章