我正在使用纯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.LockOSThread
runtime.LockOSThread
- 1 回答
- 0 关注
- 69 浏览
添加回答
举报
0/150
提交
取消