[C++] многопоточное программирование

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by $ereg@, 12 Aug 2012.

  1. $ereg@

    $ereg@ Elder - Старейшина

    Joined:
    21 Aug 2008
    Messages:
    91
    Likes Received:
    4
    Reputations:
    0
    Подскажите, из потока нельзя обращаться к элементам формы ? Я хотел чтоб поток мне на кнопку тыкнул, но любое обращение к элементам формы это ошибка (какое-то исключение). Как мне быть ?

    У меня основная сложность в том, что функция потока может быть бесконечной, а может и завершиться сама собой. Вот нужно чтоб она сообщила как-то об этом элементам формы. Например на кнопку нажала на форме или какой-то текс в текстбокс вывела.
    Простой MessageBox::Show(); не пойдёт.

    среда: Visual Studio 2010 C++

    Code:
    System::Threading::Thread^ thread1;
    
    private: void func() // функция
    {
               // тут код функции
    }
    
    private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e) 
         {      // запускаю поток нажатием кнопки
    
                thread1 =gcnew System::Threading::Thread(gcnew    System::Threading::ThreadStart(this,&Form1::func));
                thread1->Start();
    
         }
    
    private: System::Void button5_Click(System::Object^  sender, System::EventArgs^  e) 
         {  //вот так останавливаю
    
                 if(thread1!=nullptr && thread1->IsAlive)
                 thread1->Abort();
    
         }
    
     
  2. VY_CMa

    VY_CMa Green member

    Joined:
    6 Jan 2012
    Messages:
    917
    Likes Received:
    492
    Reputations:
    724
    "Потокобезопасность" в гугл
     
    _________________________
    1 person likes this.
  3. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    Какое? TheExceptionStatusBoltBro?

    узнать, что за исклчение и посмотреть, о чем оно говорит.
     
    1 person likes this.
  4. $ereg@

    $ereg@ Elder - Старейшина

    Joined:
    21 Aug 2008
    Messages:
    91
    Likes Received:
    4
    Reputations:
    0
    Необработанное исключение типа "System.InvalidOperationException" произошло в System.Windows.Forms.dll

    Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'textBox1' не из того потока, в котором он был создан.


    т.е. это тупо невозможно чтоли ?( печалька(
     
    #4 $ereg@, 12 Aug 2012
    Last edited: 12 Aug 2012
  5. VY_CMa

    VY_CMa Green member

    Joined:
    6 Jan 2012
    Messages:
    917
    Likes Received:
    492
    Reputations:
    724
    Ты второй пост читал? Нужна синхронизация потоков, дело в том, что форма не может одновременно взаимодействовать с несколькими потоками. Для этого и нужно проверять. Не очень знаком с синтаксисом C++, но на C# это выглядит так:
    Code:
    Invoke(new MethodInvoker(() =>
                {
                   работаем с формой
                }));
    
    Хотя есть и альтернативы, делегаты например
     
    _________________________
  6. $ereg@

    $ereg@ Elder - Старейшина

    Joined:
    21 Aug 2008
    Messages:
    91
    Likes Received:
    4
    Reputations:
    0
    вроде и так нашёл решение. запускасть одну и ту же функцию в зависимости от ситуации либо в потоке, либо нет.
    но твоя информация полезна. пасиба.