我正在使用纯win32 api函数在Go中构建一个窗口应用程序。我的应用程序突然挂起或随机卡住。没有错误消息或来自 go 调试器的死机。最糟糕的是,问题不是一直出现,而是偶尔出现。我试图放一些'日志。在我的程序中,Println'在这里和那里跟踪它卡住的确切位置,它似乎在随机函数调用中卡在随机位置,但大多数情况下,它卡在win32 api函数调用中,如“DefWindowProc”或“GetMessage”。随着时间的推移,我的项目变得更大,它越大,问题似乎就越频繁地出现。因此,我试图尽量减少代码,尽可能地简化和注释掉代码,看看问题是否仍然发生,我不知道它没有多大帮助,导致问题只是随机发生,我现在的头脑一团糟。
我可以只发布我原始程序中的代码,但我不确定这些是否有帮助。如果需要,我可以向他们展示。现在我发现了其他一些东西,可能与我原来的问题有关,也可能与我原来的问题无关。我在想,如果垃圾收集器导致它,因为它被随机调用,如果我正在做一些不GC友好的事情。我真的不知道,但这是这个简单的代码。我从未在原始应用程序代码中手动调用GC,但在这里我这样做是为了测试目的。
package main
import (
"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语言的垃圾收集器是如何工作的,我似乎没有在这些代码中找到任何垃圾被收集。请帮助我,我将不胜感激。提前致谢。
开心每一天1111
相关分类