मुख्य सामग्री पर जाएँ
CrossFly 100% ओपन सोर्सGitHub पर फ़ॉलो करें
CrossFlyCrossFly
शुरू करें

यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।

paint thread के बाहर डेटाबेस तक कैसे पहुँचें

उद्देश्य. भारी क्वेरियाँ (स्कैन, bulk, माइग्रेशन) यदि CrossFly की एकल paint thread पर चलें तो UI को जाम कर देती हैं। नियम है: डेटाबेस का I/O एक worker thread में करें और UI को केवल Component.onUI(...) के माध्यम से अपडेट करें, जो कोड को UI thread पर पुनः भेजता है।

उपयोग किए गए APIs

  • new Thread(Runnable).start() — डेटाबेस तक पहुँच के लिए एक worker thread बनाता है। सारा SqliteDb/query/bulkInsert यहाँ चलता है, paint thread से दूर।
  • Component.onUI(Runnable r) — r को UI thread पर चलाने के लिए कतार में रखता है (आंतरिक रूप से Gdx.app.postRunnable)। कंपोनेंट्स का सारा हेरफेर (टेक्स्ट सेट करना, सूची में आइटम जोड़ना, repaint) इसी callback के भीतर होना चाहिए।
  • SqliteDb / SqliteCursor — थ्रेड के भीतर ही खोले और बंद किए जाते हैं (try-with-resources के माध्यम से)। किसी एक कनेक्शन को threads के बीच साझा न करें; जहाँ उपयोग करना है वहीं अपना खोलें।

थ्रेडिंग का स्वर्णिम नियम. डेटाबेस में पढ़ना/लिखना: worker thread। UI कंपोनेंट्स को छूना: Component.onUI। कभी उल्टा नहीं — UI thread के बाहर कंपोनेंट्स तक पहुँचना करप्शन का कारण बनता है; I/O से paint thread को ब्लॉक करना ऐप को जाम कर देता है।

थ्रेड छोड़ने से पहले संग्रह करें. SqliteCursor AutoCloseable है और अपने कनेक्शन से जुड़ा हुआ है। cursor को onUI के भीतर मत पास करें। worker thread में डेटा को मटीरियलाइज़ करें (जैसे: किसी List में) और UI को केवल तैयार सूची पास करें।

पूरा उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)

package com.exemplo;

import java.util.*;                          // List, ArrayList

import dev.crossfly.ui.*;                     // Window, Component
import dev.crossfly.ui.layout.*;             // VerticalLayout
import dev.crossfly.sqlite.*;                // SqliteDb, SqliteCursor

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      new Thread(() ->
      {
         // --- worker thread: डेटाबेस I/O ---
         List<String> nomes = new ArrayList<>();
         try (SqliteDb db = SqliteDb.open("app.db");
              SqliteCursor c = db.query("SELECT name FROM person ORDER BY name"))
         {
            while (c.next())
               nomes.add(c.getString(0));   // thread से बाहर निकलने से पहले एकत्र करता है
         }

         // --- केवल components अपडेट करने के लिए UI पर वापस ---
         Component.onUI(() ->
         {
            // यहाँ components छूना सुरक्षित है (सूची सेट करना, repaint, आदि)
            preencheLista(nomes);
         });
      }).start();
   }

   /** Stub: यहाँ अपने UI components को लोड किए गए डेटा से अपडेट करें। */
   private void preencheLista(List<String> nomes)
   {
      // उदा.: एक सूची में आइटम बनाना, टेक्स्ट सेट करना, repaint()...
   }
}

नीचे दिया गया अंश केवल मुख्य भाग दिखाता है। इसे चलाने के लिए, इसे ऊपर दिए गए MainWindow कंकाल में रखें।

न्यूनतम अंश

// स्रोत में सत्यापित: Component.onUI (Gdx.app.postRunnable), SqliteDb.query/cursor 0-based
import dev.crossfly.sqlite.*;
import dev.crossfly.ui.Component;
import java.util.*;

new Thread(() ->
{
   // --- worker thread: डेटाबेस I/O ---
   List<String> nomes = new ArrayList<>();
   try (SqliteDb db = SqliteDb.open("app.db");
        SqliteCursor c = db.query("SELECT name FROM person ORDER BY name"))
   {
      while (c.next())
         nomes.add(c.getString(0));   // thread से बाहर निकलने से पहले एकत्र करता है
   }

   // --- केवल components अपडेट करने के लिए UI पर वापस ---
   Component.onUI(() ->
   {
      // यहाँ components छूना सुरक्षित है (सूची सेट करना, repaint, आदि)
      preencheLista(nomes);
   });
}).start();

और गहराई से जानें

क्या यह पृष्ठ उपयोगी था?