0

Bluetoothデバイスをスキャンするための小さなアルゴリズムを作成し、リストボックスに追加しました。しかし、エラーが発生します:クロススレッド例外。

私が欲しいのは、リストボックスを中断することなく継続的に更新することですが、追加後のsleep()は問題ありません。

昨日からBackroundworkerで試してみましたが、機能せず、追加中にエラーが発生します。誰かにアイデアがあります。私はデリゲートについて何か読んだことがありますが、誰かがそれについての手がかりを持っていますか?

ここに私のコード:

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;
    }
}
4

2 に答える 2

1

これは WPF ですか、それとも WinForms ですか? WPF では、UI スレッドからのみコントロールにアクセスできます。他のスレッドからコントロールにアクセスするには、DispatcherObject.Dispatcher.Invokeまたはコントロールの同様のメソッドのいずれかを呼び出します (すべてのコントロールは DispatcherObject から継承されます)。

WinFormsにも似たようなものがあると確信しています。

于 2012-12-30T15:17:52.917 に答える
0

偶然見つけたので、解決策を共有したいと思いました。:-)

コンストラクターで、CheckForIllegalCrossThreadCalls=false; をプログラムしました。それは私の問題を解決しました:-DIはそれが最善の方法ではないと思いますが、最初はリストボックスを永久に更新しても問題ありません。

于 2012-12-30T15:35:02.130 に答える