Зависает на 3-5 минут компонент DataGridView в Microsoft Visual C# 2008
Формулировка задачи:
Вот в главном классе есть два метода через invoke
В разных потоках они переодически вызываются, и при непонятных обстоятельвах, программа просто берёт и тупо зависает на строчке кода, которая работает с компонентом DataGridView, а именно Table
То есть зависает либо на этом Table.Rows.Add(row); либо на Table.Rows.RemoveAt(i); и через 3-5 минут развисает и продолжает работать как надо.. В чём трабла? В коде логических ошибок нет.. Вот только многопоточность подозреваю и Invoke.. Очередь длинная выстраивается.))
internal void p_Add(String[] p) { this.Invoke(new MethodInvoker(delegate() { DataGridViewCell[] m = new DataGridViewCell[5]; for (int i = 0; i < 5; i++) {m[i] = new DataGridViewTextBoxCell(); m[i].Value = p[i];} DataGridViewRow row=new DataGridViewRow(); row.Cells.AddRange(m); Table.Rows.Add(row); })); } internal void p_Del(long p) { this.Invoke(new MethodInvoker(delegate() { for (int i = 0; i < Table.RowCount; i++) if (Table.Rows[i].Cells[0].Value.Equals(Convert.ToString(p))) { Table.Rows.RemoveAt(i); break; } })); }
Решение задачи: «Зависает на 3-5 минут компонент DataGridView в Microsoft Visual C# 2008»
textual
Листинг программы
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Web; using System.Web.Services.Protocols; using System.Net.Sockets; using System.Threading; using System.IO; using System.Collections; using System.Runtime.InteropServices; namespace Manunich { public partial class Main:Form { public static Main main; public static HttpServer httpServer; Thread thread; public Main() {InitializeComponent();} private void Form1_Load(object sender, EventArgs e) { httpServer = new HttpServer(8080); thread = new Thread(new ThreadStart(httpServer.listen)); thread.Start(); } internal void p_Add(String[] p) { this.Invoke(new MethodInvoker(delegate() { DataGridViewCell[] m = new DataGridViewCell[5]; for (int i = 0; i < 5; i++) {m[i] = new DataGridViewTextBoxCell(); m[i].Value = p[i];} DataGridViewRow row=new DataGridViewRow(); row.Cells.AddRange(m); Table.Rows.Add(row); })); } internal void p_Del(long p) { this.Invoke(new MethodInvoker(delegate() { for (int i = 0; i < Table.RowCount; i++) if (Table.Rows[i].Cells[0].Value.Equals(Convert.ToString(p))) { Table.Rows.RemoveAt(i); break; } })); } internal void p_Edit(long p,String d,String c) { this.Invoke(new MethodInvoker(delegate() { for (int i = 0; i < Table.RowCount; i++) if (Table.Rows[i].Cells[0].Value.Equals(Convert.ToString(p))) { Table.Rows[i].Cells[4].Value = d; Table.Rows[i].Cells[5].Value = c+" Кб/Сек"; break; } })); } } public class HttpProcessor { static int BUF_SIZE = 65536; public long numOfCon = 0; public TcpClient socket; Stream iS; BufferedStream oD; String res; long len = 0,speed=0; public String client_ip; public HttpProcessor(TcpClient s,long numOfCon, string client_ip) { this.socket = s; this.numOfCon = numOfCon; this.client_ip = client_ip; } static string FSF(long size) {string s=""+size;for(int i = s.Length-3; i>0; i-=3) s = s.Insert(i, " ");return s;} public void timer() { while (len > 0) { Main.main.p_Edit(numOfCon, FSF(len), FSF((speed - len) / 1024)); speed = len; Thread.Sleep(1000); } } public void process() { iS = new BufferedStream(socket.GetStream()); oD = new BufferedStream(socket.GetStream()); try { //Добавляем строку запроса в таблицу Main.main.p_Add(new String[] { Convert.ToString(numOfCon), res, client_ip, FSF(iS.Length), FSF(iS.Length)}); len=iS.Length; byte[] buf = new byte[BUF_SIZE]; //Запускаем новый поток, который раз в секунду обновляет в таблице скорость отправки данных new Thread(new ThreadStart(timer)).Start(); speed = len; while (len > 0) { int numread=iS.Read(buf, 0, (int)Math.Min(BUF_SIZE, len)); if (numread==0) if (len == 0) break; else throw new Exception("Ошибка считывания локальных данных"); len -= numread; oD.Write(buf, 0, numread); oD.Flush(); } Thread.Sleep(20); oD.Close(); } catch (Exception e) {Main.main.Logging(e.Message,this);} if (fs!=null) fs.Close(); iS=null;oD=null;fs=null; len = 0; Main.main.p_Del(numOfCon);//Удаляем из таблицы } } public class HttpServer { static long numOfCon = 0; static IPAddress ipadr = new IPAddress(new byte[] {0,0,0,0}); protected int port; public TcpListener listener; public HttpServer(int port) { this.port = port; } public void listen() { listener = new TcpListener(ipadr, port); listener.Start(); while (true) { TcpClient s = listener.AcceptTcpClient(); numOfCon++; HttpProcessor processor = new HttpProcessor(s, numOfCon, s.Client.RemoteEndPoint.ToString()); Thread thread = new Thread(new ThreadStart(processor.process)); thread.Start(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д