MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как реализовать текстбокс, зависящий от изменяющейся переменной"
Answer 1236949
Основная сложность тут не в том, чтобы запустить вашу функцию в отдельном потоке, а в том, как реализовать взаимодействие фонового потока с UI, учитывая что Winforms - однопоточный фреймворк. Для этого можно использовать BeginInvoke, но на этом проблемы не заканчиваются, так как BeginInvoke нельзя вызывать после закрытия окна. Попытка просто проверить свойство IsDisposed наталкивается на состояние гонки, ведь окно может быть закрыто одновременно с проверкой. Итоговый код с учетом этого будет выглядеть так (я слегка упростил функцию Convert_string_to_String):
public ref class MyForm : public System::Windows::Forms::Form { public: System::Threading::Thread^ thread; bool exit; System::Object^ sync; MyForm(void) { InitializeComponent(); thread=nullptr; exit=false; sync = gcnew System::Object(); } std::string COMMaster(){ //... } String^ Convert_string_to_String(std::string& os) { return gcnew System::String(os.c_str()); } void SetTexbox(System::String^ val){ textBox1->Text=val; //установка значения TextBox } void ThreadProc(){ auto deleg=gcnew System::Action<System::String^>(this,&MyForm::SetTexbox); while(1){ //читаем строку auto str=COMMaster(); System::String^ str_converted=Convert_string_to_String(str); System::Threading::Monitor::Enter(sync); try{ if(exit)break; //поток остановлен this->BeginInvoke(deleg,str_converted); //устанавливаем значения TextBox } finally{ System::Threading::Monitor::Exit(sync); } } } System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { if(thread!=nullptr)return; //запускаем поток auto x=gcnew System::Threading::ThreadStart(this,&MyForm::ThreadProc); thread = gcnew System::Threading::Thread(x); thread->Start(); } System::Void MyForm_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) { //при закрытии формы останавливаем поток System::Threading::Monitor::Enter(sync); try{ exit=true; } finally{ System::Threading::Monitor::Exit(sync); } } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.