Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
.NET 4.x

Обращение к Label из потока. Отладочный режим не работает

14.01.2012, 19:49. Показов 3396. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
        private void button1_Click(object sender, EventArgs e)
        {
            string connStr = @"Data Source=(local);
                            Initial Catalog=bus;
                            Integrated Security=True";
            SqlConnection conn = new SqlConnection(connStr);
            try
            {
                conn.Open();
                label1.Text = "Соедение успешно произведено";
            }
            catch (SqlException se)
            {
                if (se.Number == 4060)
                {
                    try
                    {
                        label1.Text = "Подождите, идет создание БД";
                        conn.Close();
                        conn = new SqlConnection(@"Data Source=(local);Integrated Security=True");
                        SqlCommand cmdCreateDataBase = new SqlCommand(string.Format("CREATE DATABASE [{0}]", "bus"), conn);
                        conn.Open();
                        label1.Text = "Посылаем запрос";
                        cmdCreateDataBase.ExecuteNonQuery();
                        conn.Close();
                        Thread.Sleep(5000);
                        conn = new SqlConnection(connStr);
                        conn.Open();
                        label1.Text = "Соедение успешно произведено";
                    }
                    catch(Exception er)
                    {
                        label1.Text = "Не удалось подключиться к базе данных. (" + er.Source + ")";
                    }
                }
            }
            label1.Text = "";
            conn.Close();
            conn.Dispose();
        }
В этом коде в label1 не меняется значение. Оно поменяется один раз, в самом конце и все.
Пробовал выводить значения в label1 отдельным потоком, но говорит мол label не в этом потоке создал и ничего писать не буду.
Как быть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.01.2012, 19:49
Ответы с готовыми решениями:

Обращение к Label из потока
Доброго времени! Форма, на форме кнопка запуска и 2 штуки label, видимый "работаю" и невидимый "жду". Создаем отдельный...

Отладочный режим программы
Программа в отладочном режиме должна показывать исходную матрицу и состояние матрицы после каждой перестановки. Саму программу сделал,...

Обращение к элементу WinForms из потока, отличного от потока, в котором это элемент был создан
Пишу приложение, котором при загрузке формы в textbox на этой форме заносятся данные. Причем данных много и процесс занимает длительное...

14
Заблокирован
14.01.2012, 20:05
Цитата Сообщение от Serg046 Посмотреть сообщение
но говорит мол label не в этом потоке создал и ничего писать не буду.
Доступ к контролу из другого потока
C#
1
2
3
4
5
6
7
8
           new System.Threading.Thread(delegate()
            {
                for (int i = 0; i < 1000; ++i)
                {
                    label1.BeginInvoke(new Action(() => { label1.Text = i.ToString(); }));
                    System.Threading.Thread.Sleep(10);
                }
            }).Start();
2
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
15.01.2012, 13:48  [ТС]
А можно ссылку или просто объяснить из за чего или для чего так сделано?
0
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
15.01.2012, 20:43  [ТС]
Почему то мой поток на изменение контрола, все равно ждет выполнения главного.

Добавлено через 35 минут
Как моментально добавить данные в контрол? Без всяких очередей потоков. Бьюсь второй день для достижения нормальной работы.

Добавлено через 6 минут
Еще интересный момент. Вот код главного потока
C#
1
2
3
4
5
label1.Text = "Подключение...";
            Thread cn = new Thread(connect);
            cn.Start();
            cn.Join();
            label1.Text = "Подключение успешно";
Выводится "Подключение..." на строке Join, а не на своей.
А "Подключение успешно" вообще по завершению главного потока, ну.. в конце события нажатия кнопки.

Добавлено через 52 минуты
Решил создать тестовое приложение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(func);
            t.Start();
            for (int i = 100; i < 200; i++)
                listBox1.Items.Add(i.ToString());
        }
 
        void func()
        {
            for (int j = 0; j < 10; j++)
                listBox1.BeginInvoke(new Action(() => { listBox1.Items.Add(j.ToString()); }));
        }
Вывелись сначала числа от 100 до 200, потом десять десяток , причем строго после главного потока. И почему 10ки? Чудеса... И как бы я расчитывал получить рендом, а получил очередность.
И еще все вывелось сразу, а не последовательно. А во время итераций листбокс был пуст..
Прошу помощи, никак не могу понять. Мне статус бар нужно сделать...

Добавлено через 3 часа 53 минуты
Ну теперь вообще ничего не понимаю
C#
1
2
3
4
5
6
        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "num";
            int a = 5;
            textBox1.Text += a.ToString();
        }
При это выводится на экран только num5! num не выводится вообще. И в отладке смотрел и sleep ставил.
0
Заблокирован
15.01.2012, 21:23
Цитата Сообщение от Serg046 Посмотреть сообщение
При это выводится на экран только num5! num не выводится вообще.
А как ты хотел? Ты склеил строку "num" со строкой "5" и получил "num5". Какие проблемы?

Добавлено через 30 минут
Вот пример. Разбирайся
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Использовать методы Wait() и Pulse() для имитации тиканья часов. 
using System;
using System.Threading;
class TickTock
{
    object lockOn = new object();
    public void Tick(bool running)
    {
        lock (lockOn)
        {
            if (!running)
            { // остановить часы 
                Monitor.Pulse(lockOn); // уведомить любые ожидающие потоки 
                return;
            }
            Console.WriteLine("тик");
            Thread.Sleep(1000);
            Monitor.Pulse(lockOn); // разрешить выполнение метода Tock() 
            Monitor.Wait(lockOn); // ожидать завершения 
            // метода Tock() 
        }
    }
    public void Tock(bool running)
    {
        lock (lockOn)
        {
            if (!running)
            { // остановить часы 
                Monitor.Pulse(lockOn); // уведомить любые ожидающие потоки 
                return;
            }
            Console.WriteLine("так");
            Thread.Sleep(1000);
            Monitor.Pulse(lockOn); // разрешить выполнение метода Tick() 
            Monitor.Wait(lockOn); // ожидать завершения метода Tick() 
        }
    }
}
class MyThread
{
    public Thread Thrd;
    TickTock ttOb;
    // Сконструировать новый поток. 
    public MyThread(string name, TickTock tt)
    {
        Thrd = new Thread(this.Run);
        ttOb = tt;
        Thrd.Name = name;
        Thrd.Start();
    }
    // Начать выполнение нового потока, 
    void Run()
    {
        if (Thrd.Name == "Tick")
        {
            for (int i = 0; i < 5; i++) ttOb.Tick(true);
            ttOb.Tick(false);
        }
        else
        {
            for (int i = 0; i < 5; i++) ttOb.Tock(true);
            ttOb.Tock(false);
        }
    }
}
class TickingClock
{
    static void Main()
    {
        TickTock tt = new TickTock();
        MyThread mtl = new MyThread("Tick", tt);
        MyThread mt2 = new MyThread("Tock", tt);
        mtl.Thrd.Join();
        mt2.Thrd.Join();
        Console.WriteLine("Часы остановлены");
        Console.ReadKey();
    }
}
0
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
15.01.2012, 23:30  [ТС]
Цитата Сообщение от slacker Посмотреть сообщение
Ты склеил строку "num" со строкой "5" и получил "num5". Какие проблемы?
Нет я сначала вывел num, а потом уже приклеил 5.
Щас переделаю.
C#
1
2
3
4
5
private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "num";
            textBox1.Text = "next";
        }
При этом я получу только "next", "num" не отобразиться. Это же статус строка, мне промежуточные нужны..
0
 Аватар для TheInside
1 / 1 / 0
Регистрация: 05.01.2012
Сообщений: 12
16.01.2012, 01:42
Ну а что ты хотел? ты сначала присваиваешь textBox1.Text значение "num" , и сразу же "next". Т.е. просто не успеваешь его увидеть. сделай sleep между ними и увидишь как работает
0
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
16.01.2012, 01:43  [ТС]
Ставил слип
Цитата Сообщение от Serg046 Посмотреть сообщение
И в отладке смотрел и sleep ставил.
Я ж не полный бот...
Могу даже проект скинуть.
0
 Аватар для TheInside
1 / 1 / 0
Регистрация: 05.01.2012
Сообщений: 12
16.01.2012, 01:48
C#
1
2
3
4
      textBox1.Text = "num";
            Application.DoEvents(); //Обновления окна
            Thread.Sleep(10000);
            textBox1.Text = "next";
1
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
16.01.2012, 01:50
лицо-рука )
0
 Аватар для TheInside
1 / 1 / 0
Регистрация: 05.01.2012
Сообщений: 12
16.01.2012, 01:54
ещё раз... обновляй окно
C#
1
 Application.DoEvents();
0
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
16.01.2012, 01:58  [ТС]
TheInside, Спасибо тебе добрый человек. Как все просто...
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
16.01.2012, 02:04
http://www.rsdn.ru/?article/do... ading2.xml
http://www.delphikingdom.com/a... talogid=93
http://msdn.microsoft.com/ru-r... vents.aspx
0
48 / 48 / 10
Регистрация: 22.02.2012
Сообщений: 137
28.03.2012, 00:31
столкнулся с похожей проблемой... надо дать доступ к нескольким Label ... тут начинаются фокусы..
надо сместить значение в Label"ax, находящихся в массиве, вот код
C#
1
2
3
4
5
for (int i=1; i<6 ;i++ )
            {
                VShelf[i].BeginInvoke(new Action(() => { temp = VShelf[i].Text; }));
                VShelf[i-1].BeginInvoke(new Action(() => { VShelf[i-1].Text = temp; }));
            }
причем это работает отлично, но при даче контроля косячит и вылетает за границы массива
C#
1
2
3
4
5
for (int i=1; i<6 ;i++ )
            {
                temp = VShelf[i].Text;
                VShelf[i-1].Text = temp;
            }
п.с.: Sleep ставил и между и вдоль...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.03.2012, 00:31
Помогаю со студенческими работами здесь

Google Chrome не работает в обычный режим, а в режим инкогнито все работает
Ситуация такая: Гугл хром не работаеть, бесконечно загрузка идет, а в режиме инкогнито четка работаеть. Я сделаль: Обновление гугл хроме,...

Обращение к контролу из потока
Помогите пожалуйста разобраться с обращением к контролам из потока. Приведенный под спойлером для примера код взят помоему с msdn и...

Обращение к переменной из потока
Что то не пойму, меняю переменною(int j объявленную в public в основном потоке) из потока запущенного из основного.execute() { ...

Обращение из потока к контролу
Приветствую! Сегодня у меня печальный день((( Пол дня потратил чтобы решить проблему, так и не смог понять в чем дело. Вернее отдаленно в...

Обращение к ListView из потока
Доброго времени суток. Не могу разобраться с доступом к listView с другого потока. Пишу прокси сервер, на каждый запрос браузера создаю...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru