- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有以下两个文件:
bridge.go:
package cube
// #cgo LDFLAGS: -lGL -lGLEW -lglfw
// #include <GLFW/glfw3.h>
// int init(GLFWwindow**);
// void render(GLFWwindow*);
import "C"
import (
"fmt"
"time"
)
func Init() {
var window *_Ctype_GLFWwindow
windowWat := (*[0]byte)(window)
fmt.Printf("Calling init\n")
if C.init(&windowWat) != 1 {
return
}
window = (*_Ctype_GLFWwindow)(windowWat)
//t := time.Tick(time.Second) // Doesn't work
t := time.After(time.Second) // Works
<-t
fmt.Println("Rendering")
C.render((*[0]byte)(window))
select {}
}
立方体.c:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#define INIT_WINDOW_W (800)
#define INIT_WINDOW_H (800)
void render(GLFWwindow* window) {
glClearColor(135.0f / 255.0f, 206.0f / 255.0f, 250.f / 254.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glfwSwapBuffers(window);
}
static void glfw_error(int errno, const char* description) {
fprintf(stderr, "GLFW [%d] %s\n", errno, description);
exit(1);
}
int init(GLFWwindow** window) {
GLenum glewErr;
glfwSetErrorCallback(glfw_error);
if (!glfwInit()) {
return 0;
}
*window = glfwCreateWindow(
INIT_WINDOW_H,
INIT_WINDOW_W,
"wat",
NULL,
NULL
);
if (*window == NULL) {
glfwTerminate();
return 0;
}
glfwMakeContextCurrent(*window);
glewErr = glewInit();
if (glewErr != GLEW_OK) {
fprintf(stderr, "glewInit failed: %s\n", glewGetErrorString(glewErr));
return 0;
}
if (!GL_VERSION_2_0) {
fprintf(stderr, "Don't have OpenGL >= 2.0\n");
return 0;
}
return 1;
}
以及调用 cube.Init()
的 main.go 文件,仅此而已。
我的问题出在调用 C.render
之前的行中。如果我执行 time.After
,它会正常工作并按预期显示蓝色窗口。如果我执行 time.Tick
,它很少还会显示那个蓝色窗口,而是显示黑色窗口或段错误。这个测试用例是从我的实际代码中大大提炼出来的。
我有一种感觉,go 的调度程序以某种方式搞砸了,但我想不出如何(或如何测试/修复它)。我很好奇是否有人知道造成这种情况的原因,或者可以想出任何进一步调查的方法。
其他可能重要的信息:
编辑:
这是段错误消息:
SIGSEGV: segmentation violation
PC=0x7fda7d6a2e29
signal arrived during cgo execution
runtime.cgocall(0x401260, 0x7fda7d6f0e58)
/opt/go/src/pkg/runtime/cgocall.c:149 +0x11b fp=0x7fda7d6f0e40
game/cube._Cfunc_render(0x24e13b0)
game/cube/_obj/_cgo_defun.c:62 +0x31 fp=0x7fda7d6f0e58
game/cube.Init()
/tmp/wat/cube/bridge.go:28 +0x156 fp=0x7fda7d6f0ee0
main.main()
/tmp/wat/main.go:10 +0xac fp=0x7fda7d6f0f48
runtime.main()
/opt/go/src/pkg/runtime/proc.c:220 +0x11f fp=0x7fda7d6f0fa0
runtime.goexit()
/opt/go/src/pkg/runtime/proc.c:1394 fp=0x7fda7d6f0fa8
goroutine 3 [syscall]:
runtime.goexit()
/opt/go/src/pkg/runtime/proc.c:1394
rax 0x0
rbx 0x24e13b0
rcx 0x7fda7d6f0e58
rdx 0x7fda7d6f0df0
rdi 0x24e13b0
rsi 0xc210001900
rbp 0xc21002a000
rsp 0x7fda76506dc8
r8 0xc210001120
r9 0x7fda7d6f0df0
r10 0x7fda76506ba0
r11 0x7fda7d6a2e20
r12 0x0
r13 0x7fda76507700
r14 0x0
r15 0x7fda76d07c80
rip 0x7fda7d6a2e29
rflags 0x10202
cs 0x33
fs 0x0
gs 0x0
exit status 2
它似乎在调用 glClearColor
最佳答案
将我的评论变成答案:
出于某种原因,OpenGL 通常要求所有内容都在同一个操作系统线程中运行。 time.Tick 和 time.After 调用不同的运行时函数,一个可能导致不同的 opengl 调用在不同的线程中运行。默认情况下,Go make 不保证 goroutine 在特定线程上运行。
要解决此问题,您需要使用 runtime.LockOSThread .这将确保 goroutine 并且只有那个 goroutine 在当前线程上运行。
您可以在此处阅读有关该主题的更多信息:https://groups.google.com/forum/#!topic/golang-nuts/5Pvv1Gr1eoo
关于linux - Go 导致 OpenGL 与 time.Tick 但不是 time.After 发生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23862499/
我有一个 Visual Studio 2008 解决方案,当我构建时,它返回以下错误: Ticks must be between DateTime.MinValue.Ticks and DateTi
我正在 Xv6 上做操作系统类(class)的作业.我需要为其创建时间、终止时间、休眠时间等实现一个进程的数据状态结构... 到目前为止,我决定直接使用 ticks 变量而不使用 tickslock,
我可以删除刻度标签: ax.axes.get_yaxis().set_visible(False) 但这也消除了滴答声。我想保留蜱虫。 最佳答案 只需使用一个NullFormatter ax = pl
我正在处理刻度数据,并希望将我的 xts 不规则间隔系列聚合成一个 1 秒的同质系列。因此,我使用 xts 包函数 to.period : price_1m <-to.period(price,per
在 C# System.Windows.Forms.Timer 中,如果计时器节拍内的代码计算时间比节拍长度长,会发生什么情况? 例如,在下面的代码中,如果更新标签的时间比滴答的时间间隔(1 秒)长,
如何通过逐笔报价数据对我的逐笔报价进行重新采样以获取 Candlesticks OHLC 数据。 这是我的数据在 pandas DataFrame 中的样子。 Timestamp
这是对 this 的跟进问题,作者想要不同的刻度和刻度标签颜色。我想将这些设置保存为 Matplotlib 样式。但在 Matplotlib 样式中,我只能设置刻度颜色(xtick 设置见下文),这会
我想在日期时间 X 轴上显示每月刻度。我使用下面的代码实现了这一点。 DateAxis dateAxis = (DateAxis)chart.getXYPlot().getDomainAxis();
我是业余时间的 Java 开发者,我只是想知道 level.tick() 和 Level.tick(level) ('Level' 是类的名称,'level' 是该类的对象) 我知道,由于 java
我正在实现时间轴功能并使用 d3.time.scale D3 中的对象来制作一个轴。这是代码: var t = 1066555; var xd = [new Date(t-10000), new Da
我有一个具有旋转动画的自定义 View (PieView)。现在我想与旋转速度同步播放滴答滴答滴答...声音(即当旋转速度快时,滴答声应该快,当旋转慢时,滴答声应该快)滴答滴答应该很慢)。为此,我首先
我正在制作一个分层图表,其中有条形图和规则线。我遇到的问题是,在 x 轴上,刻度线和刻度标签只出现在条形图下方,不会跨越整个轴,因此在规则线下方没有刻度线和标签位于。这是我所看到的示例 ( link
我有一个histogram with centered bin-ticks 。 如图所示,每个 bin-tick 的编号标签彼此非常接近,以至于数字不像我希望的那样清晰。我想在我的图中保留居中的垃圾箱
我正在制作玩具熊的五夜后宫的“粉丝游戏”。在我开始收到此错误之前,我的代码工作正常: File "C:\Users\Admin\Desktop\Python\Five Nights\Five Nigh
这很简单,但我不明白...... 我正在尝试设定一个时间。每秒滴答一次...但它每 2 秒滴答一次?!? package main import ( "fmt" "time" ) fu
我正在以日期时间刻度格式存储 Azure 表存储行键 String.Format("{0:D19}", DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks)
What is the correct way to multiply and divide ints in C to avoid overflow? I want to determine h
我在 javascript 和 node.js 事件循环中看到了“tick”的不同定义。 有人说这是贯穿所有阶段的第 1 次迭代事件循环。 有人说阶段和阶段之间的过渡另一个是蜱虫。 有人说它是一个事件
我试图让我的模型对时钟滴答作响,以便做一些动画,例如 elm 架构教程的示例 8(旋转立方体)。 https://github.com/evancz/elm-architecture-tutorial
我创建了一个应用程序,它播放小轨道的播放列表,一切正常,直到 Windows Phone 8.1 更新 问题是 -> 轨道结束时有奇怪的滴答声” 所以我尝试在 xbox 音乐播放器中播放轨道它也有相同
我是一名优秀的程序员,十分优秀!