将线程用于简单任务是否有意义?

问题描述

我正在编写一个软件,该软件应在VB.Net中为娱乐飞行模拟器模拟除飞行动力学之外的某些飞机系统。

例如,程序将根据可用的电源来计算应打开或关闭哪个模拟的“断路器/继电器”,从而导致功能短如:

Dim connString As String = ""
Private ds As DataSet
Private Sub Form1_Load(sender As Object,e As EventArgs) Handles MyBase.Load
    ds = New DataSet()

    Using con As SqlConnection = New SqlConnection(connString)
        con.Open()
        Dim adp As SqlDataAdapter = New SqlDataAdapter("select * from RABill",con)
        adp.Fill(ds)
        Dim dt As DataTable = ds.Tables(0)
        DataGridView1.DataSource = dt
    End Using
End Sub
Private Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click
    Using con As SqlConnection = New SqlConnection(connString)
        con.Open()
        Dim adp As SqlDataAdapter = New SqlDataAdapter("select * from RABill",con)
        Dim build As SqlCommandBuilder = New SqlCommandBuilder(adp)
        adp.Update(ds.Tables(0))
    End Using
End Sub

该代码应每X毫秒运行一次,但是该软件还需要计算其他系统状态,例如机油,气动等。

为每个模拟系统运行一个线程是否有意义,或者使用单个线程会更快?

以后将添加更多功能,并且系统将变得更加复杂,例如液压系统的压力值或电气系统的已存储电池电量。首先,它应该只是一个非常基本的模拟。

如果“第一步”模拟步骤中的某些数据对于其他线程不可用/无效,那么这对我来说不是一个(巨大)问题。就像在第一个“电气系统”线程完成后设置“电动液压泵功率可用”一样,并且对于“液压系统”线程的第一次运行而言,它不是正确的值,因为它可能会使用先前模拟步骤中的数据

解决方法

您可以在此处使用多线程,也可以使用基于事件的方法来更好地利用资源。 使用可观察的事物,然后使用订户订阅那些事件,例如机油检查/其他事件,例如您在描述中提到的事件。 根据事件创建线程,该线程将处理您的请求。 也可以使用线程池来更好地利用资源。 没有线程的确切用例。如果您想减少主线程对其他线程的负载,那么您可以很好地实现它。 但是在进入线程之前,请先了解以下几点,

    我要在多个线程之间共享全局变量吗?然后需要注意数据同步
  1. 尽可能使用线程池。
  2. 在必要时使用基于事件的内容。
  3. 在关闭线程池之类的用法后,请不要忘记关闭资源。
  4. 根据您的CPU内核设置线程池的大小,就像没有内核数* 2一样。
,

根据您所发布的内容,我要说:“不,对于这些简单的任务,使用线程是没有意义的”

使用此多线程将增加程序的复杂性,并且您将陷入困境(哈),保持一切顺畅。

您本质上是在编写游戏,并且循环几个布尔值/更改某些UI元素的外观是您可以在一个“游戏循环”中轻松地每秒(数十次)执行数千次的操作。不需要“使其更快”,因为它已经可以大大超越使用它的人类的性能。

如果开始进入需要大量CPU或磁盘工作的工作,则可以利用基于任务的异步模式来使事情保持响应性,这是UI明智的,它可以抽象出很多东西。制作“显然是多线程的”所涉及的复杂性

在某些时候,您可能会想跳到多线程,但是我建议您先构建一些东西,然后运行它,然后在确定只有多线程可以解决的固有问题时才进行切换。这些东西很少,而且相去甚远,甚至您玩过的最复杂的游戏也可能不是真正意义上的大规模多线程

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...