# बैकग्राउंड में काम

> CrossFly का threading पैटर्न — paint thread के बाहर Thread/executor, onUI के साथ पुनः प्रवेश।

Source: https://crossfly.dev/hi/docs/data-and-services/background-work — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# बैकग्राउंड में काम

यह पृष्ठ उस threading पैटर्न को समेकित करता है जो पिछले सभी पृष्ठों में दिखता है, उस दृष्टिकोण से
**जो भारी काम लिखता है**। "क्यों" का उत्तर [Paint thread](/docs/concepts/the-paint-thread) में है।

## कैनोनिकल टेम्पलेट
```java
new Thread(() -> {
   var resultado = trabalhoPesado();        // I/O या CPU — कभी भी paint thread पर नहीं
   meuComponente.onUI(() -> {               // paint thread में फिर से प्रवेश करता है
      mostrar(resultado);                    // UI को केवल यहीं छुएं
      Component.repaint();
   });
}).start();
```
UI में पुनः प्रवेश करने के तरीके:
| कॉल | उपयोग |
|---|---|
| `Component.onUI(Runnable)` | किसी भी thread से, एक कंपोनेंट से शुरू करते हुए |
| `Main.runOnPaintThread(Runnable)` | वही, किसी कंपोनेंट के संदर्भ के बाहर |
| `Main.runOnPaintThreadAndWait(Runnable)` | वही, समाप्त होने तक **ब्लॉक करते हुए** |

## किसी thread में UI इवेंट पर प्रतिक्रिया देना
जब किसी कंपोनेंट के हैंडलर को भारी काम चलाना हो, तो `onActionThread` का उपयोग करें (paint thread के बाहर चलता
है) और `onUI` के साथ पुनः प्रवेश करें:
```java
botao.onActionThread(c -> {
   var dados = baixar();                    // paint thread के बाहर
   c.onUI(() -> lista.setItems(dados));     // UI पर वापस
});
```

## Timers
आवधिक काम (polling, watchdog) के लिए, फ़्रेमवर्क के timers का उपयोग करें:
```java
comp.addTimer(1000);   // हर 1000 ms पर एक timer इवेंट फायर करता है (घटक में संभाला जाता है)
```

## `util` की उपयोगिताएँ
- **`ThreadSync`** — **2 threads** की बैरियर (प्रोड्यूसर/कंज़्यूमर): `start()`/`start(maxMillis)`,
  `finished(resultado)`, `getResult()`। किसी दूसरी thread के परिणाम की timeout के साथ प्रतीक्षा करने के लिए उपयोगी।
- **`RunnableWith<T>`** — तर्क के साथ कॉलबैक: `void run(T obj)`। यह उन कॉलबैक का प्रकार है जो एक मान
  देते हैं (उदा.: `GPSThread` का `onError`)।

```java
ThreadSync sync = new ThreadSync();
new Thread(() -> { var r = calcular(); sync.finished(r); }).start();
sync.start(5000);                 // 5 s तक प्रतीक्षा करता है
Object r = sync.getResult();
```

## सर्वोत्तम अभ्यास
- **सारा** ब्लॉकिंग I/O (DB, HTTP, GPS, BLE) paint thread के **बाहर** चलता है।
- UI को **केवल** `onUI(...)`/`runOnPaintThread(...)` के अंदर छुएँ।
- स्क्रीन छोड़ते समय (`onRemove()` में) threads/timers को रोकें, वरना वे लीक होते हैं।

## सामान्य त्रुटियाँ
- `onUI(...)` के बिना किसी `Thread` से विजेट को छूना → अनियमित व्यवहार/हैंग।
- `runOnPaintThreadAndWait(...)` को paint thread के **भीतर से** कॉल करना (deadlock) — वहाँ नॉन-ब्लॉकिंग
  वैरिएंट का उपयोग करें।
- स्क्रीन बदलते समय Timers/threads का रद्द न होना।

## यह भी देखें
- अवधारणा: [Paint thread](/docs/concepts/the-paint-thread)
- [स्टेट प्रबंधन](/docs/data-and-services/state-management) · [नेटवर्क और HTTP](/docs/data-and-services/networking-http)
