Загрузка из базы данных с сервера создает переполнение стека

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Загрузка из базы данных с сервера создает переполнение стека

Сообщение wasp 04 авг 2023, 07:45

Загружаю массив из базы данных на сервере, после перебираю и по каждой записи загружаю изображение. Все работает, но происходит переполнение стека. Не могу понять в чем дело, подскажите что не так. Вот мой код.
Синтаксис:
Используется csharp
    private Coroutine currentCoroutine;

    void Start()
    {
        string key = "Nick";
        NameUser = PlayerPrefs.GetString(key, userName);
        string key1 = "Email";
        NameEmail = PlayerPrefs.GetString(key1, userEmail);
        _img = GetComponent<UnityEngine.UI.Image>();
        button_L.gameObject.SetActive(false);
    }
    public void ButtonPrefs_P()
    {
        if (line >= 0)
        {
            button_L.gameObject.SetActive(true);
        }
        line += 1;
        StartCoroutine(imagesText());
        Debug.Log("Проверка URL из базы!" + line);
    }
    public void ButtonPrefs_L()
    {
       if (line <= 1)
       {
           button_L.gameObject.SetActive(false);
       }
       line -= 1;
       StartCoroutine(imagesText());
       likeButton.gameObject.SetActive(true);
    }
    public void ButtonPrefs_Like()
    {
        StartCoroutine(LoadLike());
        likeButton.gameObject.SetActive(false);
    }
    IEnumerator imagesText() // Получаем URL изображения
    {
        WWWForm ImageText = new WWWForm();
        ImageText.AddField("name", NameUser);
        ImageText.AddField("email", NameEmail);
        using (UnityWebRequest www = UnityWebRequest.Post("https://*****/*****.php", ImageText))
        {
            yield return http://www.SendWebRequest();
            if (http://www.isNetworkError || http://www.isHttpError)
            {
                Debug.Log(http://www.error);
            }
            else
            {
                string responseText = http://www.downloadHandler.text;
                if (responseText.StartsWith("|"))
                {
                    string[] dataChunks = responseText.Split('|');
                    var result = dataChunks[line];
                    string[] arr1 = result.Split(',');
                    var nomerUrl = arr1[0];
                    var result1 = arr1[1];
                    stroka_a.text = result1.ToString();
                    var like = arr1[2];
                    int likeuser = int.Parse(like.Replace(" ", string.Empty));
                    StartCoroutine(LoadFromWeb(nomerUrl));
                    Debug.Log("Проверка URL из базы!" + nomerUrl);
                    if (currentCoroutine != null)
                    {
                        yield break;
                        StopCoroutine(currentCoroutine);
                        currentCoroutine = null;
                    }
                }
            }
           
        }
    }
}
wasp
UNец
 
Сообщения: 9
Зарегистрирован: 16 ноя 2019, 13:25

Re: Загрузка из базы данных с сервера создает переполнение стека

Сообщение 1max1 04 авг 2023, 11:16

LoadLike это что?
LoadFromWeb это что?

Синтаксис:
Используется csharp
if (currentCoroutine != null)
                    {
                        yield break;
                        StopCoroutine(currentCoroutine);
                        currentCoroutine = null;
                    }

Это зачем? Оно никогда не сработает тк все что после yield break игнорируется, должно быть предупреждение в консоль.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Загрузка из базы данных с сервера создает переполнение стека

Сообщение wasp 04 авг 2023, 12:44

LoadLike это что?
LoadFromWeb это что? Это последующая корутина которая загружает изображение, а LoadLike есть или нет лайк этой кортинке. То что в следующем вашем вопросе ,это попытка остановить бесконечный цикл работы этой корутины. Ниже весь код.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using System.IO;
using TMPro;
using System.Net;

[RequireComponent(typeof(Image))]
public class Gallery_Image_Text : MonoBehaviour
{
    Image _img;
    string images;
    private int line = 0;
    public GameObject button_L;
    public GameObject button_P;
    [SerializeField] private TMP_Text stroka_a;
    string result = "";
    int likeuser;
    string NameEmail = "";
    string userName = "";
    string NameUser = "";
    string userEmail = "";
    public Button likeButton;
    string userLike = "";
    int likes;
    string nomerUrl = "";
    private Coroutine currentCoroutine;

    void Start()
    {
        string key = "Nick";
        NameUser = PlayerPrefs.GetString(key, userName);
        string key1 = "Email";
        NameEmail = PlayerPrefs.GetString(key1, userEmail);
        _img = GetComponent<UnityEngine.UI.Image>();
        button_L.gameObject.SetActive(false);
    }
    public void ButtonPrefs_P()
    {
        if (line >= 0)
        {
            button_L.gameObject.SetActive(true);
        }
        line += 1;
        StartCoroutine(imagesText());
        Debug.Log("Проверка URL из базы!" + line);
        //StartCoroutine(GetText());
        //StartCoroutine(noLike());

    }
    public void ButtonPrefs_L()
    {
       if (line <= 1)
       {
           button_L.gameObject.SetActive(false);
       }
       line -= 1;
       StartCoroutine(imagesText());
       // StartCoroutine(GetText());
        //StartCoroutine(noLike());
        likeButton.gameObject.SetActive(true);
    }
    public void ButtonPrefs_Like()
    {
        StartCoroutine(LoadLike());
        likeButton.gameObject.SetActive(false);
    }
   IEnumerator imagesText() // Получаем URL изображения
    {
        WWWForm ImageText = new WWWForm();
        ImageText.AddField("name", NameUser);
        ImageText.AddField("email", NameEmail);
        using (UnityWebRequest www = UnityWebRequest.Post("https://*****/*****.php", ImageText))
        {
            yield return http://www.SendWebRequest();
            if (http://www.isNetworkError || http://www.isHttpError)
            {
                Debug.Log(http://www.error);
            }
            else
            {
                string responseText = http://www.downloadHandler.text;
                if (responseText.StartsWith("|"))
                {
                    string[] dataChunks = responseText.Split('|');
                    var result = dataChunks[line];
                    string[] arr1 = result.Split(',');
                    var nomerUrl = arr1[0];
                    var result1 = arr1[1];
                    stroka_a.text = result1.ToString();
                    var like = arr1[2];
                    int likeuser = int.Parse(like.Replace(" ", string.Empty));
                    StartCoroutine(LoadFromWeb(nomerUrl));
                    Debug.Log("Проверка URL из базы!" + nomerUrl);
                    if (currentCoroutine != null)
                    {
                        yield break;
                        StopCoroutine(currentCoroutine);
                        currentCoroutine = null;
                    }
                }
            }
           
        }
    }
   
    IEnumerator LoadFromWeb(string nomerUrl) // По URL загружаем картинку
    {
        yield return imagesText();
        UnityWebRequest wr = new UnityWebRequest(nomerUrl);
        DownloadHandlerTexture texDl = new DownloadHandlerTexture(true);
        wr.downloadHandler = texDl;
        yield return wr.SendWebRequest();
        if (wr.result == UnityWebRequest.Result.Success)
        {
            Texture2D t = texDl.texture;
            Sprite s = Sprite.Create(t, new Rect(0, 0, t.width, t.height),
                Vector2.zero, 1f);
            _img.sprite = s;
        }
    }
    private IEnumerator LoadLike() // Ставим лайк
    {
        yield return imagesText();
        WWWForm SaveImage = new WWWForm();
         SaveImage.AddField("name", NameUser);
         SaveImage.AddField("email", NameEmail);
         SaveImage.AddField("iidlike", likeuser);
         using (UnityWebRequest www = UnityWebRequest.Post("https://*****/*****.php", SaveImage))
         {
              yield return http://www.SendWebRequest();

              if (http://www.isNetworkError || http://www.isHttpError)
              {
                  Debug.Log(http://www.error);
              }
              else
              {
                Debug.Log("Данные переданы!");
              }
         }
    }
    private IEnumerator noLike() // Проверяем есть ли лайк, если есть то не показываем кнопку
    {
        yield return imagesText();
        WWWForm Like = new WWWForm();
        Like.AddField("name", NameUser);
        Like.AddField("email", NameEmail);
        Like.AddField("iidlike", likeuser);
        using (UnityWebRequest www = UnityWebRequest.Post("https://*****/*****.php", Like))
        {
            yield return http://www.SendWebRequest();
            if (http://www.isNetworkError || http://www.isHttpError)
            {
                Debug.Log(http://www.error);
            }
            else
            {
                string responseText = http://www.downloadHandler.text;
                if (responseText.StartsWith("Success"))
                {
                    string[] dataChunks = responseText.Split('|');
                    userLike = dataChunks[1];
                    likes = int.Parse(userLike.Replace(" ", string.Empty));
                    Debug.Log("Проверка лайка!" + userLike);
                    if (likes == 0)
                    {
                        Debug.Log("Лайк!" + likes);
                        likeButton.gameObject.SetActive(true);
                    }
                    else
                    {
                        likeButton.gameObject.SetActive(false);
                    }
                }
            }
        }
    }
}
wasp
UNец
 
Сообщения: 9
Зарегистрирован: 16 ноя 2019, 13:25

Re: Загрузка из базы данных с сервера создает переполнение стека

Сообщение 1max1 04 авг 2023, 13:36

Обычно такая ошибка возникает в рекурсивных методах. На какую строку хоть указывает ошибка?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Загрузка из базы данных с сервера создает переполнение стека

Сообщение wasp 04 авг 2023, 14:20

Ни какой строки не выдается, как ошибка. Выводится до бесконечности Debug.Log("Проверка URL из базы!" + nomerUrl); А после все зависает.
wasp
UNец
 
Сообщения: 9
Зарегистрирован: 16 ноя 2019, 13:25

Re: Загрузка из базы данных с сервера создает переполнение стека

Сообщение 1max1 04 авг 2023, 16:32

Ну так правильно, у тебя imagesText() вызывает LoadFromWeb(), а тот опять imagesText() и так по кругу.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Загрузка из базы данных с сервера создает переполнение стека

Сообщение wasp 04 авг 2023, 17:13

Понял, разобрался StartCoroutine(LoadFromWeb(nomerUrl)); отрабатывает в самой корутине и yield return imagesText(); и повторяет тоже самое. Помогло Благодарю за подсказку.
wasp
UNец
 
Сообщения: 9
Зарегистрирован: 16 ноя 2019, 13:25


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 24