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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод на форму каждую секунду, Проблема 
:(
    Опции темы
kokcu
Дата 31.3.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нужно выводить на форму каждую сек скорость закачки на сетевуху. В консоли все работает отлично
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.NetworkInformation;
using System.Threading;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            double start_b=0;
            double end_b = 0;
            double razn = 0;
            for (int i = 1; ;)
            {
                NetworkInterface[] ni = NetworkInterface.GetAllNetworkInterfaces();
                IPv4InterfaceStatistics stat = ni[1].GetIPv4Statistics();
                double kbytes = stat.BytesReceived / 1024;
                Thread.Sleep(1000);
                if (i == 1) { start_b = kbytes; ; i = 2; }
                else 
                { 
                    end_b = kbytes; i = 1;
                    razn = end_b - start_b;
                    Console.WriteLine(razn+" kb\\s");
                }

            }
            Console.ReadLine();
        }
        

    }
}

Знаю что криво)
Теперь нужно это все перенести на форму, вставлял это цикл перед 
         
Код

   InitializeComponent();

Но так как он бесконечный форма и не появлялась. Пробовал сделать в разных потоках, но через секунду пишет что нельзя обратиться к Label1 так как он из другого потока.
Как быть?

Это сообщение отредактировал(а) kokcu - 31.3.2009, 15:21
PM MAIL   Вверх
zaver
Дата 31.3.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



тут без отдельного потока не обойтись. обращение к компонентам формы из чужого потока выполняется через метод Form1.Invoke(), который позволяет вызвать метод какбы из потока формы. пользуйся поиском эта тема уже 100раз подымалась

неверная мысль:
Цитата

Теперь нужно это все перенести на форму, вставлял это цикл перед InitializeComponent();


PM MAIL WWW ICQ Skype YIM MSN   Вверх
-Mikle-
Дата 31.3.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



А что Timer не подходит?



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
SKrivosein
Дата 31.3.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

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



Может я непонял чего, особенно это: "Но так как он бесконечный форма и не появлялась."
А почему не сделать так:
Код

public partial class Form1 : Form
    {
        private double razn = 0;

        public Form1()
        {
            InitializeComponent();

            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            Paint += new PaintEventHandler(Form1_Paint);
        }

        void Form1_Paint(object sender, PaintEventArgs e)
        {
            string pismo = "Arial";
            Graphics g = e.Graphics;

            g.DrawString
                   (razn.ToString() + " kb\\s", new Font(pismo, 8), Brushes.TvojColor, X,Y);
        }

        private void timerSpeedUpload_Tick(object sender, EventArgs e)
        {
            TvojMetod();
            Rectangle oblast = new Rectangle(X, Y, Width, Height);
            Invalidate(oblast);
        }
        private void TvojMetod()
        {
            ...... //твой метод который считает razn       
        }
    }

Я пока код ваял -Mikle- меня обогнал smile 



Это сообщение отредактировал(а) SKrivosein - 31.3.2009, 16:42


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
-Mikle-
Дата 31.3.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Ну в общем-то и Paint по хорошему не обязателен... статистику можно получать в потоке формы по таймеру (как показал SKrivosein), она не долго считается, и выводит ее сразу же в Label...



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
SKrivosein
Дата 31.3.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

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



Область label все равно перерисовать надо?

Это сообщение отредактировал(а) SKrivosein - 31.3.2009, 17:13


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
kokcu
Дата 31.3.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

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.NetworkInformation;
using System.Threading;
using System.Drawing;

namespace NetAct
{
    public partial class Form1 : Form
    {
        static public double razn = 0;
        static public double start_b = 0;
        static public double end_b = 0;
        static public int i = 1;
        public Form1()
        {
       

            InitializeComponent();
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            Paint += new PaintEventHandler(Form1_Paint);
        }
        void Form1_Paint(object sender, PaintEventArgs e)
        {
            string pismo = "Arial";
            Graphics g = e.Graphics;
            g.DrawString
                   (razn.ToString() + " kb\\s", new Font(pismo, 8), Brushes.Black, 10, 10);
        }
       
             private void TvojMetod()
        {
            NetworkInterface[] ni = NetworkInterface.GetAllNetworkInterfaces();
            IPv4InterfaceStatistics stat = ni[1].GetIPv4Statistics();
            double kbytes = stat.BytesReceived / 1024;
            if (i == 1) { start_b = kbytes; ; i = 2; }
            else
            {
                end_b = kbytes; i = 1;
                razn = end_b - start_b;
                }
  

        }

             private void timer1_Tick(object sender, EventArgs e)
             {
                 TvojMetod();
                 Rectangle oblast = new Rectangle(10, 10, 100, 100);
                 Invalidate(oblast);
             }

        }
        
    }



Чето не хочет(

Добавлено через 6 минут и 18 секунд
Сейчас без рисования попроую

Добавлено через 9 минут и 9 секунд
Код

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.NetworkInformation;
using System.Threading;
using System.Drawing;

namespace NetAct
{
    public partial class Form1 : Form
    {
        static public double razn = 0;
        static public double start_b = 0;
        static public double end_b = 0;
        static public int i = 1;
        public Form1()
        {
       

            InitializeComponent();
            
        }
        
       
           

             private void timer1_Tick(object sender, EventArgs e)
             {
                 NetworkInterface[] ni = NetworkInterface.GetAllNetworkInterfaces();
                 IPv4InterfaceStatistics stat = ni[1].GetIPv4Statistics();
                 double kbytes = stat.BytesReceived / 1024;
                 if (i == 1) { start_b = kbytes; ; i = 2; }
                 else
                 {
                     end_b = kbytes; i = 1;
                     razn = end_b - start_b;
                     label1.Text = razn.ToString();
                 }
             }

        }
        
    }



0_о опять не хочет
PM MAIL   Вверх
SKrivosein
Дата 31.3.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

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



В моём методе у меня все по идее дожно работать, убери вторую using System.Drawing;
Провер если правильно таймер настроен, Enabled = true, Inreval=1000 (то есть 1 сек)
Если не работает ищи ошибку в своём методе,посмотри в дебагру какое значение имеет razn каждую секунду

PS: а я и незнал, а ещё и забыл  smile  что label сам себя перерисовует, я на ASP.NET сейчас больше сижу.

Это сообщение отредактировал(а) SKrivosein - 31.3.2009, 19:08


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
-Mikle-
Дата 31.3.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Вот этот код у меня работает

Код

using System;
using System.Windows.Forms;
using System.Net.NetworkInformation;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            timer = new Timer();
            timer.Interval = 1000;
            timer.Enabled = true;
            timer.Tick += new EventHandler(timer1_Tick);


            NetworkInterface[] niArray = NetworkInterface.GetAllNetworkInterfaces();
            if (niArray.Length == 0)
                throw new InvalidOperationException();

            // !!! У меня нулевой индекс интерфейса интернета
            // !!! У тебя может быть и другой
            // !!! Лучше предоставить пользователю выбор из списка
            networkInterface = niArray[0];
            startRecivedBytes = lastRecivedBytes = this.GetRecivedBytes();
        }

        Timer timer;
        NetworkInterface networkInterface;
        int startRecivedBytes, lastRecivedBytes;

        private int GetRecivedBytes()
        {
            IPv4InterfaceStatistics ipv4Stat = networkInterface.GetIPv4Statistics();
            return (int)(ipv4Stat.BytesReceived);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            int recivedBytes = this.GetRecivedBytes();

            label1.Text = string.Format("С момента запуска программы, получено {0} КБ.", (recivedBytes - startRecivedBytes) / 1024);
            label2.Text = string.Format("Скорость получения {0} байт/сек.", (recivedBytes - lastRecivedBytes));

            lastRecivedBytes = recivedBytes;
        }
    }
}


Добавлено @ 20:17
Добавь только два Label на форму, Timer добавляется здесь кодом...


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
-Mikle-
Дата 31.3.2009, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

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



Заметил, что форма притормаживает раз в секунду... то есть метод GetIPv4Statistics работает не так быстро как хотелось бы...

Вот пример с потоками (используется потоковый таймер):
Код

using System;
using System.Windows.Forms;
using System.Net.NetworkInformation;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            kbytesFromStart = bytesPerSecond = -1;

            NetworkInterface[] niArray = NetworkInterface.GetAllNetworkInterfaces();
            if (niArray.Length == 0)
                throw new InvalidOperationException();

            // !!! У меня нулевой индекс интерфейса интернета
            // !!! У тебя может быть и другой
            // !!! Лучше предоставить пользователю выбор из списка
            networkInterface = niArray[0];
            startRecivedBytes = lastRecivedBytes = this.GetRecivedBytes();

            timer = new System.Threading.Timer(timer_Callback, null, 0, 1000);
        }

        System.Threading.Timer timer;
        NetworkInterface networkInterface;
        int startRecivedBytes, lastRecivedBytes;
        Action<Label, string> updateLabel = new Action<Label, string>((label, text) => label.Text = text);

        private int GetRecivedBytes()
        {
            IPv4InterfaceStatistics ipv4Stat = networkInterface.GetIPv4Statistics();
            return (int)(ipv4Stat.BytesReceived);
        }

        int kbytesFromStart;
        private void SetKBytesFromStart(int value)
        {
            if (kbytesFromStart == value) return;
            kbytesFromStart = value;

            string text = string.Format("С момента запуска программы, получено {0} КБ.", kbytesFromStart);
            if (label1.InvokeRequired)
                label1.Invoke(updateLabel, label1, text);
            else
                updateLabel(label1, text);
        }

        int bytesPerSecond;
        private void SetBytesPerSecond(int value)
        {
            if (bytesPerSecond == value) return;
            bytesPerSecond = value;

            string text = string.Format("Скорость получения {0} байт/сек.", bytesPerSecond);
            if (label2.InvokeRequired)
                label2.Invoke(updateLabel, label2, text);
            else
                updateLabel(label2, text);
        }

        private void timer_Callback(object state)
        {
            int recivedBytes = this.GetRecivedBytes();

            this.SetKBytesFromStart((recivedBytes - startRecivedBytes) / 1024);
            this.SetBytesPerSecond(recivedBytes - lastRecivedBytes);

            lastRecivedBytes = recivedBytes;
        }
    }
}



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
SKrivosein
Дата 31.3.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

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



-Mikle- и у меня а твой метод работает, молодца smile 


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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