CreateThread
внутри формы Form. CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ClientHandler_second, NULL, NULL, NULL);
void ClientHandler_second() { ... }
#include <Windows.h>
DWORD WINAPI ThreadProc(LPVOID param); // строчка необходима, чтобы весь код выше реализации функции её видел
public ref class Form1 : System::Windows::Forms::Form {
System::Windows::Forms::Button^ button1;
System::Windows::Forms::Label^ label1;
void InitializeComponent() {
this->button1 = gcnew System::Windows::Forms::Button();
this->label1 = gcnew System::Windows::Forms::Label();
this->SuspendLayout();
this->button1->Location = System::Drawing::Point(205, 95);
this->button1->Name = "button1";
this->button1->Size = System::Drawing::Size(75, 23);
this->button1->TabIndex = 0;
this->button1->Text = "button1";
this->button1->UseVisualStyleBackColor = true;
this->label1->AutoSize = true;
this->label1->Location = System::Drawing::Point(218, 153);
this->label1->Name = "label1";
this->label1->Size = System::Drawing::Size(44, 16);
this->label1->TabIndex = 1;
this->label1->Text = "label1";
this->AutoScaleDimensions = System::Drawing::SizeF(8.0, 16.0);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(485, 292);
this->Controls->Add(this->label1);
this->Controls->Add(this->button1);
this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;
this->MaximizeBox = false;
this->Name = "Form1";
this->Text = "Form1";
this->ResumeLayout(false);
this->PerformLayout();
}
public:
static Form1^ myform;
Form1() {
InitializeComponent();
myform = this;
button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
}
void SetLabel(System::Int32 i) {
label1->Text = i.ToString();
}
private:
void button1_Click(System::Object^ sender, System::EventArgs^ e) {
::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, NULL, 0, NULL);
}
};
DWORD WINAPI ThreadProc(LPVOID param) {
for (int i = 1; i <= 5; i++) {
::Sleep(1000);
// Invoke вызывает указанный метод в потоке окна. MS не обещает синхронизацию
// потоков для gui-кода. Если не использовать данный метод, то в худшем случае приложение
// упадёт внутри небезопасных библиотек
// то есть никаких нормальных исключений не будет. Только хардкорный SEH.
Form1::myform->Invoke(gcnew System::Action<System::Int32>(Form1::myform, &Form1::SetLabel), i);
}
return 0;
}
int main(array<System::String^>^ args) {
System::Windows::Forms::Application::EnableVisualStyles();
System::Windows::Forms::Application::SetCompatibleTextRenderingDefault(false);
System::Windows::Forms::Application::Run(gcnew Form1());
return 0;
}
DWORD WINAPI ThreadProc( LPVOID lpParameter );