Уважаемые, дописываю курсач и вот напололся на проблему... Пишу чат 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
|