Threadübergreifende Fehlermeldung (Backroundworker aktualsiert ListBox nicht)



  • Hallo leute,

    wie ihr sicherlich aus dem Titel entnehmen könnt, erhalte ich eine Threadübergreifende Fehlermeldung.

    Ich möchte gerne eine ListBox permanent im Hintergrund aktualisieren. Neue Elemente sollen hinzugefügt werden und alte entfernt. Dabei bestimme ich die Elemente mittels eines Algorithmusses die zugleich die Elemente hinzugeüfen soll - das klappt allerdings nicht! Kann mir mal bitte jemand unter die Arme greifen? Vielen Dank.

    Mein Code:

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    			 this->button1->Enabled=false;
    			 this->button2->Enabled=true;
    			 this->toolStripStatusLabel1->Text="Active";
    			 this->toolStripProgressBar1->Value=100;
    			 this->backgroundWorker1->RunWorkerAsync();
    
    		 }
    	private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    			 this->button1->Enabled=true;
    			 this->button2->Enabled=false;
    			 this->toolStripStatusLabel1->Text="Not Active";
    			 this->toolStripProgressBar1->Value=0;
    			 this->backgroundWorker1->CancelAsync();
    		 }
    	private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
    				 BackgroundWorker^ worker = dynamic_cast <BackgroundWorker^> (sender);
    
    				 e->Result = Bluetooth(worker,e);
    		}
    
    	private: System::Void backgroundWorker1_Complete(System::Object^  sender, System::ComponentModel::RunWorkerCompletedEventArgs^  e) {
    
    		 }
    
    	long Bluetooth (BackgroundWorker^ worker, DoWorkEventArgs ^ e){
    		if (worker->CancellationPending){
    			e->Cancel=true;
    		}
    		else{
    				vector<wstring> vec;
    				int m_device_id=0;
    				int m_radio_id = 0;
    				m_bt = BluetoothFindFirstRadio(&m_bt_find_radio, &m_radio);
    				BluetoothGetRadioInfo(m_radio, &m_bt_info);
    
    				m_search_params.hRadio = m_radio;
                    ::ZeroMemory(&m_device_info, sizeof(BLUETOOTH_DEVICE_INFO));
    				m_device_info.dwSize = sizeof(BLUETOOTH_DEVICE_INFO);
    				m_bt_dev = BluetoothFindFirstDevice(&m_search_params, &m_device_info);
    
    				do{
    					wostringstream tmp;
    					++m_device_id;
    
    					//Convert Byte in String
    					for (int i = 0; i < 6; i++) {
    					  tmp << hex << m_device_info.Address.rgBytes [i];
    			    	  if (i < 5)
    						tmp << L':';
    					} 					
    					//VectorList
    					//vec.push_back(tmp.str());
    
    					listBox1->Items->Add(System::Runtime::InteropServices::Marshal::PtrToStringUni(IntPtr((void*) tmp.str().c_str())));
    					Sleep(100);
    				}while(BluetoothFindNextDevice(m_bt_dev, &m_device_info));
    				BluetoothFindDeviceClose(m_bt_dev);
    				BluetoothFindRadioClose(m_bt);
    
    				long n=0;
    				return n;
    		}
    	}
    

    Schöne Grüße



  • Auf Oberflächen-Elemente darf man nur aus deim Oberflächen-Thread zugreifen!

    Wenn Du den BackgroundWorker verwendest, so kannst Du mit "Progress" machen (für einfache Zahlen) oder eben mit Invoke/BeginInvoke den Aufruf an den UI-Thread delegieren.


Anmelden zum Antworten