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

C# .NET

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
merussaid
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 18
#1

Управление потоками из разных процедур - C#

19.05.2012, 20:25. Просмотров 1786. Ответов 15
Метки нет (Все метки)

Всем привет!
Такая вот незадача получилась:
У меня есть несколько процедур. В одной из них у меня есть try и catch. Ну а другая - просто (грубо говоря =)

Так вот. Мне как то нужно управлять одним потоком из разных функций. Т.е. из моих двух существующих. А вот как это сделать?

P. S.: все процедуры лежат в одном namespace.

А вот примерный код (как и где нужно управлять):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void prov()
{
try
{
//Прекращение потока
}
catch
{
//Прекращение потока и запуск нового потока с названием процедуры PROV
}
}
 
void mnb()
{
//Запуск потока с названием процедуры PROV
}
Я надеюсь с кодом приблизительно будет понятно чего я добиваюсь.

Уже чего только не перепробывал. Да и документацию читал - но почему то ничего не нашел.

Заранее всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2012, 20:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Управление потоками из разных процедур (C#):

Затраты на управление потоками - C#
Как их подсчитать правильно ?

Рисование линий разных размеров и цветов. Управление цветом в зависимости от условия - C#
вопрос следующий у меня есть код в котором я рисую линии две нахожу их точки пересечения и так далее вопрос следующий я хочу чтоб после...

Управление потоками, в частности, их корректная остановка - C#
Здравствуйте у меня возник вопрос как управлять потоком на C# а именно меня интересует как его остановить И еще как ставить на паузу а...

Многопоточность (использование двумя потоками двух разных элементов одной формы) - C#
На форме 2 RichTextBox, создается второй поток, оба потока выводят построчно индекс, который перебирается в цикле, в "свой" RichTextBox: ...

Управление потоками - C++ Builder
Доброго времени суток. с потоками я вроде как разобрался, теперь проблема в их управлении... данная программа реализует два потока, один...

Удаленное управление потоками - C++ WinAPI
Здравствуйте. Задача следующая: Необходимо удаленно подключиться к компьютеру в домене, найти все потоки конкретного процесса (скажем...

15
ЦеЗарЬ
17 / 17 / 1
Регистрация: 16.09.2010
Сообщений: 91
19.05.2012, 23:11 #2
merussaid, скинь пример того как ты сам пытался эту задачу разрешить, потому как не очень ясно что нужно сделать.
"Прекращение потока" это значит нужно остановить поток (чтобы потом запустить) или полностью уничтожить?
и скинь полный код этих функций, может что прояснится.
0
SalterOk
115 / 112 / 1
Регистрация: 02.06.2011
Сообщений: 280
20.05.2012, 06:05 #3
да пример бы не помешал а то мне кажется что ты пытаешся создать поток и потом чтоб он сам себя уничтожил
0
merussaid
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 18
20.05.2012, 08:31  [ТС] #4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void startRec()
{
try
{
var responseFromServer = MyRequest();
label3.Text = "Идет запрос";
Thread(startRec).Abort();
}
catch (Exeption e)
{
Thread(startRec).Abort();
Thread(startRec).Start();
}
}
 
void newRec()
{
new Thread(startRec).Start();
}
Вот такой пример)
Может быть я что-то из области фантастики там написал, но все же))

Теперь объясню:
дело в том, что функция MyRequest() время от времени возвращает ошибку 500 (эта функция находится в другом файле dll и ей я управлять не могу). И эту ошибку и ловит catch.
Так вот что мне нужно: чтобы если ошибки 500 нет - процедура завершила себя (т.е. убила поток).
Если же она есть - повторить функцию startRec() заново.

Надеюсь на помощь)
0
ЦеЗарЬ
17 / 17 / 1
Регистрация: 16.09.2010
Сообщений: 91
20.05.2012, 11:07 #5
Поток такая вещь, что если больше нечего выполнять то он сам наилучшим образом завершится. Если блок try не отловит экзепшн, то поток завершится оператором return (если не поставить return все равно завершится). Если экзепшн отловили, то функция startRec() вызовет саму себя, тем самым вновь пытаясь осуществить запрос.

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
        void startRec()
        {
            try
            {
                label3.Text = "Идет запрос";
                var responseFromServer = MyRequest();
                label3.Text = "Запрос завершен";
 
                //return здесь для наглядности, если убрать ничего не изменится
                return;
            }
            catch
            {
                //задержка перед следующей проверкой, не обязательно
                Thread.Sleep(100);
 
                startRec();
            }
        }
 
        void newRec()
        {
            Thread request = new Thread(new ThreadStart(startRec));
            request.Start();
        }
0
merussaid
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 18
20.05.2012, 11:18  [ТС] #6
ЦеЗарЬ, спасибо. Но вот возникла проблема - не могу вывести информацию в лейбл.

"Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'label3' не из того потока, в котором он был создан."
0
Prorok
107 / 107 / 3
Регистрация: 26.12.2008
Сообщений: 166
20.05.2012, 11:59 #7
Цитата Сообщение от merussaid Посмотреть сообщение
ЦеЗарЬ, спасибо. Но вот возникла проблема - не могу вывести информацию в лейбл.

"Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'label3' не из того потока, в котором он был создан."
C#
1
2
3
4
5
void SetTextSafe(string newText)
{
    if (textBox1.InvokeRequired) textBox1.Invoke(new Action<string>((s) => textBox1.Text = s), newText);
    else textBox1.Text = newText;
}
взято отсюда.
0
ЦеЗарЬ
17 / 17 / 1
Регистрация: 16.09.2010
Сообщений: 91
20.05.2012, 12:00 #8
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
        delegate void Callback(string str);
 
        private void Label3Invoke(string str)
        {
            label3.Text = str;
        }
 
        private void UpdateLabel3(string str)
        {
            if (label3.InvokeRequired)
            {
                Callback d = new Callback(Label3Invoke);
                label3.Invoke(d, new object[] { str });
            }
            else
            {
                Label3Invoke(str);
            }
        }
 
        void startRec()
        {
            try
            {
                UpdateLabel3("Идет запрос");
                var responseFromServer = MyRequest();
                UpdateLabel3("Запрос завершен");
 
                //return здесь для наглядности, если убрать ничего не изменится
                return;
            }
            catch
            {
                //задержка перед следующей проверкой, не обязательно
                Thread.Sleep(100);
 
                startRec();
            }
        }
 
        void newRec()
        {
            Thread request = new Thread(new ThreadStart(startRec));
            request.Start();
        }
1
Casper-SC
Эксперт .NET
3521 / 1740 / 183
Регистрация: 27.03.2010
Сообщений: 4,927
Записей в блоге: 1
20.05.2012, 12:04 #9
Сделай вообще события. Типа начало запроса, запрос завершён. Подписывайся на них и в обработчике уже меняй значения там где это нужно. Как бы сделай класс не зависящий от формы вообще никак.
0
merussaid
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 18
20.05.2012, 12:16  [ТС] #10
ЦеЗарЬ, ну вроде пока все нормально)

Ну и наверное последний вопрос - а почему функция UpdateLabel3() не работает, если её вызывать из другого класса?
0
ЦеЗарЬ
17 / 17 / 1
Регистрация: 16.09.2010
Сообщений: 91
20.05.2012, 12:26 #11
Цитата Сообщение от merussaid Посмотреть сообщение
а почему функция UpdateLabel3() не работает, если её вызывать из другого класса?
сделай ее public.
0
merussaid
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 18
20.05.2012, 12:29  [ТС] #12
Цитата Сообщение от ЦеЗарЬ Посмотреть сообщение
сделай ее public.
Хм)) Уже давно public =)

Даже уже в дизайнере изменил private label3 на public label3 - никакого результата. К сожалению...
0
ЦеЗарЬ
17 / 17 / 1
Регистрация: 16.09.2010
Сообщений: 91
20.05.2012, 12:36 #13
merussaid, программа выдает какую то ошибку, или просто ничего не происходит? скинь код как ты обращаешься к этой функции.
0
merussaid
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 18
20.05.2012, 12:39  [ТС] #14
ЦеЗарЬ, нет. Программа ничего не выдает. Просто не выводится результат.

Вот 2 примера как я пользовался:
C#
1
2
3
4
frmMain frm = new frmMain();
 
frm.UpdateLabel3("Запрос...");
frm.label3.Text = "Запрос..."; //label распознается, но результат - тоже 0
0
ЦеЗарЬ
17 / 17 / 1
Регистрация: 16.09.2010
Сообщений: 91
20.05.2012, 12:45 #15
Цитата Сообщение от merussaid Посмотреть сообщение
frmMain frm = new frmMain();
ты создаешь новую (другую форму) и уже в ней это делаешь. а нужно обращаться к той что у тебя уже есть.

объявляем публичную форму в классе:
C#
1
public frmMain frm;
в главной форме:
C#
1
2
Class1 c = new Class1();
c.frm = this;
2
20.05.2012, 12:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2012, 12:45
Привет! Вот еще темы с ответами:

Управление процессами и потоками - C++ WinAPI
Необходимо разработать программу, демонстрирующую возможности управления процессами и потоками: создание и завершение, получение сведений о...

Управление потоками в многопоточности - C++
вопрос простой: что посоветуете почитать по теме для начинающего? с помощью чего проще реализовать? windows/linux? (нужно просто...

Управление процессами и потоками - C++
Найти сумму (n и 1), (n-1 и 2) и т.д. элементов массива. Обработка каждой суммы в порожденном процессе(потоке). После завершения каждый...

Управление потоками на простом примере - C++
Покажите на простом примере как это делается. Создаю простую программу, которая выводит на экран таймер на 30 сек. По истечению...


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

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

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