LINUX.ORG.RU

Gtk и GLUT не хотят параллельно работать

 , ,


0

1

я запускаю форму на Gtk и окошко на GLUT в разных потоках, но они отказываются параллельно работать(окно глута отрисовывается 1 раз и зависает, пока не закрою гтк). Есть ли способ нормального взаимодействия Gtk и openGL в хаскеле? Вот как я пробовал если что:

import Graphics.UI.GLUT as GLUT
import Graphics.UI.Gtk as Gtk
import Control.Concurrent

gtkForm v = do
	initGUI
	win <- windowNew
	btn <- buttonNew
	ent <- entryNew
	box <- vBoxNew False 10
	Gtk.set win [Gtk.windowTitle := "hello world",
			 containerBorderWidth := 10,
			 containerChild := box]
	Gtk.set btn [buttonLabel := "press"]
	boxPackStart box btn PackGrow 0
	boxPackStart box ent PackGrow 0
	onClicked btn (do
		t1 <- entryGetText ent
		buttonGetLabel btn >>= entrySetText ent
		buttonSetLabel btn t1)
	windowSetDefaultSize win 200 100
	windowSetPosition win WinPosCenter
	onDestroy win (modifyMVar v (\a -> return (a-1,())) >> mainQuit)
	widgetShowAll win
	mainGUI	

glutForm v = do
	getArgsAndInitialize
	createWindow "win"
	ang <- newMVar 0
	displayCallback $= onDraw ang
	keyboardMouseCallback $= (Just$ inc ang)
	mainLoop
	modifyMVar v (\a -> return (a-1,()))

inc v _ _ _ _ = modifyMVar v (\a -> return(a+1,())) >> postRedisplay Nothing

onDraw :: MVar GLfloat -> IO()
onDraw v = do
	clear [ColorBuffer]
	loadIdentity
	readMVar v >>= flip rotate (Vector3 0 0 1)
	renderPrimitive Polygon$ mapM_ (vertex.(uncurry Vertex2)) [(0.5,0.5),(-0.5,0.5),(-0.5,-0.5),(0.5 :: GLfloat,-0.5)]
	GLUT.flush

main = do
	vSig <- newMVar 2
	forkIO (glutForm vSig)
	forkIO (gtkForm vSig)
	let loop = do
		q <- readMVar vSig
		if q == 0
			then return()
			else threadDelay 10000 >> loop in
		loop

★★★★★

haskell

Долго пытался понять, что это за необычный пистон.

buddhist ★★★★★
()

А оно вообще может так работать?

buddhist ★★★★★
()

А компилировал то с -threaded ? В нескольких потоках запустил ? Хотя хз может ли оно так работать, ибо forkIO это не настоящие потоки, а лишь легковесные внутри хаскеля, как в ерланге. А вообще, RTFM.

s9gf4ult ★★
()
Последнее исправление: s9gf4ult (всего исправлений: 1)
Ответ на: комментарий от s9gf4ult

Спасибо, использование forkOS вместо forkIO решило проблему

Aswed ★★★★★
() автор топика

forkOS минимум для GLUT обязателен.

qnikst ★★★★★
()

Есть ли способ нормального взаимодействия Gtk и openGL в хаскеле?

Но ведь это же элементарно!

Делаешь пандорический захват, лифтишь в монаду, потом строишь рекурсивную схему (здесь подойдёт зигохистоморфный препроморфизм ) как монадический трансформер из категории эндофункторов, и метациклически вычисляешь результат. Любой второкурсник справится. А если делать на анафорических лямбдах — так задачка вообще на пять минут. Не понимаю, в чем проблема-то?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.