Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.88
Venethi
1 / 1 / 0
Регистрация: 11.04.2013
Сообщений: 51
#1

бесконечный цикл в отдельном потоке - C#

11.04.2013, 16:41. Просмотров 4296. Ответов 8
Метки нет (Все метки)

Здравствуйте!

Помогите пожалуйста решить проблему.
Есть метод relayStatus. Данный метод опрашивает определенное устройство путем ввода команды и чтения ответа из буфера.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void relayStatus()
        {
                try
                {
                    asyncHandle = mbSession.BeginWrite("ROUT:CLOS? (@F01A11(0101:0106))", new AsyncCallback(OnWriteComplete), null);
                    asyncHandle = mbSession.BeginRead(mbSession.DefaultBufferSize, new AsyncCallback(relayStatusResult), null);
                    System.Threading.Thread.Sleep(100);
 
                }
                catch
                {
                    
                }                                    
        }
Мне нужно реализовать автоматический вызов данного метода каждые 0.25 сек, так что бы можно было пользоваться другими функциями приложения. Пытался реализовать в отдельном потоке с бесконечным циклом и тред слипом.Как то вот так :

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public MainForm()
        {
            Thread t = new Thread(relayStatus);
            t.Start();                                
                       
        }
 
private void relayStatus()
        {
                while(true)
                {
                try
                {
                    asyncHandle = mbSession.BeginWrite("ROUT:CLOS? (@F01A11(0101:0106))", new AsyncCallback(OnWriteComplete), null);
                    asyncHandle = mbSession.BeginRead(mbSession.DefaultBufferSize, new AsyncCallback(relayStatusResult), null);
                    System.Threading.Thread.Sleep(250);
 
                }
                catch
                {
                    
                }
                }
В итоге приложение отказывается запускаться либо виснет...
Прошу не кидаться камнями, в шарпе вторую неделю работаю. Но очень нужно это дело реализовать. Спасибо!

Добавлено через 54 минуты
Сделал так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public MainForm()
        {
            Thread t = new Thread(relayStatus);
            t.Start();                                
                       
        }
 
private void relayStatus()
        {
                while(true)
                {
                try
                {
                    asyncHandle = mbSession.BeginWrite("ROUT:CLOS? (@F01A11(0101:0106))", new AsyncCallback(OnWriteComplete), null);
                    asyncHandle = mbSession.BeginRead(mbSession.DefaultBufferSize, new AsyncCallback(relayStatusResult), null);
                    System.Threading.Thread.Sleep(250);
                    Application.DoEvents();
 
                }
                catch
                {
                    
                }
                }
Заработало! Но во первых тормозит программа, во вторых иногда вылетает. Подскажите как сделать по правильному? Смысл вот в чем. С помощью данного метода запускается метод обновляющий индикацию в интерфейсе. То есть если к девайсу подключились с другого компа и что-то изменили в настройках, я вижу эти изменения риалтайм.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 16:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос бесконечный цикл в отдельном потоке (C#):

.NET 3.x Бесконечный цикл в потоке, StackOverflowException - C#
Мне нужна рекурсия в отдельном потоке, перебирающая делегаты и вызывающая их в соответствии с секундомером. При работе более 10 секунд...

Создать приложение, в отдельном потоке вычисляющее значение w и непрерывно обновляющее его в потоке - C#
Ребят, с потоками не работал не когда. Есть задание , я понимаю что хотят, а вот как сделать потоками хз . Создайте приложение, в...

Запросы к БД в отдельном потоке - C#
Всем привет! Хочу спросить специалистов и просто опытных людей. Делаю приложение winForms. Приложение будет отображать результаты...

.NET 4.x Выполнение метода в отдельном потоке - C#
В моей программе есть метод авторизации на одном сайте, вызываю вот так: AuthMethod(LoginTextBox.Text, PassTextBox.Text); Довольно...

.NET 4.x Запустить таймер в отдельном потоке - C#
Добрый день! Пожалуйста, подскажите, почему данный код не работает? Запустив метод CreateTimer(n) я хочу создать отдельный поток, в котором...

GetRequestStream не работает в отдельном потоке - C#
Вот код Uri адрес = new Uri(данные.ToString()); HttpWebRequest вопрос =...

8
EVG-1980
189 / 196 / 46
Регистрация: 11.04.2013
Сообщений: 1,078
11.04.2013, 20:00 #2
попробуй вынести операцию чтения за бесконечный цикл, вставь ее вызов в метод AsyncCallback(OnWriteComplete) , те получиться как запись закончена встаем на чтение

Добавлено через 31 минуту
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private ManualResetEvent acceptEvent = new ManualResetEvent(false);
 
private void relayStatus()
        {
                while(true)
                {
                try
                {
                acceptEvent.Reset();
                asyncHandle = mbSession.BeginWrite("ROUT:CLOS? (@F01A11(0101:0106))", new AsyncCallback(OnWriteComplete), null);
acceptEvent.WaitOne();
}
private void AsyncCallback(IAsyncResult ar)
{
.....
acceptEvent.Set();
....
BeginRead();
}
0
Venethi
1 / 1 / 0
Регистрация: 11.04.2013
Сообщений: 51
18.04.2013, 11:51  [ТС] #3
Спасибо. Но все оказалось несколько проще. Использовал локеры. Все работает!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private System.Object lockThis = new System.Object();
 
public MainForm()
        {
            InitializeComponent();
 
            Thread t = new Thread(relayStatus);
            t.Start();       
        }
 
private void relayStatus()
        {
            while (true)
            {
                try
                {
                    lock(lockThis)
                    {
                    asyncHandle = mbSession.BeginWrite("ROUT:CLOS? (@F01A11(0101:0106))", new AsyncCallback(OnWriteComplete), null);
                    asyncHandle = mbSession.BeginRead(mbSession.DefaultBufferSize, new AsyncCallback(relayStatusResult), null);
                    System.Threading.Thread.Sleep(100);
                    Application.DoEvents();
                    }
                }
                catch
                {
 
                }
            }             
        }
0
pincet
1252 / 824 / 91
Регистрация: 23.07.2010
Сообщений: 4,261
18.04.2013, 11:54 #4
а теперь посмотри на загрузку процессора при выполнии
0
Psilon
Master of Orion
Эксперт .NET
5909 / 4806 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
18.04.2013, 14:30 #5
Venethi, а таймеры не пробовали использовать?
0
Venethi
1 / 1 / 0
Регистрация: 11.04.2013
Сообщений: 51
22.04.2013, 12:36  [ТС] #6
pincet, да, я заметил что цп ппц как грузится. Это из-за тред слипа?

Вообще мы отказались от автоматического обновления состояний. Программа должна подключаться с 2х рабочих мест к одному устройсву и при постоянный запросах к этому устройсву от двух терминалов происходят коллизии. В данный момент программа работает без постоянной обратной связи.

Psilon, если честно быстро разобраться в таймерах не смог - надо было в короткий срок сделать интерфейс. Но вообще интересно как это можно реализовать с помощью таймеров. Если Вы можете показать подходящий пример - буду премного благодарен!
0
Psilon
Master of Orion
Эксперт .NET
5909 / 4806 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
22.04.2013, 13:11 #7
Venethi,
C#
1
2
3
var timer = new Timer(1000); //таймер срабатывает каждую секунду
timer.Elapsed += (sender, e) => MessageBox.Show("Timer elapsed"); //И печатает на экран что-то
timer.Start();
1
pincet
1252 / 824 / 91
Регистрация: 23.07.2010
Сообщений: 4,261
25.04.2013, 10:19 #8
Цитата Сообщение от Venethi Посмотреть сообщение
pincet, да, я заметил что цп ппц как грузится
достаточно добавить задержку в цикл.
0
Venethi
1 / 1 / 0
Регистрация: 11.04.2013
Сообщений: 51
25.04.2013, 14:39  [ТС] #9
Psilon, спасибо!

pincet, поясните пожалуйста. Разве тред слип не является задержкой?
0
25.04.2013, 14:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2013, 14:39
Привет! Вот еще темы с ответами:

Как десериализовать в отдельном потоке ? - C#
Метод MessageReceiverFirst принимает сокет и потом в отдельном потоке десериализует объект который передает этот же клиент. Когда делаю все...

Работа с ObservableCollection в отдельном потоке - C#
Пусть имеется класс TimeWorker, в котором лежит private ObservableCollection<DObject> dObjects; public ObservableCollection<DObject>...

Рекурсия. Вызов в отдельном потоке - C#
Напишите программу, в которой метод будет вызываться рекурсивною. Каждый новый вызов метода выполняется в отдельном потоке. Не...

Запуск метода в отдельном потоке - C#
Доброго времени суток! На форме есть textBox1 и кнопка. При нажатии на кнопку, создаётся новый поток: private void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru