当我尝试将结构引用传递给线程时,出现构建错误。
dim antenna_frame_buffer as Antenna_Frame_Buffer_structure
...
new_buffer_write_thread = new Thread( AddressOf frame_buffer_write_Thread )
new_buffer_write_thread.Start( antenna_frame_buffer )
...
sub frame_buffer_write_Thread( ByRef antenna_frame_buffer as Antenna_Frame_Buffer_structure )
...
错误...
严重性代码描述项目文件行抑制状态 错误BC30518重载解析失败,因为没有可访问的“新建” 可以使用以下参数调用: '公共重载子新建(从ThreadStart开始)':方法'公共子frame_buffer_write_Thread(由ByRefenna_frame_buffer作为 Embedded_Communication_Interface.Antenna_Frame_Buffer_structure)' 没有与委托'Delegate Sub兼容的签名 ThreadStart()'。 'Public重载Sub New(从ParameterizedThreadStart开始)':方法'Public Sub frame_buffer_write_Thread(ByRef enna_frame_buffer为 Embedded_Communication_Interface.Antenna_Frame_Buffer_structure)' 没有与委托'Delegate Sub兼容的签名 ParameterizedThreadStart(obj As Object)'。 SYS HUB和HW GUI C:\ PRIMARY \ WORK \ SYSTEM HUB \ SOURCE \ Embedded_Communication_Interface.vb 1030有效
答案 0 :(得分:0)
不能。无论如何,您实际上并没有直接调用该方法,因此如何使用ByRef
参数呢?您正在调用Thread.Start
方法,但它没有ByRef
参数,因此无法以这种方式获取值。甚至忽略了Thread.Start
立即返回并且您不知道它调用的方法何时将返回的事实,因此无论如何您都不知道修改后的值何时可用。简而言之,ByRef
参数在这种情况下没有意义,因此请勿尝试使用它们。
编辑:
创建线程时,您可以使用Lambda表达式将方法作为委托调用,然后可以使代码运行:
new_buffer_write_thread = New Thread(Sub() frame_buffer_write_Thread(antenna_frame_buffer))
new_buffer_write_thread.Start()
我不认为方法完成后会返回参数值到原始变量,如果这样做了,您将不知道何时执行此操作,因为您不知道方法何时完成,这就是为什么它根本不应该发生的原因。我认为LINQ创建了一个闭包,该闭包将原始变量屏蔽通过该参数进行的更改,即使它看起来像是要链接的一样。
答案 1 :(得分:0)
结构不能通过引用传递给线程。 但是,幸运的是,可以通过引用传递类的对象。