gpt4 book ai didi

windows - 在 "LockOSThread"GoRoutine 中调用函数

转载 作者:IT王子 更新时间:2023-10-29 02:22:06 27 4
gpt4 key购买 nike

我正在编写一个包来使用 Go 中的 EDSDK DLL 来控制 Canon DSLR。

这是应我合作伙伴的要求在我们的婚礼上使用的照相亭的个人项目,完成后我很乐意将其发布到 GitHub :)。

查看其他地方使用 SDK 的示例,它不是线程安全的并且使用线程本地资源,因此我需要确保在使用期间从单个线程调用它。虽然不理想,但看起来 Go 提供了一个“runtime.LockOSThread”函数来执行此操作,尽管它确实被核心 DLL 互操作代码本身调用,所以我将不得不等待并确定它是否会干扰。

我希望应用程序的其余部分能够使用更高级别的接口(interface)调用 SDK 而不必担心线程,因此我需要一种方法将函数调用请求传递给锁定的线程/Goroutine 在那里执行,然后传递结果返回到该 Goroutine 外部的调用函数。

到目前为止,我已经想出了这个使用非常广泛的函数定义的工作示例,使用 []interface{} 数组并通过 channel 来回传递。这将在每次调用时对输入/输出数据进行大量处理,以从 interface{} 数组中返回类型断言,即使我们提前知道每个函数应该期待什么,但看起来它会工作。

在我投入大量时间以这种方式进行可能是最糟糕的方式之前 - 有没有人有更好的选择?

package edsdk

import (
"fmt"
"runtime"
)

type CanonSDK struct {
FChan chan functionCall
}

type functionCall struct {
Function func([]interface{}) []interface{}
Arguments []interface{}
Return chan []interface{}
}

func NewCanonSDK() (*CanonSDK, error) {
c := &CanonSDK {
FChan: make(chan functionCall),
}

go c.BackgroundThread(c.FChan)

return c, nil
}

func (c *CanonSDK) BackgroundThread(fcalls <-chan functionCall) {
runtime.LockOSThread()
for f := range fcalls {
f.Return <- f.Function(f.Arguments)
}
runtime.UnlockOSThread()
}

func (c *CanonSDK) TestCall() {
ret := make(chan []interface{})

f := functionCall {
Function: c.DoTestCall,
Arguments: []interface{}{},
Return: ret,
}

c.FChan <- f

results := <- ret
close(ret)

fmt.Printf("%#v", results)
}

func (c *CanonSDK) DoTestCall([]interface{}) []interface{} {
return []interface{}{ "Test", nil }
}

最佳答案

对于我玩过的类似嵌入式项目,我倾向于创建一个单一的 goroutine worker,它监听一个 channel 以通过该 USB 设备执行所有工作。任何结果都会在另一个 channel 上发回。

在单向交换中与仅在 Go 中使用 channel 的设备对话。收听其他 channel 的回应。

由于 USB 是串行和轮询的,所以我必须使用另一个 goroutine 设置一个专用 channel ,当它们从刚刚循环的 worker goroutine 插入 channel 时从 channel 中挑选项目。

关于windows - 在 "LockOSThread"GoRoutine 中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43292365/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com