Tworzę aplikację okienkową w Visual C++, chce aby po kliknięciu na odpowiedni przycisk utworzony był wątek, który wykonuje określone operacje, w skrócie wygląda to mniej więcej tak:
#pragma once
namespace Klient {
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
Thread^ watek;
protected:
private: static void ThreadProc()
{
//kod watku
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
watek = gcnew Thread( gcnew ThreadStart( &ThreadProc ) );
watek->Start();
return;
}
};
}
Problem polega na tym, że w tym rozwiązaniu w wątku nie mogę odwoływać się do komponentów znajdujących się na formatce, gdyż procedura wątku jest statyczna. Musi ona taka pozostać aby kod się kompilował. Nie wiem co z tym fantem zrobić. Czytałem na MSDN o innych sposobach programowania wielowątkowości w VC++ (MFC, CRT).
Z użyciem CRT wiązał się taki problem, że pomimo tego, że sposób ten wspiera przekazywanie argumentów do funkcji wątku (poprzez wskaźniki na void), jednak kompilator zwracał błąd podczas próby konwersji wskaźnika na formatkę (this) na typ *void, robiłem to mniej więcej tak:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
watek = _beginthread( ThreadProc, 0, (void*)this);
watek->Start();
return;
}
Oczywiście zmienna watek w tym przykładzie miała inny, odpowiedni typ. Napisałem powyżej linijkę tworzenia wątku trochę z pamięci i mogą tam być błędy, chciałem tylko przekazać idee jak to robiłem. Gdy kompilowałem kod jedynym błędem była niemożliwość konwersji trzeciego parametru procedury.
Jeżeli chodzi o MFC to nie wiem do końca jak można dołączyć tę bibliotekę do już istniejącego projektu, jestem już trochę sfrustrowany całym tym środowiskiem i obawiam się, że po dołączeniu tej oto biblioteki mój problem się nie rozwiąże z powodu kolejnych zabezpieczeń tego oto 'genialnego' kompilatora. Zdecydowałem się przedstawić sprawę tutaj, może ktoś zna bardziej przystępny sposób zrobienia tego. Proszę o rady.