我想为linux和windows构建一个跨平台的GUI应用程序。ETO被推荐https://github.com/picoe/Eto我很习惯winforms,但我一直试图让ETO响应来自计时器的重复调用。我发现的例子需要使用winforms this. sockeRequired,这在Linux下不存在。
我想要一个定时器启动,并发送信号更新GUI文本框每100毫秒。
我有这个:
// This timer needs to kick off every 100ms to update the GUI.
Timer myTimer = new Timer(TimerTick, // the callback function
new object(),
0,
100); // Every 100ms
private static void TimerTick(object state)
{
if (ProcessTics == true)
{ Task.Factory.StartNew(CallTheBackgroundFunctions); }
}
private static void CallTheBackgroundFunctions()
{
OtherClass.ProcessTic();
mainTextDisplay.Text = OtherClass.GetText(); //This errors out
}
字符串
问题是计时器是一个静态示例,而我已经把我的类写成了一个静态示例。如果我提供了一个对主窗体的引用,这个.Invalidate();不会更新gui。
我相信我需要使用ETO的调用,但我真的很难让它工作。
有没有什么建议可以让后台线程更新ETO表单上的GUI?或者是其他支持C#的跨平台GUI框架?这些都是针对文本处理项目的。
感谢您抽出宝贵的时间。
2条答案
按热度按时间y3bcpkx11#
要调用UI线程上的方法,请使用
Eto.Forms.Application.Instance.Invoke()
或Eto.Forms.Application.Instance.AsyncInvoke()
。后者将调度调用并立即返回。或者,对于这种类型的场景,您也可以使用
Eto.Forms.UITimer
,它在主循环上调度其事件。jgovgodb2#
真实的技巧是正确地调用Application.Instance.Delegate。
如果其他人遇到类似的问题,这里是我如何安排类从另一个线程更新文本框。
字符串