c++ WindowsForms, BackgroundWorker, ProgressChange.

0

W celu uaktualnienia danych w elementach formy (buttony, textboxy etc.) z poziomu wątku (background worker) używam zdarzenia ProgressChanged.

Robię to w ten sposób:
W wątku (background worker) tworzę obiekt klasy zdefiniowanej przeze mnie:

CProgress^ CP_ProgChange = gcnew CProgress();

, który to obiekt będzie przechowywał dane, których chcę użyc do aktualizowania elementów formy (j.w.)

przypisuję odpowiednie wartości:

CP_ProgChange->SetValue(S_RecvBuf);

nastepnie poslugujac sie metoda ReportProgress(...) przekazuje je do funkcji obslugi zdarzenia:

LoopThread->ReportProgress(10, CP_ProgChange);

W ktorej to funkcji tworzę nowy obiekt klasy CProgress, któremu przypisuję "wartość" przekazanego obiektu:

CProgress^ CP_ProgChange = static_cast <CProgress^> (e->UserState) // !!!!!;

i aktualizuję:

this->tBox_Recv->Text = CP_ProgChange->S_RecvBuff;

W związku z powyższym:

  1. Czy ten sposób postępowanie jest prawidłowy ? (najwięcej watpliwosci budzi u mnie linijka oznaczona wykrzyknikami)
  2. Czy istnieje jakiś sposób, aby odwoływać się do elementów przekazanego obiektu bez konieczności jego kopiowania ?
0

Nie widzę tu ani tworzenia nowego obiektu, ani kopiowania niczego. Obiekt cały czas jest ten sam, po prostu w kilku miejscach odwołujesz się do niego.

0

Funkcja obsługi zdarzenia (o ile nazywam to poprawnie) wygląda tak:

private: System::Void LoopThread_ProgressChanged(System::Object^  sender, System::ComponentModel::ProgressChangedEventArgs^  e) 
		{
			CProgress^ CP_ProgChange = static_cast <CProgress^> (e->UserState);

			this->tBox_Recv->Text = CP_ProgChange->Get_Recv();
			
		}

W wątku natomiast tworzę najpierw obiekt:

CProgress^ CP_ProgChange = gcnew CProgress();

i wywołuję metodę:

LoopThread->ReportProgress(10, CP_ProgChange);

I jak dla mnie, to to są dwa zupełnie różne obiekty, po prostu mają identyczną nazwę.

I cała moja zagwozdka polega na tym, jak się do tego przekazywanego obiektu dobrać, bez wykonywania tego absurdalnego rzutowania.

1
CProgress^ CP_ProgChange = static_cast <CProgress^> (e->UserState) // !!!!!;

tu raczej dałbym safe_cast, który jest tym samym co rzutowanie w C#, a mówimy przecież o bibliotece która powstała dla C#.

auto CP_ProgChange = safe_cast<CProgress^>(e->UserState);
  1. Czy istnieje jakiś sposób, aby odwoływać się do elementów przekazanego obiektu bez konieczności jego kopiowania

Nie ma kopiowania, ^ to rodzaj wskaźnika, tak jak *, więc kopiowany jest tylko wskaźnik (zwany uchwytem).

?
Nie stawiamy spacji przed znakiem zapytania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1