Skip to content

Instantly share code, notes, and snippets.

@wavewave
Created June 11, 2014 11:43
Show Gist options
  • Save wavewave/fc55a95e06b956966002 to your computer and use it in GitHub Desktop.
Save wavewave/fc55a95e06b956966002 to your computer and use it in GitHub Desktop.
poppler worker thread design
import Control.Concurrent
import Control.Concurrent.STM
import Data.Monoid
import Graphics.Rendering.Cairo
import Graphics.UI.Gtk.Poppler.Document
import Graphics.UI.Gtk.Poppler.Page
import System.Directory
import System.FilePath
popplerGetDocFromFile :: FilePath -> IO (Maybe Document)
popplerGetDocFromFile fp =
documentNewFromFile ("file://localhost" <> fp) Nothing
popplerGetPageFromDoc :: Document -> Int -> IO Page
popplerGetPageFromDoc doc pn = do
pg <- documentGetPage doc (pn-1)
return pg
main :: IO ()
main = do
pwd <- getCurrentDirectory
tvar <- atomically $ newTVar [1]
withPDFSurface "test.pdf" 610 720 $ \sfc -> do
mvar <- newEmptyMVar
Just doc <- popplerGetDocFromFile (pwd </> "1311.4247v1.pdf")
let go = do
threadDelay 1000000
lst <- atomically $ readTVar tvar
case lst of
[] -> putMVar mvar ()
p:ps -> do
pg <- popplerGetPageFromDoc doc p
renderWith sfc (pageRender pg)
atomically $ writeTVar tvar ps
go
forkIO go
--
atomically $ do
lst <- readTVar tvar
writeTVar tvar (lst ++ [2])
atomically $ do
lst <- readTVar tvar
writeTVar tvar (lst ++ [3])
takeMVar mvar
return ()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment