Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Немодальные окна для чата, вызываемые из потока. 
:(
    Опции темы
Pavela
Дата 2.6.2011, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 2.6.2011

Репутация: нет
Всего: нет



Уважаемые, дописываю курсач и вот напололся на проблему...
Пишу чат IRC, общение в каналах худо-бедно сделал, работает.
Но тут дошло дело до обратотки ЛС. Для этого дела написал класс PrivateMessage

Код

public partial class PrivateMessage : Form
    {
        private delegate void SetTextDelegate();
        public static string user = "";
        public static string msg = "";
        public static string msgT = "";
        public static Int32 flag = 0;
        Thread PrivateDiallog;
        public PrivateMessage()
        {
            InitializeComponent();
        }

        public PrivateMessage(string name, string text)
        {
            InitializeComponent();
            this.Text = name;
            user = name;
            msg += text;
        }

        public Int32 flagSet
        {
            get { return flag; }
            set { flag = value; }
        }

        public string userSet
        {
            get { return user; }
            set { user = value; }
        }

        public string msgSet
        {
            get { return msg; }
            set { msgT = value; }
        }        

        private void SetText()
        {
            textBoxChat.Clear();
            textBoxChat.Text = msg;
        }

        public void outputDisplay()
        {
            while (MainForm.connection.IsAlive == true)
            {
                if (Buffer.flag != 0)
                {
                    msg += Buffer.message;
                    if (textBoxChat.InvokeRequired)
                    {
                        SetTextDelegate STD = new SetTextDelegate(SetText);
                        textBoxChat.Invoke(STD);
                    }
                    else
                        textBoxChat.Text = msg;
                    Buffer.flag = 0;
                    Buffer.message = "";
                }
            }            
        }

        private void textBoxMsg_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                if (textBoxMsg.Text != "")
                {
                    msg += DateTime.Now.ToShortTimeString() + " >> " + ConnectionInfo.Nick + " " + textBoxMsg.Text + Environment.NewLine;
                    if (textBoxChat.InvokeRequired)
                    {
                        SetTextDelegate STD = new SetTextDelegate(SetText);
                        textBoxChat.Invoke(STD);
                    }
                    else
                        textBoxChat.Text = msg;
                    Networking.writer.WriteLine("PRIVMSG " + user + " : " + textBoxMsg.Text);
                    Networking.writer.Flush();
                    textBoxMsg.Clear();
                }
            }
        }

        private void textBoxChat_TextChanged(object sender, EventArgs e)
        {
            textBoxChat.SelectionStart = textBoxChat.Text.Length;
            textBoxChat.ScrollToCaret();
        }

        private void PrivateMessage_Load(object sender, EventArgs e)
        {
            PrivateDiallog = new Thread(new ThreadStart(outputDisplay));
            PrivateDiallog.IsBackground = true;
            PrivateDiallog.Start();
        }
    }

где msg - хранит сообщения, user - ник чела, который пишет ЛС (остальные переменные не используются по сути)
textBoxChat - для диалога с юзером
textBoxMsg - для написания сообщения (сообщения отсылаются нажатием на ENTER)


Buffer - буферный класс, содержащий новое сообщение от юзера
Код

public static class Buffer
    {
        public static string message = "";
        public static int flag = 0;
    }

flag - флаг того, что есть новое сообщение, этот флаг отслеживается в потоке outputDisplay класса PrivateMessage.

Ну и наконец, сама проблема.... Код из главной формы MainForm

Код

//код
public PrivateMessage[] PM = new PrivateMessage[20];
private Int32 PMCounter = 0;
Thread OutDiallogServer = new Thread(new ThreadStart(outputDisplay)); //поток для обработки сообщений от сервера
OutDiallogServer.IsBackground = true;
OutDiallogServer.Start();
//код
private void outputDisplay()
        {          
            while (connection.IsAlive == true)
            {
             //код
             else if (outputString[counter].Contains("PRIVMSG")) //если в ответе сервера есть ссобщение от юзера/канала
             {
              //формируем отформатированную строку
              if (incomming[2] == ConnectionInfo.Nick)  //если в ответе сервер содержится ваш ник (т.е. перехват ЛС) далее идут мои мучения
              {        Int32 flag = 0; //флаг для проверки, существует ли уже окно ЛС для данного юзера
                        if (PMCounter == 0) //если нету окошек ЛС
                        {
                            PM[PMCounter] = new PrivateMessage(raw_channel_message[0], formattedString[counter]); //конструктор для класса PM
                            //PM[PMCounter].Owner = this; //пробовал... выдаёт ошибку, и вообще хз, для чего этот овнер
                            Buffer.message = ""; //инициализация буферного класса
                            Buffer.flag = 1;
                            //Application.Run(PM[PMCounter]); //окошко запускается, но не реагирует на буферные сообщения
                            PM[PMCounter].Show(); //окошко вообще повисает
                            Application.DoEvents(); //окошко в повисшем состоянии с большими задержками выдаёт сообщения от юзера, но написать чё-то самому невозможно
                            PMCounter++; //увеличиваем счётчик окошек
                        }
                        else 
                        {
                            for (Int32 i = 0; i < PMCounter; i++)
                            {
                                if (raw_channel_message[0] == PM[i].userSet) //всё то же, если есть окошко для данного юзера
                                {
                                    Buffer.message = formattedString[counter];
                                    Buffer.flag = 1;
                                    Application.DoEvents();
                                    //PM[i].Show();
                                    //Application.Run(PM[i]);
                                    //PM[i].AddText();
                                    flag = 1;
                                    break;
                                }
                            }
                            if (flag == 0) //если нету
                            {
                                PM[PMCounter] = new PrivateMessage(raw_channel_message[0], formattedString[counter]);
                                //PM[PMCounter].Owner = this;
                                Buffer.message = "";
                                Buffer.flag = 1;
                                /*if (PM[PMCounter].InvokeRequired)
                                {
                                    SetTextDelegate STD = new SetTextDelegate(OpenWindows);
                                    PM[PMCounter].Invoke(STD);
                                }
                                else
                                    PM[PMCounter].Show();*/
                                PM[PMCounter].Show();
                                Application.DoEvents();
                                //Application.Run(PM[PMCounter]);
                                //PM[PMCounter].AddText();
                                PMCounter++;
                            }
                        }
                    }
                  //код...
                }


Помогите, времени разбираться уже мало, но чувствую, немного нужно добавить... В шарпах не сильно шарю, как видите...
Прикрепил свой проект (VS 2010) http://rghost.ru/9118351

Это сообщение отредактировал(а) Pavela - 2.6.2011, 21:11
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.