Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 3

Создание потока и доступ к контролам других потоков

11.03.2012, 08:05. Показов 1939. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется форма с таблицей, обновляющейся каждую секунду. Все выполняется с помощью одной функции. Необходимо вынести её в отдельный поток, что бы была возможность приостановки процесса.
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
Void Form1::Startbutton_Click(System::Object^  sender, System::EventArgs^  e) 
{
     int selectedIndex = this->Poolsbox->SelectedIndex;  
     queue <thread*> q; // инициализация очереди
     for(unsigned int j=0;j<pools[selectedIndex]->threads.size();j++)
     {
         q.push(pools[selectedIndex]->threads[j]);
     }
    thread *ptr;
    for ( int j = 1;!q.empty();j++ )
    {
        ptr = q.front();
        ptr->required_time-=SLEEPTIME;
        if (j==t && ptr->required_time>0)
        {
             q.push(q.front()); //копируем элемент в конец очереди
             q.pop();
             j=0;
        }
        else if (ptr->required_time<=0)
        {
             q.pop();
             this->Table1->RowCount--;
             j=0;
        }
 
        for (unsigned int i=0; i<q.size(); i++) //печать очереди
        {
             //this->Table1->RowCount++;
             ptr = q.front();
             this->Table1->Rows[i]->Cells[0]->Value = gcnew String(ptr->id.c_str());
             this->Table1->Rows[i]->Cells[1]->Value = ptr->required_time;
             this->Table1->Rows[i]->Cells[2]->Value = ptr->priority;
             q.push(q.front()); 
             q.pop();
        }
 
        this->Table1->Update();
        Sleep(SLEEPTIME*1000);
    }
}
Имею 2 проблемы:
1) Создание потока. Пробовал 3 метода:
а) #include <Windows.h>
б) #include <process.h>
в) встроенный Backgroundworker
Во всех 3 случаях сталкивался с различными проблемами обьявлений и т.д но в конце концов приходил к проблеме доступа к контролам другого потока.
Помогите выбрать оптимальный вариант.
2) Доступ из потока к контролам другого потока. Несмотря на FAQ и прочие мануалы я не смог разобраться с делегатами и т.д. Даже после успешного создания потока, я так и не смог получить значение из контрола другого потока для int selectedIndex = this->Poolsbox->SelectedIndex;
Заранее благодарен за любую помощь!
PS работаю в MS VS 2010 EE

Добавлено через 12 часов 7 минут
проблемы решены
создание потока: http://support.microsoft.com/kb/815805/ru
в VS 2010 заменить trd * на trd ^
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.03.2012, 08:05
Ответы с готовыми решениями:

Обращение к контролам из других потоков
Доброго времени суток. Имеем такой код. Как избежать ошибки обращений к контролам из других потоков? Зарание благодарствую. ...

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

Доступ к контролам из потока
Есть поток,как сделать чтоб он &quot;видел&quot; элементы - textbox,button,lable

1
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
11.03.2012, 12:09
Лучший ответ Сообщение было отмечено unnamednewbie как решение

Решение

несмотря на то, что оптимальным способом является подход с использованием классов Task и TaskSheduler, пожалуй самым простым (и не особо кривым) будет являться вариант с ThreadPool::QueueUserWorkItem (хотя BackgroundWorker для мелких задач может и лучше). - это для создания задач в отдельных потоках. тут в этот статический метод делегируется метод void M(object^ state) и с этим всё просто, а для обращения к контролам из одного потока в другой, как правило, используется следующая конструкция (и на чтение и запись, естесмтвенно):
C#
1
2
3
4
if (myControl.InvokeRequired)
   myControl.Invoke(action); // это ключевой момент
else
   action.Invoke();
где в action делегируется метод, например, void M(void)... можно использовать тип делегата System::Windows::Forms::MethodInvoker
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.03.2012, 12:09
Помогаю со студенческими работами здесь

Доступ к контролам из другого потока
Как мне получить доступ к контролам на форме из другого потока? Есть код который должен проверить checkbox свойство checked в отдельном...

Доступ к контролам формы из другого потока
Есть некая функция, которая анализирует текстовых файлов и их содержимое записывает в ListView в &quot;детальном&quot; виде с очисткой...

Доступ к одному ресурсу из других потоков
Здравствуйте! Пытаюсь сделать &quot;бегущую&quot; строчку... После кучи советов, всё-таки решил сделать просто: тупо сдвигать текстбокс по...

Получить доступ к контролу на форме из 2 других потоков
Всем добрый день! Не могу победить потоко не безопасноть.. Нужно получить доступ к контролу на форме из 2 других потоков. Делал так: ...

Объясните тупому почему задержка потока по Sleep() больше чем ... с вызывает задержки и других потоков?
Какое отношение они имеют к данному потоку?Ну спит он себе и спит, пусть он выполняется раз в 5 секунд, допустим, чаще не надо-другие-то...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
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 Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru