В чем проблема, если виджеты не отображаются и приложение зависает?

Как организовать код приложения для мониторинга курса рубля к тенге, использующего 2 файла, для лучшей структуры и читаемости?
  • 8 января 2024 г. 13:58
Ответы на вопрос 2
Проблема виджетов, которые не отображаются, и зависания приложения может быть вызвана множеством различных причин, вот некоторые из них:

1. **Проблемы с потоками**: Если вы выполняете длительные операции в главном (UI) потоке, это может привести к зависанию ваших виджетов и интерфейса. Всегда следует использовать фоновые потоки для длительных операций, например `AsyncTask` в Android или GCD в iOS.

2. **Ошибка в логике отображения виджетов**: Неверное управление состоянием виджетов может привести к их неверному отображению. Убедитесь, что логика отображения виджетов корректна и состояние виджетов обновляется правильно.

3. **Утечки памяти**: Если ваше приложение не правильно управляет памятью, это может привести к недостатку ресурсов и, как следствие, к зависанию и проблемам с отображением.

4. **Ошибки в коде виджетов**: Ошибки такого рода могут возникнуть из-за неправильного использования API виджета или если логика обновления виджета содержит ошибки.

Для решения этих проблем следует:

- Выполнять любые тяжёлые операции в фоновом потоке.
- Пересмотреть логику управления состоянием виджетов.
- Произвести профилирование памяти приложения для выявления утечек.
- Тестировать и отлаживать код виджетов в отдельности.

Теперь по поводу организации кода приложения для мониторинга курса рубля к тенге. Важно разделить приложение на модули таким образом, чтобы каждый модуль выполнял чётко определённую функцию. Например:

1. **Модель данных (Data Model)**: Содержит классы, которые описывают структуру данных курса валют.

2. **Сетевой слой (Networking)**: Отвечает за получение данных от API, которое предоставляет данные о курсе валют.

3. **Бизнес-логика (Business Logic)**: Содержит код для обработки и преобразования данных для отображения в пользовательском интерфейсе.

4. **Пользовательский интерфейс (UI)**: Содержит код, который непосредственно взаимодействует с пользователем (виджеты, экраны, анимации).

Создайте два файла, например:

- `CurrencyRateMonitor.swift` или `CurrencyRateMonitor.java` для бизнес-логики.
- `CurrencyRateService.swift` или `CurrencyRateService.java` для сетевых операций.

Бизнес-логика может выглядеть примерно так:

```swift
// CurrencyRateMonitor.swift

class CurrencyRateMonitor {
    private let currencyRateService = CurrencyRateService()

    func updateRates(completion: @escaping (CurrencyRate?) -> Void) {
        currencyRateService.fetchCurrencyRate(from: "RUB", to: "KZT") { rate in
            // обработка полученных данных, возможно сохранение в базе данных
            completion(rate)
        }
    }
}
```

A сетевой слой может выглядеть так:

```swift
// CurrencyRateService.swift

class CurrencyRateService {
    func fetchCurrencyRate(from: String, to: String, completion: @escaping (CurrencyRate?) -> Void) {
        // выполнение сетевого запроса к API для получения курса
        // parse
Что это за *непроизносимое марсианское ругательство*? 
Во-первых, ты реализуешь (вечный?) цикл через рекурсию, что само по себе глупо. Рекурсия куда более ограниченная штука, хотя бы из-за глубины стека.
Во-вторых, у тебя именно что бесконечный цикл - ты не даёшь программе передышки, чтобы она могла отрисовать окно. По сути, у тебя выполнение зациклится намертво на строке window1 = Kurz() , так как приложение уйдёт в рекурсивный вызов self.setting() и из него уже не вернётся.

Первая же ссылка в гугле по запросу "pyqt timer" даёт пример, как периодически обновлять содержимое окна, используя QTimer .

Сначала читай, потом думай, потом уже бросайся делать.
Похожие вопросы