2011-05-27 207 views
1

我試圖用遊戲實現Java Swing GUI應用程序。遊戲將計算5秒鐘內點擊一次按鈕的次數。sqlite4java多線程支持解決方案

我在我的一個Java GUI項目中使用了sqlite4java。它非常簡約,因此僅支持單線程應用程序。

我想在5秒鐘後執行一些SQL查詢。我有一個線程在我的按鈕的onclick監聽其run()方法等實現開始執行以下操作:

run() { 
timeLeft = 5; 
score = 0; 
while(timeLeft>0) 
     Thread.sleep(100); 
     timeLeft -= 0.1; 
     update left time on GUI; 
    } 
    // time is up 
    execute some SQLite INSERT query here; 
} 

而且由於sqlite4java是支持單線程,它拋出一個異常:

SQLite error:com.almworks.sqlite4java.SQLiteException: 
[-98] DB[1] confined(Thread[main,5,]) used (Thread[Thread-3,6,main]) 

如何線程完成後(線程外)可以執行嗎?它拋出異常,因爲被調用者線程和數據庫實例化的線程(主線程)不相同。

在線程終止後,如何讓主線程發出信號(並在主線程中處理此信號)?

我想要實現的是執行查詢將用戶的分數添加到高分列表中。這不是一項家庭作業,我正在爲自己的ORM框架開發一個概念驗證應用程序。

回答

8

正如@corlettk建議的那樣,您需要爲數據庫操作提供單獨的線程。 sqlite4java附帶SQLiteQueue,它爲你做到了這一點。有一個tutorialjavadoc with example

確保使用SQLiteJob包裝所有數據庫操作並將它們傳遞給隊列。

希望這會有所幫助! Igor

0

艾哈邁德,

我想你必須在一個線程中,這也許應該專注於這個目的做你的「數據庫的東西」(包括DIS /連接);甚至可能「隱藏」在請求隊列後面。

祝你好運。你能「交換」RDBMS嗎?

乾杯。基思。

+0

@Keith,其實我試圖找到一種方法來進行線程之間的溝通。 sqlite4java不允許在其他線程上執行。我可能會實現一個請求隊列並使用'.wait()'和'.notifyAll()'處理它。但尋找更優雅的解決方案。謝謝。 – 2011-05-27 23:49:23

+0

@Ahmit,http://code.google.com/p/sqlite4java/說:「[An]應用程序可能會從不同線程打開多個連接到同一個數據庫的連接。」對我而言,這意味着您可以在專用的「DB服務線程」上打開數據庫,然後在線程安全的請求隊列後面「隱藏」該線程。每個請求將是一個未來,允許您回讀結果,並檢查錯誤。它仍然非常糟糕(延遲的錯誤檢測),但它可以工作,我猜。 – corlettk 2011-05-28 00:00:29

相關問題