Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2010, 19:42   #1
lexluter1988
Пользователь
 
Аватар для lexluter1988
 
Регистрация: 20.04.2010
Сообщений: 47
По умолчанию цикл While весит прогу. c# visual studio 2008

CommPort - класс для работы с COM- портом. Рабочий на 100%
Если запустить следующий код, то при нажатии на кнопку
программа должна работать в цикле пока i>0. Т.е. бесконечно.
Вместо i ставиться переменная, значение которой меняется нажатием другой кнопки. Этакий видеоплейер с кнопками Запись, Пауза.
Если цикл while убрать, то все работает.


Код:
 private void recButton_Click(object sender, EventArgs e)
        {

            CommPort port = new CommPort(pN, bR, dB, dP, sB);

            if (port.Open())
            {
                while(i>0)
                {                
                    i++;
                    testText.Text = Convert.ToString(i);
                    //  byte[] data = port.Read(2);
                    //  i = data[0] + data[1];

                    port.Close();
                 };
             
             }

            else
            {

                MessageBox.Show("Порт не открыт или не существует");
              
            }          

        }
С уважением, Алексей
lexluter1988 вне форума Ответить с цитированием
Старый 23.05.2010, 20:21   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не силен в шарпе, но у вас же в одном потоке выполняется все?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.05.2010, 08:53   #3
lexluter1988
Пользователь
 
Аватар для lexluter1988
 
Регистрация: 20.04.2010
Сообщений: 47
По умолчанию

Вопрос может быть глупый, но :
Почему если написать бесконечный цикл в Консольной программе, то он не весит систему. А в Windows forms весит?
lexluter1988 вне форума Ответить с цитированием
Старый 24.05.2010, 13:00   #4
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

потому что в окнах интерфейс, там должны перехватывать сообщения, обрабатываться и обновляться само окно

а консоль виснет так же, ведь нельзя ничего делать(ввод например) пока цикл крутиться, просто в консоле нет интерфейса вот и не заметно это, точней делать-то можно но цикл уже остановится и будет нас ждать
m0nax вне форума Ответить с цитированием
Старый 24.05.2010, 17:19   #5
lexluter1988
Пользователь
 
Аватар для lexluter1988
 
Регистрация: 20.04.2010
Сообщений: 47
По умолчанию

Окно виснет и при маленьком цикле в 50-500 итераций.
Может как вариант попробовать многопоточность?!
lexluter1988 вне форума Ответить с цитированием
Старый 24.05.2010, 17:51   #6
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Пепел Феникса прав. Если это все дело организовать в одном потоке, а точнее в главном, который создается, когда ты запускаешь приложение, твое приложение просто зависнит.

Цитата:
Может как вариант попробовать многопоточность?!
Ты сам дал ответ на свой вопрос.
profi вне форума Ответить с цитированием
Старый 24.05.2010, 18:43   #7
lexluter1988
Пользователь
 
Аватар для lexluter1988
 
Регистрация: 20.04.2010
Сообщений: 47
По умолчанию

Спасибо за/на водку)) Сделал так
Код:
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.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        bool stopThread;
        
        public void MyThread()
        {
            for (int i = 0; ; i++)
            {
                if (stopThread)
                    break;

                myBox.Text = Convert.ToString(i);
            }
        }   
        
       
        public Form1()
        {
            InitializeComponent();
        }

        [STAThread]
        private void Form1_Activated(object sender, EventArgs e)
        {
            Form1.CheckForIllegalCrossThreadCalls = false; //небезопасное действие


            ThreadStart myThreadDelegate = new ThreadStart(MyThread);
            Thread thr = new Thread(myThreadDelegate);
            thr.Start();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (stopThread == false)
            {
                stopThread = true;
            }
            else
            {
                stopThread = false;           
                
            }
            
        }
    }
}
Но сейчас исправлю - вставлю все в обработчик мыши.
lexluter1988 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MS SQL Server 2008 и Visual Studio 2008 C# (Как работать с БД?) cherw9!40k Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 14.01.2010 20:51
Проблема с windows visual styles в Visual studio 2008 express. [awa Visual C++ 2 09.01.2010 06:05
Visual Studio Standard 2008 против Visual Studio Express 2008. Стоит ли покупать? Casper-SC Софт 4 31.12.2009 11:46
VISUAL STUDIO 2008 defaul language - как переключить в VISUAL STUDIO 2008 язык программирования, использ Эйнж Общие вопросы C/C++ 0 27.12.2009 20:39