Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 31
1

Каким образом реализовать поток с помощью BackgroundWorker?

03.06.2017, 08:15. Показов 2452. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем!

Каким образом реализовать поток с помощью backGrounder (в этом потоке происходит считывание данных из COM-порта)? Пробовал, однако, fail. При нажатии на кнопку "читать" открывается COM-порт, запускается поток. При нажатии "стоп" - закрывается порт, останавливается поток.

Каким образом реализовать поток с помощью BackgroundWorker?


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::Void button4_Click(System::Object^  sender, System::EventArgs^  e) {
    this->serialPort1->Open();
    backgroundWorker1->RunWorkerAsync(); // пуск потока
}
 
private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
    while (true) {
        String^ message = this->serialPort1->ReadLine();
                this->textBox1->Text = message;
    }
}
 
private: System::Void backgroundWorker1_ProgressChanged(System::Object^  sender, System::ComponentModel::ProgressChangedEventArgs^  e) {
 
}
 
private: System::Void backgroundWorker1_RunWorkerCompleted(System::Object^  sender, System::ComponentModel::RunWorkerCompletedEventArgs^  e) {
    backgroundWorker1->CancelAsync();
 
}
 
// КНОПКА СТОП ============================================
private: System::Void button1_Click_1(System::Object^  sender, System::EventArgs^  e) {
//  bool flag = false;
//  this->serialPort1->Close();
}
};
}
Как победить?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2017, 08:15
Ответы с готовыми решениями:

Можно ли и каким образом получить поток экземпляра Класса?
Доброго дня форумчанам. Возник такой вопрос - можно ли добиться у произвольных классов чего-то...

Каким образом создать поток, в который перенести код сортировки массива?
Спасибо keepitsimple3, за код #include "lb.h" // включения файлов в код сценария PHP во время...

Каким образом реализовать такие полосы?
Добрый вечер, форумчани. Внимание вопрос: Как можно реализовать такие полосы для табов(подчеркнут...

С помощью чего и каким образом загрузить изображение в определённом месте?
Ребят, дело в том, что я делаю игру, и вот хочу в этой игре сделать как бы говоря "пол", из...

2
1080 / 911 / 212
Регистрация: 29.09.2015
Сообщений: 1,014
03.06.2017, 16:32 2
Лучший ответ Сообщение было отмечено aalexandrov как решение

Решение

В методе System::Void backgroundWorker1_DoWork все действия происходят в другом потоке, и из под него нельзя передать данные форме и его элементам, поэтому требуется использовать метод вызова функции Invoke(delegate^,[аргументы])

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
// КНОПКА "СТАРТ" ==============
public: delegate void dShowResult(String^);//шаблон метода
 
private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e) {
             this->serialPort1->Open();
             backgroundWorker1->RunWorkerAsync(); // пуск потока
}
 
private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
             while (true) {
                 String^ message = this->serialPort1->ReadLine();
 
                 dShowResult^ d = gcnew dShowResult(this, &MyForm::showResult);//объявляем ссылку на метод
 
                 if (this->InvokeRequired)//проверка на то что форма требует вызов в родительский поток формы. Можно обойтись и без неё, тк наверняка известно, что вызов из под дочернего потока
                     this->Invoke(d, message);
             }
}
 
private: System::Void backgroundWorker1_ProgressChanged(System::Object^  sender, System::ComponentModel::ProgressChangedEventArgs^  e) {
 
}
 
private: System::Void backgroundWorker1_RunWorkerCompleted(System::Object^  sender, System::ComponentModel::RunWorkerCompletedEventArgs^  e) {
             backgroundWorker1->CancelAsync();
 
}
 
         // КНОПКА СТОП ============================================
private: System::Void button1_Click_1(System::Object^  sender, System::EventArgs^  e) {
             //  bool flag = false;
             //  this->serialPort1->Close();
}
 
 
private: System::Void showResult(String^ message)//сюда будет производиться передача сообщения
{
             this->textBox1->Text = message;
}
 
};
}
Это как пример вызова. в 13 строке dShowResult^ d лучше объявить заранее
1
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 31
04.06.2017, 05:53  [ТС] 3
Большое спасибо, заработало)
0
04.06.2017, 05:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2017, 05:53
Помогаю со студенческими работами здесь

Каким образом лучше осуществить вывод массива с помощью графики?
Добрый день! Имеется массив размера примерно 1000 на 500. Некоторые ячейки закрашенные, некоторые...

Необходимо каким-то образом реализовать карусель модулей
Всем добрый день, уважаемые форумчане! возник вопрос, которым Гугл я уже замучала. необходимо...

Каким образом реализовать таблицу, как в excel?
Есть таблица экселя, которая подсчитывает и анализирует качество образования (в определенный...

Каким образом реализовать фильтрацию сети интернет?
каким образом реализовать фильтрацию сети интернет в предприятии с 50 компами, если нет бюджета на...


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

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