为什么它不起作用,控制台程序转换为 Windows Form C#
Why it doesn't work, The Console program converts to Windows Form C #
我有一个程序可以在 UDP 之后从游戏中读取遥测数据;在控制台版本中,它完美运行。我想制作一个 Windows 表单版本,但我不知道如何强制它工作。从理论上讲,我认为它应该有效。
对不起,也许是一个微不足道的问题;我是初学者。
控制台程序:
namespace F12021
{
class Program
{
static void Main(string[] args)
{
F12020TelemetryClient client = new F12020TelemetryClient(20777);
client.OnCarTelemetryDataReceive += TelemetryUpdate;
client.OnConnectStatusChanged += OnConnectStatusChange;
Console.CursorVisible = false;
Console.Read();
}
private static void OnConnectStatusChange(bool connected)
{
if (!connected)
{
Console.Clear();
Console.WriteLine("Listening for F1 2020...");
}
}
private static void TelemetryUpdate(PacketCarTelemetryData packet)
{
int playerIndex = packet.Header.playerCarIndex;
CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
Console.SetCursorPosition(0, 0);
WriteLine($"Throttle: {playerData.throttle}");
}
private static void WriteLine(string input)
{
Console.Write(input.PadRight(Console.WindowWidth, ' '));
}
}
}
Windows 表格:
namespace F1_2021
{
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
F12020TelemetryClient client = new F12020TelemetryClient(20777);
client.OnCarTelemetryDataReceive += TelemetryUpdate;
client.OnConnectStatusChanged += OnConnectStatusChange;
}
private void OnConnectStatusChange(bool connected)
{
if (!connected) { label1.Text = "Not conected wait....."; }
else { label1.Text = "Conected"; }
}
private void TelemetryUpdate(PacketCarTelemetryData packet)
{
int playerIndex = packet.Header.playerCarIndex;
CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
label2.Text = (playerData.throttle).ToString() ;
}
}
}
我有什么不明白的?
尝试将客户端移到顶部
public partial class Form1 : Form
{
F12020TelemetryClient client = new F12020TelemetryClient(20777);
public Form1()
....
在您的控制台应用程序中,F12020TelemetryClient
实例在应用程序 运行 期间一直保持活动状态。
在您的 Windows Forms 应用程序中,它是 Form_Load
方法中的局部变量。一旦该方法结束,它就有资格进行垃圾收集。改为将其设为 class 的字段。
您还需要检查是否在 UI 线程上引发了事件;如果没有,您需要先编组对 UI 线程的调用,然后才能更新任何控件。
public partial class Form1 : Form
{
private F12020TelemetryClient _client;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
_client = new F12020TelemetryClient(20777);
_client.OnCarTelemetryDataReceive += TelemetryUpdate;
_client.OnConnectStatusChanged += OnConnectStatusChange;
}
private void OnConnectStatusChange(bool connected)
{
if (InvokeRequired)
{
BeginInvoke((Action<bool>)OnConnectStatusChange, connected);
}
else
{
if (!connected) { label1.Text = "Not conected wait....."; }
else { label1.Text = "Conected"; }
}
}
private void TelemetryUpdate(PacketCarTelemetryData packet)
{
if (InvokeRequired)
{
BeginInvoke((Action<PacketCarTelemetryData>)TelemetryUpdate, packet);
}
else
{
int playerIndex = packet.Header.playerCarIndex;
CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
label2.Text = (playerData.throttle).ToString() ;
}
}
}
谢谢,一切都已经正常工作了。
namespace F1_2021
{
public partial class Form1 : Form
{
F12020TelemetryClient client = new F12020TelemetryClient(20777);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
client.OnCarTelemetryDataReceive += TelemetryUpdate;
client.OnConnectStatusChanged += OnConnectStatusChange;
}
private void OnConnectStatusChange(bool connected)
{
label1.Invoke(new Action(delegate ()
{
if (!connected) { label1.Text = "Not conected wait....."; }
else { label1.Text = "Conected"; }
}));
}
private void TelemetryUpdate(PacketCarTelemetryData packet)
{
int playerIndex = packet.Header.playerCarIndex;
CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
label2.Invoke(new Action(delegate ()
{
label2.Text = (playerData.throttle).ToString();
}));
}
}
}
我有一个程序可以在 UDP 之后从游戏中读取遥测数据;在控制台版本中,它完美运行。我想制作一个 Windows 表单版本,但我不知道如何强制它工作。从理论上讲,我认为它应该有效。 对不起,也许是一个微不足道的问题;我是初学者。
控制台程序:
namespace F12021
{
class Program
{
static void Main(string[] args)
{
F12020TelemetryClient client = new F12020TelemetryClient(20777);
client.OnCarTelemetryDataReceive += TelemetryUpdate;
client.OnConnectStatusChanged += OnConnectStatusChange;
Console.CursorVisible = false;
Console.Read();
}
private static void OnConnectStatusChange(bool connected)
{
if (!connected)
{
Console.Clear();
Console.WriteLine("Listening for F1 2020...");
}
}
private static void TelemetryUpdate(PacketCarTelemetryData packet)
{
int playerIndex = packet.Header.playerCarIndex;
CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
Console.SetCursorPosition(0, 0);
WriteLine($"Throttle: {playerData.throttle}");
}
private static void WriteLine(string input)
{
Console.Write(input.PadRight(Console.WindowWidth, ' '));
}
}
}
Windows 表格:
namespace F1_2021
{
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
F12020TelemetryClient client = new F12020TelemetryClient(20777);
client.OnCarTelemetryDataReceive += TelemetryUpdate;
client.OnConnectStatusChanged += OnConnectStatusChange;
}
private void OnConnectStatusChange(bool connected)
{
if (!connected) { label1.Text = "Not conected wait....."; }
else { label1.Text = "Conected"; }
}
private void TelemetryUpdate(PacketCarTelemetryData packet)
{
int playerIndex = packet.Header.playerCarIndex;
CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
label2.Text = (playerData.throttle).ToString() ;
}
}
}
我有什么不明白的?
尝试将客户端移到顶部
public partial class Form1 : Form
{
F12020TelemetryClient client = new F12020TelemetryClient(20777);
public Form1()
....
在您的控制台应用程序中,F12020TelemetryClient
实例在应用程序 运行 期间一直保持活动状态。
在您的 Windows Forms 应用程序中,它是 Form_Load
方法中的局部变量。一旦该方法结束,它就有资格进行垃圾收集。改为将其设为 class 的字段。
您还需要检查是否在 UI 线程上引发了事件;如果没有,您需要先编组对 UI 线程的调用,然后才能更新任何控件。
public partial class Form1 : Form
{
private F12020TelemetryClient _client;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
_client = new F12020TelemetryClient(20777);
_client.OnCarTelemetryDataReceive += TelemetryUpdate;
_client.OnConnectStatusChanged += OnConnectStatusChange;
}
private void OnConnectStatusChange(bool connected)
{
if (InvokeRequired)
{
BeginInvoke((Action<bool>)OnConnectStatusChange, connected);
}
else
{
if (!connected) { label1.Text = "Not conected wait....."; }
else { label1.Text = "Conected"; }
}
}
private void TelemetryUpdate(PacketCarTelemetryData packet)
{
if (InvokeRequired)
{
BeginInvoke((Action<PacketCarTelemetryData>)TelemetryUpdate, packet);
}
else
{
int playerIndex = packet.Header.playerCarIndex;
CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
label2.Text = (playerData.throttle).ToString() ;
}
}
}
谢谢,一切都已经正常工作了。
namespace F1_2021
{
public partial class Form1 : Form
{
F12020TelemetryClient client = new F12020TelemetryClient(20777);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
client.OnCarTelemetryDataReceive += TelemetryUpdate;
client.OnConnectStatusChanged += OnConnectStatusChange;
}
private void OnConnectStatusChange(bool connected)
{
label1.Invoke(new Action(delegate ()
{
if (!connected) { label1.Text = "Not conected wait....."; }
else { label1.Text = "Conected"; }
}));
}
private void TelemetryUpdate(PacketCarTelemetryData packet)
{
int playerIndex = packet.Header.playerCarIndex;
CarTelemetryData playerData = packet.carTelemetryData[playerIndex];
label2.Invoke(new Action(delegate ()
{
label2.Text = (playerData.throttle).ToString();
}));
}
}
}