Реализация функций MonoBehaviour

Здесь можно задать свои вопросы напрямую разработчикам Unity3D

Реализация функций MonoBehaviour

Сообщение slawikSerb 14 фев 2016, 12:30

Добрый день вопрос заключается в следующем "Будет ли реализация функций MonoBehaviour не из основного потока?"
slawikSerb
UNец
 
Сообщения: 11
Зарегистрирован: 08 фев 2016, 21:46

Re: Реализация функций MonoBehaviour

Сообщение waruiyume 14 фев 2016, 12:37

Монобехи непотокобезопасны.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Реализация функций MonoBehaviour

Сообщение slawikSerb 14 фев 2016, 20:11

Тогда не подскажите как реализован скрипт Photon Server? так как там есть поток и можно использовать функцию создания?
slawikSerb
UNец
 
Сообщения: 11
Зарегистрирован: 08 фев 2016, 21:46

Re: Реализация функций MonoBehaviour

Сообщение Diab10 15 фев 2016, 09:29

slawikSerb писал(а):Тогда не подскажите как реализован скрипт Photon Server? так как там есть поток и можно использовать функцию создания?


Делаете List, в который кладёте данные в одном потоке, а в другом - эти данные достаёте. В зависимости от этих данные делаете нужные вещи.
Лист или что то подобное - посредник между потоком юнити и дополнительными потоками
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Реализация функций MonoBehaviour

Сообщение slawikSerb 15 фев 2016, 17:45

"а в другом - эти данные достаёте"
я создаю сервер там обрабатываю в потоке т.е. каким образом я должен обрабатывать list если он постоянно заполняется,
ВОТ DLL которую я написал для сепвера
Синтаксис:
Используется csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using UnityEngine;
using System.Collections;

namespace Server_Local_TCP
{

    public class Server_TCP
    {
        public SKillable Perest;

        public interface SKillable
        {
            void Kills(string peremennaya);
        }

        public void Skillable_instante(SKillable SKillable_peremennaya)
        {
            try
            {
                Perest = SKillable_peremennaya;
                obrabotka();
            }
            catch (Exception e) { Debug.Log(e); }
        }

        private IPAddress localAddr;
        private TcpListener server;
        private int ports;
        private Thread Server;
        private List<TcpClient> Client_TcpClient = new List<TcpClient>();
        private List<System.Threading.Thread> Client_Disconect = new List<Thread>();
        private List<Thread> Client_Client = new List<Thread>();

        public void start_server(string ip, int port)
        {
            localAddr = IPAddress.Parse(ip);
            server = new TcpListener(localAddr, port);
            server.Start();

            System.Threading.Thread MyThread1 =
                 new System.Threading.Thread(delegate() { Podklucenie_k_servers(); });
            MyThread1.Start();
            Server = MyThread1;

        }
        public void stop_server()
        {
            System.Threading.Thread MyThread1 =
                     new System.Threading.Thread(delegate() { stop_server_Thread(); });
            MyThread1.Start();

        }
        public void stop_server_Thread()
        {
            try
            {
                Debug.Log("Server_Stop");
                Console.WriteLine("Server_Stop");
                for (int i = 0; i < Client_Disconect.Count; i++)
                {
                    Client_Disconect[i].Join(1);
                }
                server.Stop();
                Server.Join(1000);
            }
            catch (Exception tr)
            {
                Debug.Log(tr);
                Console.WriteLine(tr);
            }
        }
        public void Podklucenie_k_servers()
        {

            Debug.Log("Server_Start");
            Console.WriteLine("Server_Start");

            while (true)
            {
                try
                {
                    TcpClient client = server.AcceptTcpClient();

                    System.Threading.Thread MyThread1 =
                     new System.Threading.Thread(delegate() { clients(client); });
                    MyThread1.Start();

                    Client_TcpClient.Add(client);
                    Client_Disconect.Add(MyThread1);
                }
                catch (Exception tr)
                {
                    Debug.Log(tr);
                    Console.WriteLine(tr);
                }
            }
        }

        private void clients(TcpClient client)
        {
            Debug.Log("Client_on");
            Console.WriteLine("Client_on");
            NetworkStream stream = client.GetStream();
            bool diskonect = true;

            System.Threading.Thread MyThread1 =
                 new System.Threading.Thread(delegate() { priem(stream); });
            MyThread1.Start();

            while (diskonect == true)
            {
                Thread.Sleep(2000);
                int i;
                byte[] bytes = new byte[1024];
                i = stream.Read(bytes, 0, bytes.Length);

                if (i == 0)
                {
                    client.Close();
                    diskonect = false;
                }
                else
                {
                    Debug.Log("Client");
                    Console.WriteLine("Client");
                }
            }
            Debug.Log("Client_off");
            Console.WriteLine("Client_off");
        }

        private void priem(NetworkStream stream)
        {
            string Request = "";
            byte[] Buffer = new byte[1024];
            int Count;
            Count = stream.Read(Buffer, 0, Buffer.Length);
            Request += Encoding.ASCII.GetString(Buffer, 0, Count);
            priem_string.Add(Request);
        }

        public List<string> priem_string = new List<string>();
        public bool obrabotka_bool;
        public void obrabotka()
        {
            while (obrabotka_bool)
            {
                if (priem_string.Count > 0)
                {
                    Perest.Kills(priem_string[0]);
                    priem_string.RemoveAt(0);
                }
            }
        }

        public void otpravka(NetworkStream stream, string Text)
        {
            string response = "Привет мир";
            byte[] data = Encoding.UTF8.GetBytes(response);
            stream.Write(data, 0, data.Length);
        }
    }
}
 


Серверная часть на Unity 3D
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using Server_Local_TCP;
using System.Net.Sockets;
using System.Collections.Generic;

public class Test1 : MonoBehaviour,Server_Local_TCP.Server_TCP.SKillable {

    public Server_TCP server { get; set; }
        // Use this for initialization
        void Start () {
       
        server = new Server_TCP();
        server.Skillable_instante(this);
        System.Threading.Thread MyThread1 =
                 new System.Threading.Thread(delegate() { piater(); });
        MyThread1.Start();
        }

    private void piater()
    {
        server.start_server("127.0.0.1",5488);
        System.Threading.Thread.Sleep(7200000);
        server.stop_server();
    }
        // Update is called once per frame
        void Update ()
    {

        }

    public GameObject personah;
    public void Kills(string peremennaya)
    {
        Debug.Log(peremennaya);
        if (peremennaya == "sosdat")
        {
            Instantiate(personah);
        }
    }
}
 


если сделать так то происходит зависание из за вызова while в основном потоке
и как с этим бороться?
slawikSerb
UNец
 
Сообщения: 11
Зарегистрирован: 08 фев 2016, 21:46

Re: Реализация функций MonoBehaviour

Сообщение Diab10 15 фев 2016, 19:00

slawikSerb писал(а):я создаю сервер там обрабатываю в потоке т.е. каким образом я должен обрабатывать list если он постоянно заполняется


Постоянно доставать :)

slawikSerb писал(а):если сделать так то происходит зависание из за вызова while в основном потоке
и как с этим бороться?


Зачем в основном потоке делать while? Чтобы лист проверять? Проверяйте в FixedUpdate
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Реализация функций MonoBehaviour

Сообщение slawikSerb 15 фев 2016, 22:41

Спасибо большее за помощь, немного не то что я хотел получить, но все же спасибо. Я хотел все это сделать на стороне DLL как в Photon servere реализовано?
slawikSerb
UNец
 
Сообщения: 11
Зарегистрирован: 08 фев 2016, 21:46

Re: Реализация функций MonoBehaviour

Сообщение Diab10 16 фев 2016, 19:53

slawikSerb писал(а):Спасибо большее за помощь, немного не то что я хотел получить, но все же спасибо. Я хотел все это сделать на стороне DLL как в Photon servere реализовано?


Не знаю что там в фотоне, но в DLL можно засунуть почти любой код. ДЛЛ же это просто библиотека, кучка скриптов в одном файле :)
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Реализация функций MonoBehaviour

Сообщение slawikSerb 21 фев 2016, 13:30

Про длл все понятно, а можно ли из второго потока вызвать основной поток или функцию из второго потока как будто из первого?
slawikSerb
UNец
 
Сообщения: 11
Зарегистрирован: 08 фев 2016, 21:46

Re: Реализация функций MonoBehaviour

Сообщение Diab10 21 фев 2016, 16:19

slawikSerb писал(а):Про длл все понятно, а можно ли из второго потока вызвать основной поток или функцию из второго потока как будто из первого?


Функции юнити - нет. Свои - возможно, хз
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Реализация функций MonoBehaviour

Сообщение slawikSerb 24 фев 2016, 17:16

Мне как раз и нужно, мне нужно во втором потоке вызвать функцию как будто первый поток вызывает ее, чтобы можно было использовать Instantiate?
slawikSerb
UNец
 
Сообщения: 11
Зарегистрирован: 08 фев 2016, 21:46


Вернуться в Вопросы разработчикам движка

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2