为了账号安全,请及时绑定邮箱和手机立即绑定

在调用垃圾回收器后,程序卡在函数调用中

在调用垃圾回收器后,程序卡在函数调用中

Go
aluckdog 2022-08-15 15:34:22
我正在使用纯win32 api函数在Go中构建一个窗口应用程序。我的应用程序突然挂起或随机卡住。没有错误消息或来自 go 调试器的死机。最糟糕的是,问题不是一直出现,而是偶尔出现。我试图放一些'日志。在我的程序中,Println'在这里和那里跟踪它卡住的确切位置,它似乎在随机函数调用中卡在随机位置,但大多数情况下,它卡在win32 api函数调用中,如“DefWindowProc”或“GetMessage”。随着时间的推移,我的项目变得更大,它越大,问题似乎就越频繁地出现。因此,我试图尽量减少代码,尽可能地简化和注释掉代码,看看问题是否仍然发生,我不知道它没有多大帮助,导致问题只是随机发生,我现在的头脑一团糟。我可以只发布我原始程序中的代码,但我不确定这些是否有帮助。如果需要,我可以向他们展示。现在我发现了其他一些东西,可能与我原来的问题有关,也可能与我原来的问题无关。我在想,如果垃圾收集器导致它,因为它被随机调用,如果我正在做一些不GC友好的事情。我真的不知道,但这是这个简单的代码。我从未在原始应用程序代码中手动调用GC,但在这里我这样做是为了测试目的。package mainimport (    "log"    "runtime"    "syscall"    "github.com/AllenDang/w32")func main() {    w32.CreateWindowEx(        0, syscall.StringToUTF16Ptr("Button"), syscall.StringToUTF16Ptr("Hello World!"),        w32.WS_OVERLAPPEDWINDOW|w32.WS_VISIBLE,        100, 100, 1200, 800, 0, 0, 0, nil)    runtime.GC()    var msg w32.MSG    for {        log.Println("Calling 'GetMessage'")        if w32.GetMessage(&msg, 0, 0, 0) == 0 {            break        }        log.Println("End Calling 'GetMessage'")        w32.TranslateMessage(&msg)        w32.DispatchMessage(&msg)    }    return}该程序不会超过“GetMessage”,它会卡在那里。但是,如果我注释掉“运行时”。GC()'然后它确实完美地工作。我来自C++,是Go的新手。我不太了解Go语言的垃圾收集器是如何工作的,我似乎没有在这些代码中找到任何垃圾被收集。请帮助我,我将不胜感激。提前致谢。
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

似乎@JimB是对的,我需要在调用OS API函数之前调用。如果我在打电话给他们之前打电话,程序不会再挂起了。肯定还有很多东西要学。runtime.LockOSThreadruntime.LockOSThread



查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信