Reputation: 1358
I already asked something similar, but the solution I found help me partially, so I'm asking a question that is similar to my previous one. my problem is that in the Thread I want that the text of the button change. the thread works fine, I can see the MessageBox I'm displaying, but the text of the button remains unchanged. how do I change it? if I need to use the delegate (commented text), ho do I I fix it? because that code raises some errors about wrong '(' and '{' but that's the answer I got before
#pragma once
namespace UIThread {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Threading;
/// <summary>
/// Summary for Form1
///
/// WARNING: If you change the name of this class, you will need to change the
/// 'Resource File Name' property for the managed resource compiler tool
/// associated with all .resx files this class depends on. Otherwise,
/// the designers will not be able to interact properly with localized
/// resources associated with this form.
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Button^ BtnStart;
protected:
private:
/// <summary>
/// Required designer variable.
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->BtnStart = (gcnew System::Windows::Forms::Button());
this->SuspendLayout();
//
// BtnStart
//
this->BtnStart->Location = System::Drawing::Point(114, 38);
this->BtnStart->Name = L"BtnStart";
this->BtnStart->Size = System::Drawing::Size(124, 37);
this->BtnStart->TabIndex = 0;
this->BtnStart->Text = L"button1";
this->BtnStart->UseVisualStyleBackColor = true;
this->BtnStart->Click += gcnew System::EventHandler(this, &Form1::BtnStart_Click);
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(284, 262);
this->Controls->Add(this->BtnStart);
this->Name = L"Form1";
this->Text = L"Form1";
this->ResumeLayout(false);
}
#pragma endregion
private: System::Void BtnStart_Click(System::Object^ sender, System::EventArgs^ e) {
Form1^ f=gcnew Form1;
Thread^ oThread = gcnew Thread( gcnew ThreadStart( f, &Form1::ThreadMethod ) );
oThread->Start();
}
private: void ThreadMethod(/*Object^ state*/)
{
BtnStart->Text="hello";
MessageBox::Show("AAAAAA");
//this->Invoke((Action^)delegate(){BtnStart->Text = "Hello";});
}
};
}
Upvotes: 0
Views: 5082
Reputation: 942255
You managed to get rid of the runtime exception that told you that you were doing it wrong. By creating a new form object. One that isn't visible because you never called its Show() method. So you can't see the button text update either. What you want to do is update the existing form object:
System::Void BtnStart_Click(System::Object^ sender, System::EventArgs^ e) {
Thread^ oThread = gcnew Thread( gcnew ThreadStart( this, &Form1::ThreadMethod ) );
oThread->Start();
}
You got bad advice on your previous question, that syntax only works in C#. C++/CLI doesn't support anonymous delegates. You have to write it out, just like you did for the ThreadStart delegate:
void UpdateButton() {
BtnStart->Text="hello";
}
void ThreadMethod() {
this->Invoke(gcnew MethodInvoker(this, &Form1::UpdateButton));
}
Upvotes: 3