Показать сообщение отдельно
Старый 26.02.2013, 18:20   #7
ІГРОГРАЙКО
ПроЭктировщик
 
Аватар для ІГРОГРАЙКО
 
Регистрация: 20.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений
(для 24 пользователей)
Ответ: Доступ к GUI с иного потока

Спасибо большое за розяснения.
У меня было времени в обрез потому, я все переделал на BackgroundWorker...

Вот пример:
private: System::ComponentModel::BackgroundWorker^  backgroundWorker;
FileBase^ fileBase;

...

	private: System::Void buttonStart_Click(System::Object^  sender, System::EventArgs^  e) {
				buttonStart->Enabled = false;
				buttonCancel->Enabled = true;
				resultView->Rows->Clear();
				array<String^>^ tmp = gcnew array<String^>(directoryList->Items->Count);
				directoryList->Items->CopyTo(tmp,0);
				fileBase = gcnew FileBase(tmp, checkboxSearchSubdir->Checked);
				progressBar->Value = 0;
				backgroundWorker->RunWorkerAsync();
			 }

	private: System::Void buttonCancel_Click(System::Object^  sender, System::EventArgs^  e) {
				backgroundWorker->CancelAsync();
				buttonCancel->Enabled = false;
				buttonStart->Enabled = true;
				progressBar->Value = 0;
			 }

	private: System::Void backgroundWorker_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
				int counter = 0;
				int percentsComplited = 0;
				for each(KeyValuePair<String^,Int64> iCandidate in fileBase->candidates)
				{
					if (backgroundWorker->CancellationPending)
					{
						return;
					}

					counter++;
					percentsComplited = (counter * 100)/fileBase->candidates->Count;
					if (fileBase->IsDuplicate(iCandidate))
						backgroundWorker->ReportProgress(percentsComplited,iCandidate.Key + "*" + iCandidate.Value.ToString());
					else
						backgroundWorker->ReportProgress(percentsComplited,"");
				}
			 }

	private: System::Void backgroundWorker_ProgressChanged(System::Object^  sender, System::ComponentModel::ProgressChangedEventArgs^  e) {
				 if(e->UserState != "")
				 {
					 array<String^>^ cellValue = e->UserState->ToString()->Split('*');
					resultView->Rows->Add(cellValue[0], cellValue[1]);
				 }
				 progressBar->Value = e->ProgressPercentage;
			 }

	private: System::Void backgroundWorker_RunWorkerCompleted(System::Object^  sender, System::ComponentModel::RunWorkerCompletedEventArgs^  e) {
				buttonCancel->Enabled = false;
				buttonStart->Enabled = true;
			 }
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
(Offline)
 
Ответить с цитированием