Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 18
1

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

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

Author24 — интернет-сервис помощи студентам
Всем привет!
Такая вот незадача получилась:
У меня есть несколько процедур. В одной из них у меня есть 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2012, 20:25
Ответы с готовыми решениями:

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

Управление потоками
Задача: запустить в поток в котором что-то делается в цикле и в конце цикла в очередь добавляется...

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

Управление потоками в многопоточности
вопрос простой: что посоветуете почитать по теме для начинающего? с помощью чего проще...

15
19 / 19 / 1
Регистрация: 16.09.2010
Сообщений: 100
19.05.2012, 23:11 2
merussaid, скинь пример того как ты сам пытался эту задачу разрешить, потому как не очень ясно что нужно сделать.
"Прекращение потока" это значит нужно остановить поток (чтобы потом запустить) или полностью уничтожить?
и скинь полный код этих функций, может что прояснится.
0
117 / 114 / 10
Регистрация: 02.06.2011
Сообщений: 280
20.05.2012, 06:05 3
да пример бы не помешал а то мне кажется что ты пытаешся создать поток и потом чтоб он сам себя уничтожил
0
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
19 / 19 / 1
Регистрация: 16.09.2010
Сообщений: 100
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
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 18
20.05.2012, 11:18  [ТС] 6
ЦеЗарЬ, спасибо. Но вот возникла проблема - не могу вывести информацию в лейбл.

"Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'label3' не из того потока, в котором он был создан."
0
112 / 112 / 22
Регистрация: 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
19 / 19 / 1
Регистрация: 16.09.2010
Сообщений: 100
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
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
20.05.2012, 12:04 9
Сделай вообще события. Типа начало запроса, запрос завершён. Подписывайся на них и в обработчике уже меняй значения там где это нужно. Как бы сделай класс не зависящий от формы вообще никак.
0
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 18
20.05.2012, 12:16  [ТС] 10
ЦеЗарЬ, ну вроде пока все нормально)

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

Даже уже в дизайнере изменил private label3 на public label3 - никакого результата. К сожалению...
0
19 / 19 / 1
Регистрация: 16.09.2010
Сообщений: 100
20.05.2012, 12:36 13
merussaid, программа выдает какую то ошибку, или просто ничего не происходит? скинь код как ты обращаешься к этой функции.
0
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
19 / 19 / 1
Регистрация: 16.09.2010
Сообщений: 100
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
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 18
20.05.2012, 12:50  [ТС] 16
ЦеЗарЬ, спасибо огромное!))
0
20.05.2012, 12:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2012, 12:50
Помогаю со студенческими работами здесь

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

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

Удаленное управление потоками
Здравствуйте. Задача следующая: Необходимо удаленно подключиться к компьютеру в домене, найти все...

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru